GitHub-Pull-Anfrage mit Commits, die sich bereits im Zielzweig befinden


136

Ich versuche, eine Pull-Anfrage auf GitHub an einen Zweig zu überprüfen, der kein Master ist. Der Zielzweig befand sich hinter master, und in der Pull-Anforderung wurden Commits vom Master angezeigt. Daher habe ich master zusammengeführt und an GitHub gesendet, aber die Commits und Unterschiede für sie werden nach dem Aktualisieren weiterhin in der Pull-Anforderung angezeigt. Ich habe doppelt überprüft, ob der Zweig auf GitHub die Commits vom Master hat. Warum erscheinen sie immer noch in der Pull-Anfrage?

Ich habe die Pull-Anforderung auch lokal ausgecheckt und sie zeigt nur die nicht zusammengeführten Commits an.


Beeinflusst dies das Verhalten beim Zusammenführen der PR?
Nathan Hinchey

Nein, nur der Unterschied zu Github.
Lobati

Weiß jemand, ob selbst gehostetes Gitlab das gleiche Verhalten hat?
Jeff Welling

2
Ich schlage vor, dass wir uns alle an GitHub wenden, um unser Interesse an einer Änderung dieses Verhaltens auszudrücken ( support.github.com/contact ). Wenn sie nichts von uns hören, werden sie nicht wissen, wie wichtig dies ist und es wird für immer so sein.
steinybot

Antworten:


106

Es sieht so aus, als würde die Pull-Anfrage Änderungen am Zielzweig nicht nachverfolgen (ich habe den GitHub-Support kontaktiert und am 18. November 2014 eine Antwort erhalten, dass dies beabsichtigt ist).

Sie können jedoch die aktualisierten Änderungen anzeigen, indem Sie folgende Schritte ausführen:

http://githuburl/org/repo/compare/targetbranch...currentbranch

Ersetzen Sie githuburl, org, repo, targetbranch, und je currentbranchnach Bedarf.

Oder wie Hexsprite in seiner Antwort hervorhob, können Sie die Aktualisierung auch erzwingen, indem Sie Editauf die PR klicken und die Basis vorübergehend in einen anderen Zweig und wieder zurück ändern. Dies erzeugt die Warnung:

Sind Sie sicher, dass Sie die Basis ändern möchten?

Einige Commits aus dem alten Basiszweig werden möglicherweise aus der Zeitleiste entfernt, und alte Überprüfungskommentare sind möglicherweise veraltet.

Und hinterlässt zwei Protokolleinträge in der PR:

Geben Sie hier die Bildbeschreibung ein


4
Ja, ich habe vor einiger Zeit den Support kontaktiert und die gleiche Antwort erhalten. Sie optimieren nicht für diese Situation. Es ist ein bisschen frustrierend. Unsere Art, dies zu umgehen, besteht darin, einfach nach oben zu drücken und zu drücken oder den Zug zu schließen und einen neuen zu erstellen.
Lobati

4
Diese Antwort behebt das Problem nicht, sondern ermöglicht dem Benutzer lediglich, den wahren Unterschied zu erkennen.
FearlessFuture

4
Die Frage war "Warum erscheinen sie immer noch in der Pull-Anfrage?". Es beantwortet diese Frage.
Adam Millerchip

3
Schauen Sie sich meinen Kommentar für eine gute Problemumgehung an. Sie können einfach die PR-Bearbeitungstaste verwenden, um zu einem anderen Zweig und dann zurück zum ursprünglichen Basiszweig zu wechseln, und der Diff wird neu berechnet.
Hexsprite

11
Gibt es eine Dear-Github- Anfrage, um dies zu ändern?
Vossad01

86

Hier ist eine gute Problemumgehung. Verwenden Sie die EditSchaltfläche beim Anzeigen der PR in GitHub, um den Basiszweig in einen anderen als zu ändern master. Schalten Sie es dann wieder auf masterund es werden nun nur die Änderungen der letzten Commits korrekt angezeigt.


4
Ich bin überrascht, dass immer mehr Menschen diese Lösung nicht anerkennen. Ich vermute, dass die ursprüngliche veraltete Pull-Anfrage in Ordnung wäre, aber ich mochte nicht, dass der GitHub alle veralteten Dateien anzeigt, also habe ich diese verwendet und beide behalten den Kommentar bei und zeigen nur die tatsächlichen Änderungen, die zusammengeführt werden sollen . Vielen Dank!
Taranaki

1
Hat bei mir nicht funktioniert.
Shashank

Verdammt das funktioniert!
Anurag Hazra

Drei Jahre später ist dies immer noch eine großartige Lösung. Und schau mal, jemand hat vor ein paar Stunden auch einen Kommentar abgegeben ^^^
Ricardo Saporta

32

Zusammenfassend lässt sich sagen, dass GitHub den Festschreibungsverlauf in Pull-Anforderungen nicht automatisch neu festlegt. Die einfachsten Lösungen sind:

Lösung 1: Rebase

Angenommen, Sie möchten zusammenführen masteraus feature-01:

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force

Wenn Sie an einer Gabel arbeiten, müssen Sie diese möglicherweise originoben durch ersetzen upstream. Siehe Wie aktualisiere ich ein gegabeltes GitHub-Repository? Weitere Informationen zum Verfolgen von Remote-Zweigen des ursprünglichen Repositorys.

Lösung 2: Erstellen Sie eine neue Pull-Anforderung

Angenommen, Sie möchten das Intro zusammenführen masteraus feature-01:

git checkout feature-01
git checkout -b feature-01-rebased
git push -u origin feature-01-rebased

Öffnen Sie nun eine Pull-Anfrage für feature-01-rebasedund schließen Sie die für feature-01.


4
Eine Rebase ändert die Commit-Hashes. Würde dies dazu führen, dass die vorhandenen Überprüfungskommentare verworfen werden?
Haridsv

@haridsv Wahrscheinlich ja.
Mateusz Piotrowski

Was sollten Sie beim Push-Force beachten?
Paul Bendevis

1
@haridsv das ist nicht meine Erfahrung. Ich lehne während der Überprüfung häufig ab und Kommentare gehen nicht verloren. Obwohl ich die Geschichte der Änderungen in der PR
Joel

@JoelBerkeley Ich habe in der Zwischenzeit einige Rezensionen erlebt, in denen der Autor die Basis neu formuliert hat und festgestellt hat, dass die Kommentare aktuell sind. Wir verlieren jedoch die Möglichkeit, schrittweise zu überprüfen, und für große Bewertungen ist dies eine enorme Strafe für die Prüfer. Wir haben jetzt ein paar Richtlinien für unsere PRs, und eine davon ist, nach dem Öffnen der Überprüfung niemals eine Neufestlegung vorzunehmen (es sei denn, man ist sich sicher, dass noch niemand mit der Überprüfung begonnen hat). Das Zusammenführen ist in Ordnung, aber unsere Richtlinie lautet, die Zusammenführungsänderung nicht mit anderen Änderungen als den Konfliktlösungen zu mischen.
Haridsv

16

Sie müssen Ihrer ~/.gitconfigDatei Folgendes hinzufügen :

[rebase]
    autosquash = true

Dies entspricht automatisch dem, was diese Antwort zeigt.

Ich habe das von hier bekommen .


2
Verdammt, ich habe versehentlich auf "Abstimmen" geklickt. Diese Antwort hat mir geholfen. lass es mich bitte ändern.
Hector

@ Hosein Mach es. Sie sollten es jetzt tun können.
Mateusz Piotrowski

1
Ich denke, dies sollte entweder die akzeptierte Antwort sein oder in der akzeptierten Antwort enthalten sein. Dies erreicht das gesuchte Ergebnis!
Ronald Rey

1
@RonaldRey Git Rebasing ist keine universelle Lösung, da der Verlauf bearbeitet werden muss. Wenn jeder an privaten Gabeln arbeitet, die niemals von anderen geklont werden, ist dies in Ordnung. Sobald jedoch jemand Ihr Repository klont und Sie den Verlauf bearbeiten, erhalten Sie unterschiedliche Verlaufsdaten.
Adam Millerchip

14

Für alle anderen, die darauf stoßen und durch das Verhalten von GitHub Pull Request verwirrt sind, besteht die Hauptursache darin, dass ein PR ein Unterschied zwischen der Spitze des Quellzweigs und dem gemeinsamen Vorfahren des Quellzweigs und des Zielzweigs ist. Es werden daher alle Änderungen im Quellzweig bis zum gemeinsamen Vorfahren angezeigt und es werden keine Änderungen berücksichtigt, die möglicherweise im Zielzweig aufgetreten sind.

Weitere Informationen finden Sie hier: https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

Gemeinsame Unterschiede auf Ahnenbasis scheinen gefährlich zu sein. Ich wünschte, GitHub hätte die Option, eine standardmäßigere 3-Wege-PR auf Merge-Basis zu erstellen.


1
Der Grund, den Sie erwähnt haben, scheint richtig zu sein, aber ich bin verwirrt, weil ich im Allgemeinen, wenn der Master aktualisiert wird, die Änderungen in meinem Zweig wieder zusammenführe ... git checkout my-branch -> git merge master . Die Pull-Anfrage wird sofort aktualisiert. Wird der gemeinsame Vorfahr auch aktualisiert?
G. Ein

2
Dieses Verhalten scheint aufzutreten, wenn Rebase statt Merge durchgeführt wird
G.One

1
@ G.One, sehr späte Antwort, aber ja - wenn Sie von diesem Hauptzweig zu Ihrem Quellzweig zusammenführen, haben Sie per Definition den gemeinsamen Vorfahren aktualisiert. Es ist das Commit für den Master, aus dem Sie zusammengeführt haben.
David K. Hess

13

Eine Möglichkeit, dies zu beheben, besteht darin, git rebase targetbranchin dieser PR. Dann git push --force targetbranch, dann zeigt Github die richtigen Commits und Diff. Seien Sie vorsichtig, wenn Sie nicht wissen, was Sie tun. Vielleicht checken Sie zuerst einen Testzweig aus git diff targetbranch, um die Rebase durchzuführen , und stellen dann sicher, dass er immer noch Ihren Wünschen entspricht .


10

Dies geschieht mit GitHub, wenn Sie Squash-Commits aus dem Zielzweig zusammenführen.

Ich hatte Squash und Merge mit Github als Standard-Merge-Strategie verwendet, einschließlich Merges aus dem Zielzweig. Dies führt ein neues Commit ein und GitHub erkennt nicht, dass dieses gequetschte Commit dasselbe ist wie das, das sich bereits im Master befindet (jedoch mit unterschiedlichen Hashes). Git geht richtig damit um, aber Sie sehen alle Änderungen in GitHub wieder, was es ärgerlich macht, sie zu überprüfen. Die Lösung besteht darin, diese eingeführten Upstream-Commits regelmäßig zusammenzuführen, anstatt sie zu quetschen und zusammenzuführen. Wenn Sie einen anderen Zweig als Abhängigkeit in Ihren Zweig einbinden git merge --squashund diesen einzelnen Commit zurücksetzen möchten , bevor Sie vom Master abrufen, sobald dieser andere Zweig es tatsächlich zum Master geschafft hat.

BEARBEITEN: Eine andere Lösung besteht darin, den Push neu zu starten und zu erzwingen. Saubere, aber neu geschriebene Geschichte


1
Danke @achille, das war wirklich das Problem auf meiner Seite. Nach dem Deaktivieren der Squash-Zusammenführung wird diese behoben.
Ashvin777

0

Ich bin mir über die Theorie dahinter nicht ganz sicher. Aber ich habe das mehrmals bekommen und kann es beheben, indem ich Folgendes tue.

git pull --rebase

Dadurch werden die Änderungen aus Ihrem ursprünglichen Repo-Master-Zweig abgerufen und zusammengeführt (wenn Sie darauf hinweisen).

Dann verschieben Sie Ihre Änderungen mit Nachdruck in Ihr geklontes Github-Repository (Ziel).

git push -f origin master

Dadurch wird sichergestellt, dass sich Ihr Github-Klon und das Repo Ihres Elternteils auf demselben Github-Commit-Level befinden und Sie keine unnötigen Änderungen zwischen den Zweigen sehen.


0

Probieren Sie die folgenden Befehle nacheinander aus.

git pull "latest

git reset --hard master

-1

Fail-Safe-Ansatz, wenn Sie zu besorgt sind, Dinge durcheinander zu bringen: Gehen Sie zur Datei und entfernen Sie die Änderungen manuell

git add .  && git commit -a --allow-empty-message -m '' && git reset --soft HEAD~2 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Wenn es keine Konflikte gibt, können Sie loslegen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.