Ich habe zwei Zweige devel
und next
. In der Entwicklung habe ich eine mehr oder weniger große Anzahl von Commits. Einige der Commits sind Kirsche gepflückt next
. Außerdem habe ich als nächstes einige Commits hinzugefügt, die zusammengeführt werden devel
.
Jetzt möchte ich sehen, was fehlt next
, damit ich die Änderungen im Detail testen kann, bevor ich sie anbringe next
. Meine Frage ist jetzt, wie kann ich sehen, welche Commits in, devel
aber nicht in den nächsten enthalten sind?
Antworten:
Der wenig verwendete Befehl
git cherry
zeigt Ihnen die Commits, die noch nicht ausgewählt wurden. Die Dokumentation fürgit cherry
ist hier , aber kurz gesagt, Sie sollten nur in der Lage sein:... und sehen die Ausgabe ein bisschen so:
Die Commits, mit
+
denen Sie beginnen , sind diejenigen, in die Sie sich noch nicht eingemischt habennext
. In diesem Fall hatte ich bisher nur ein Commit ausgewählt. Möglicherweise möchten Sie den-v
Parameter zumgit cherry
Befehl hinzufügen , damit auch die Betreffzeile jedes Commits ausgegeben wird.quelle
git checkout devel
, Sie können es einfach tungit cherry next devel
.-v
" ? Kirsche ohne a-v
ist wiels
ohne-la
. ; -Jcherry
, wie Sie gleichwertige Commits markieren oder ausschließen können, oder?cherry
scheint ein Sanitärbefehl zu sein, bietet aber nicht viele Optionen. Für das, was ich gerade in der Mitte bingit cherry
, erhalte ich falsch positive Ergebnisse, aber @ sehegit log --cherry-pick
schließt die zuvor ausgewählten / neu basierten Commits korrekt aus.Auch können Sie verwenden
eine schöne Liste zu bekommen , tatsächlich unterschiedliche Commits nicht zwischen den Zweigen geteilt.
Das operative Wort ist
--cherry-pick
Update Wie in einem Kommentar erwähnt, haben aktuelle Versionen von git hinzugefügt
--cherry-mark
:quelle
Sie könnten versuchen, Git-Log-Teilmengen zu erstellen:
quelle
--left-only
wäre die Verwendung besser gewesen). Dieser kann jedoch ein wenig verbessert werden, indem hinzugefügt wird--no-merges
, um Zusammenführungs-Commits wegzulassen (z. B. wenn ein Feature oder ein Hotfix-Zweig (separat) in devel und next zusammengeführt wurde). Genau genommen kann die Konfliktlösung bei Zusammenführungen natürlich zu anderen Unterschieden führen, aber das ist normalerweise nicht der Fall. Die--no-merges
Option kann sinnvollerweise auch auf die anderen Antworten angewendet werden.Wie wäre es mit
Das Ergebnis ähnelt Byrans Antwort (unterschiedliche Reihenfolge der Festschreibungen), aber unsere beiden Antworten führen zu Festschreibungen, die zwischen den Zweigen unterschiedlich sind, und zeigen nur, was sich in einem Zweig und nicht in dem anderen befindet.
quelle
git log next..
Um die Liste der Commits zu erhalten, die nicht in den Release-Zweig (weiter) integriert wurden, können Sie Folgendes verwenden:
Überprüfen Sie git-rev-list für weitere Informationen.
quelle
next...devel
@ Mark Longair hat es in seiner Antwort hier festgehalten , aber ich möchte einen zusätzlichen Einblick hinzufügen.
Die Beantwortung der Frage, wie eine große Pull-Anforderung (PR) aufgelöst werden kann, insbesondere wenn Ihre Commits gequetscht werden, ist aufgrund einer oder mehrerer Zusammenführungen von Master in Ihrer feature_branch unpraktisch
Meine Situation:
Ich habe
feature_branch
mit 30 Commits ein großes Ergebnis erzielt und eine Pull-Anfrage (PR) auf GitHub geöffnet, um sie zusammenzuführenmaster
. Branchmaster
wechselte eine Tonne unter mir und erhielt 200 Commits, die ichfeature_branch
nicht hatte. Um Konflikte zu lösen, die ich gemacht habe,git checkout feature_branch
undgit merge master
um diemaster
Änderungen in meine zu integrierenfeature_branch
. Ich habe mich dafür entschieden,merge
anstattrebase
auf neuesten Master , damit ich zu der Lösung von Konflikten nur ein einziges Mal statt potenziell 30 Mal (einmal für jedes meiner Commits) haben würde. Ich wollte meine 30 Commits nicht zuerst in 1 zerquetschen und dann auf die neuesten zurücksetzenmaster
weil das GitHub Review Kommentarverlauf in der PR wegwischen könnte. Also habe ich Master in meinem Feature-Zweig zusammengeführt und Konflikte 1 Mal gelöst. Alles war gut. Meine PR war jedoch zu groß, als dass meine Kollegen sie überprüfen könnten. Ich musste es aufteilen. Ich ging meine 30 Commits zu quetschen und OH NEIN! WO SIND SIE? SIE SIND ALLE MIT DENmaster
200 letzten Commits vermischt , weil ich michmaster
in meine verschmolzen habefeature_branch
! WAS MACHE ICH?git cherry
Verwendung für den Fall, dass Sie versuchen möchten,git cherry-pick
einzelne Commits durchzuführen:git cherry
zur Rettung!Um alle Commits zu sehen, die in,
feature_branch
aber NICHT in sind,master
kann ich Folgendes tun:OR, kann ich Festschreibungen von jeder Filiale überprüfen , ohne sicherzustellen , ich bin auf dem
feature_branch
ersten , indem Siegit cherry [upstream_branch] [feature_branch]
, wie diese. Auch hier wird überprüft, welche Commits enthaltenfeature_branch
sind, aber NICHTupstream_branch
(master
in diesem Fall):Beim Hinzufügen werden
-v
auch die Betreffzeilen der Festschreibungsnachricht angezeigt:Das Piping zu "word count" "-lines" (
wc -l
) zählt, wie viele Commits es gibt:Sie können diese Anzahl mit der in Ihrem GithHub PR angezeigten Commit-Nummer vergleichen, um besser zu wissen, dass sie
git cherry
wirklich funktioniert. Sie können die Git-Hashes auch einzeln vergleichen und sehen, ob sie zwischengit cherry
und GitHub übereinstimmen . Bitte beachte , dassgit cherry
alle Merge Commits nicht zählen, wo Sie verschmolzenmaster
zufeature_branch
, aber GitHub WILL. Wenn Sie also eine kleine Diskrepanz in der Anzahl sehen, durchsuchen Sie die GitHub PR-Commit-Seite nach dem Wort "Merge" und Sie werden wahrscheinlich sehen, dass dies der Schuldige ist, der nicht in angezeigt wirdgit cherry
. Beispiel: Ein Commit mit dem Titel "Zweig 'Master' in feature_branch zusammenführen" wird in GitHub PR angezeigt, jedoch nicht, wenn Sie ausgeführt werdengit cherry master feature_branch
. Das ist in Ordnung und wird erwartet.Jetzt habe ich also die Möglichkeit herauszufinden, welche Unterschiede ich möglicherweise in einem neuen Feature-Zweig auswählen möchte, um diesen Unterschied aufzuteilen: Ich kann sie
git cherry master feature_branch
lokal verwenden oder mir die Commits in GitHub PR ansehen.Wie Quetschen helfen könnte - wenn wir nur quetschen könnten:
Eine Alternative, um meinen großen Unterschied aufzuteilen, besteht darin, alle 30 meiner Commits in einen zu zerquetschen, diesen auf einen neuen Feature-Zweig zu patchen, den Patch-Commit sanft zurückzusetzen und dann
git gui
Teile Datei für Datei, Block für Block oder hinzuzufügen Zeile für Zeile. Sobald ich eine Unterfunktion erhalten habe, kann ich festschreiben, was ich hinzugefügt habe, und dann einen neuen Zweig auschecken, weitere hinzufügen, festschreiben, eine neue Verzweigung auschecken usw., bis meine große Funktion in mehrere Unterfunktionen aufgeteilt ist . Das Problem ist , dass mein 30 Commits mit den anderen 200 Commits von anderen Menschen verwirbelt werden aufgrund meinergit merge master
in meinerfeature_branch
, so Rebasieren daher nicht praktikabel ist, wie ich durch 230 Commits Nachbestellung sichten müss und zerquetschen mein 30 Commits.So verwenden Sie eine Patch-Datei als viel einfacheren Ersatz für das Quetschen:
Eine Problemumgehung besteht darin, einfach eine Patch-Datei zu erhalten, die ein "Squash-Äquivalent" aller 30 meiner Commits enthält, sie auf einen neuen
master
Zweig (einen neuen Unter-Feature-Zweig) zu patchen und von dort aus wie folgt zu arbeiten:Jetzt habe ich meinen 30-Commit-Patch alle lokal angewendet, aber nicht bereitgestellt und nicht festgeschrieben.
Verwenden Sie jetzt
git gui
, um Dateien, Chunks und / oder Zeilen hinzuzufügen und Ihre große PR oder "diff" aufzubrechen:Beachten Sie
git gui
, dass Sie es problemlos in Ubuntu installieren können , wenn Sie es nicht habensudo apt install git-gui
.Ich kann jetzt
git gui
Dateien, Blöcke und / oder Zeilen ausführen und hinzufügen (indem ich mit der rechten Maustaste in das Git-GUI-Programm klicke) und den Zweig mit 30 Festschreibungsfunktionen wie oben beschrieben in Unterzweige aufteilen, wiederholt hinzufügen, festschreiben und dann gabeln Ein neuer Feature-Zweig und das Wiederholen dieses Zyklus, bis alle Änderungen zu einem Unter-Feature-Zweig hinzugefügt wurden und mein 30-Commit-Feature erfolgreich in 3 oder 4 Unter-Features aufgeteilt wurde. Ich kann jetzt für jede dieser Unterfunktionen eine separate PR eröffnen, die für mein Team leichter zu überprüfen ist.Verweise:
quelle