Ich habe einen Git-Zweig (zum Beispiel die Hauptlinie) und möchte in einem anderen Entwicklungszweig zusammengeführt werden. Oder tue ich?
Um zu entscheiden, ob ich diesen Zweig wirklich zusammenführen möchte, möchte ich eine Vorschau der Zusammenführung sehen. Vorzugsweise mit der Möglichkeit, die Liste der angewendeten Commits anzuzeigen.
Bisher ist das Beste, was ich mir einfallen lassen kann merge --no-ff --no-commit
, und dann diff HEAD
.
git merge
undgit reset --keep HEAD@{1}
wenn mir das Ergebnis nicht gefällt.git reset --keep HEAD@{1}
zurückgegebenfatal: Cannot do a keep reset in the middle of a merge.
Hilfe?--preview
bei git-merge keine Option?Antworten:
Ich habe festgestellt, dass die für mich am besten geeignete Lösung darin besteht , die Zusammenführung einfach durchzuführen und abzubrechen, wenn Konflikte auftreten . Diese spezielle Syntax fühlt sich für mich sauber und einfach an. Dies ist Strategie 2 unten.
Wenn Sie jedoch sicherstellen möchten, dass Sie Ihren aktuellen Zweig nicht durcheinander bringen oder einfach nicht bereit sind, unabhängig vom Vorhandensein von Konflikten zusammenzuführen, erstellen Sie einfach einen neuen Unterzweig daraus und führen Sie Folgendes zusammen:
Strategie 1: Der sichere Weg - eine temporäre Niederlassung zusammenführen:
Auf diese Weise können Sie den temporären Zweig einfach wegwerfen, wenn Sie nur die Konflikte sehen möchten. Sie müssen sich nicht die Mühe machen, die Zusammenführung "abzubrechen", und Sie können zu Ihrer Arbeit zurückkehren. Überprüfen Sie einfach "mybranch" erneut, und Sie haben keinen zusammengeführten Code oder Zusammenführungskonflikte in Ihrer Branche.
Dies ist im Grunde ein Trockenlauf.
Strategie 2: Wenn Sie definitiv zusammenführen möchten, aber nur, wenn es keine Konflikte gibt
Wenn git Konflikte meldet (und NUR WENN ES Konflikte gibt), können Sie Folgendes tun:
Wenn die Zusammenführung erfolgreich ist, können Sie sie nicht abbrechen (nur zurücksetzen).
Wenn Sie nicht zum Zusammenführen bereit sind, verwenden Sie den oben beschriebenen sichereren Weg.
[EDIT: 2016-Nov - Ich habe Strategie 1 gegen 2 getauscht, weil es so scheint, als ob die meisten Leute nach "dem sicheren Weg" suchen. Strategie 2 ist jetzt eher eine Anmerkung, dass Sie die Zusammenführung einfach abbrechen können, wenn die Zusammenführung Konflikte aufweist, mit denen Sie nicht fertig werden können. Denken Sie daran, wenn Sie Kommentare lesen!]
quelle
git merge --no-ff --no-commit
wenn Sie die Änderungen nicht direkt übernehmen möchten. Dies beseitigt die "Notwendigkeit" für einen anderen Zweig und macht es ein kleines bisschen einfacher, die Änderungen zu überprüfen, imo.git merge --no-ff --no-commit
? Ich denke, du kannst danach noch eine machengit merge --abort
, wenn dir nicht gefällt, was du siehst? Auch wenn die Zusammenführung keine Konflikte erzeugt?git reset --hard HEAD
abgebrochen werden soll,git checkout <different branch name>
und checken Sie dann eine andere Verzweigung aus und löschen Sie die temporäre Verzweigunggit delete -b <name of temporary branch>
.git log ..otherbranch
git diff ...otherbranch
gitk ...otherbranch
Leere Zeichenfolge impliziert
HEAD
, deshalb nur..otherbranch
stattHEAD..otherbranch
.Die zwei gegen drei Punkte haben für diff eine etwas andere Bedeutung als für die Befehle, die Revisionen auflisten (log, gitk usw.). Für log und andere bedeutet zwei Punkte (
a..b
) alles, was drin ist,b
aber nicht,a
und drei Punkte (a...b
) bedeuten alles, was nur in einem vona
oder istb
. Aber diff arbeitet mit zwei Revisionen und dort ist der einfachere Fall, der durch zwei Punkte (a..b
) dargestellt wird, ein einfacher Unterschied vona
bisb
und drei Punkte (a...b
) bedeuten den Unterschied zwischen dem gemeinsamen Vorfahren undb
(git diff $(git merge-base a b)..b
).quelle
git checkout master
bevor ich es versuchte. Ich fragte mich, warum es hieß, alle meine Änderungen würdengit show ..otherbranch
zeigt eine Liste der Änderungen und Unterschiede an, die in den aktuellen Zweig eingefügt werden.Wenn Sie wie ich sind, suchen Sie nach einem Äquivalent zu
svn update -n
. Das Folgende scheint den Trick zu tun. Beachten Sie, dass Sie zuerst einen Schritt machen müssen,git fetch
damit Ihr lokales Repo über die entsprechenden Updates verfügt, mit denen Sie vergleichen können.oder wenn Sie einen Unterschied von Ihrem Kopf zur Fernbedienung wünschen:
IMO ist diese Lösung viel einfacher und weniger fehleranfällig (und daher viel weniger riskant) als die Top-Lösung, die "Zusammenführen, dann Abbrechen" vorschlägt.
quelle
$ git checkout target-branch
und dann$ git diff --name-status ...branch-to-be-merged
(drei Punkte sind wichtig, alsoDie meisten Antworten hier erfordern entweder ein sauberes Arbeitsverzeichnis und mehrere interaktive Schritte (schlecht für die Skripterstellung) oder funktionieren nicht in allen Fällen, z gleich.
Um wirklich zu sehen, was sich in der
master
Branche ändern würde, wenn Sie sichdevelop
jetzt in die Branche einfügen würden :- https://git.seveas.net/previewing-a-merge-result.html
(Danke an David Normington für den Link)
PS:
Wenn Sie Zusammenführungskonflikte erhalten, werden diese mit den üblichen Konfliktmarkierungen in der Ausgabe angezeigt, z.
User @dreftymac macht einen guten Punkt: Dies macht es für die Skripterstellung ungeeignet, da Sie dies nicht einfach aus dem Statuscode abrufen können. Die Konfliktmarkierungen können je nach den Umständen sehr unterschiedlich sein (gelöscht oder geändert usw.), was es auch schwierig macht, sie zu erfassen. In acht nehmen.
quelle
true
wenn Konflikte vorliegen undfalse
wenn keine Konflikte vorliegen (z. B. ein boolescher Wert, für den kein "Augapfel" -Test oder menschliches Eingreifen erforderlich ist)?git merge-tree ... | grep -q '^[a-z].*in both$' && echo conflict || echo safe to merge
aber es ist finnicky; Ich vergesse wahrscheinlich einen Fall. Vielleicht möchten Sie stattdessen nach Konfliktmarkierungen suchen? zB fängt dies wahrscheinlich nicht "ihre gelöschten, unsere geänderten" Stilkonflikte auf. (Ich habe gerade überprüft und das zeigt nicht einmal Konfliktmarkierungen, so dass Sie eine sorgfältige Regex benötigen, um hier sicher zu sein)less -R
diese Option , um farbige Ausgaben zu verarbeiten, ohne Ihre Konfiguration zu ändern.Wenn Sie die Änderungen bereits abgerufen haben, ist mein Favorit:
Das braucht Git 1.7.x, glaube ich allerdings. Die
@{u}
Notation ist eine "Abkürzung" für den Upstream-Zweig, daher ist sie etwas vielseitiger alsgit log ...origin/master
.Hinweis: Wenn Sie zsh und das erweiterte Glog-Ding verwenden, müssen Sie wahrscheinlich Folgendes tun:
quelle
Zusätzlich zu den vorhandenen Antworten kann ein Alias erstellt werden, um den Unterschied und / oder das Protokoll vor einer Zusammenführung anzuzeigen. Bei vielen Antworten wird das
fetch
zuerst vorgenommene Auslassen weggelassen, bevor eine Vorschau der Zusammenführung angezeigt wird. Dies ist ein Alias, der diese beiden Schritte zu einem kombiniert (Emulation von etwas ähnlichem wie mercurial'shg incoming
/outgoing
).Aufbauend auf "
git log ..otherbranch
" können Sie Folgendes hinzufügen~/.gitconfig
:Aus Gründen der Symmetrie kann der folgende Alias verwendet werden, um anzuzeigen, was festgeschrieben wird und vor dem Verschieben übertragen werden würde:
Und dann können Sie "
git incoming
" ausführen , um viele Änderungen anzuzeigen, oder "git incoming -p
", um den Patch (dh das "Diff"), "git incoming --pretty=oneline
" für eine knappe Zusammenfassung usw. anzuzeigen. Sie können dann (optional) "git pull
" ausführen tatsächlich verschmelzen. (Da Sie bereits abgerufen haben, kann die Zusammenführung direkt durchgeführt werden.)Ebenso zeigt "
git outgoing
", was gedrückt würde, wenn Sie laufen würden "git push
".quelle
git log currentbranch..otherbranch
Sie erhalten eine Liste der Commits, die bei einer Zusammenführung in den aktuellen Zweig gelangen. Die üblichen zu protokollierenden Argumente, die Details zu den Commits enthalten, geben Ihnen weitere Informationen.git diff currentbranch otherbranch
gibt Ihnen den Unterschied zwischen den beiden Commits, die eins werden. Dies wird ein Unterschied sein, der Ihnen alles gibt, was zusammengeführt wird.Würden diese helfen?
quelle
git log otherbranch..currentbranch
gibt eine Liste der Commits auf currentbranch an . Dasgit diff otherbranch currentbranch
gibt Ihnen einen Unterschied von der zu verschmelzenden Version zum aktuellen Tipp, der so nutzlos wie möglich ist, da Sie sich von der Zusammenführungsbasis zum Zusammenführungskopf unterscheiden möchten.Pull-Anfrage - Ich habe die meisten der bereits eingereichten Ideen verwendet, aber eine, die ich auch häufig verwende, ist (insbesondere wenn sie von einem anderen Entwickler stammt) eine Pull-Anfrage, die eine praktische Möglichkeit bietet, alle Änderungen in einer Zusammenführung zu überprüfen, bevor sie ausgeführt werden Ort. Ich weiß, dass GitHub kein Git ist, aber es ist sicher praktisch.
quelle
Abgesehen davon, dass die Zusammenführung tatsächlich weggeworfen wird (siehe Kasapos Antwort), scheint es keinen verlässlichen Weg zu geben, dies zu sehen.
Trotzdem ist hier eine Methode, die nur geringfügig nahe kommt:
Dies gibt einen fairen Hinweis darauf, welche Commits es in die Fusion schaffen werden. Fügen Sie hinzu, um Unterschiede zu sehen
-p
. Um die Dateinamen zu sehen, fügen Sie alle--raw
,--stat
,--name-only
,--name-status
.Das Problem mit dem
git diff TARGET_BRANCH...SOURCE_BRANCH
Ansatz (siehe Jan Hudecs Antwort) ist, dass Sie Unterschiede für Änderungen sehen, die sich bereits in Ihrem Zielzweig befinden, wenn Ihr Quellzweig Cross Merges enthält.quelle
Vielleicht kann dir das helfen? git-diff-tree - Vergleicht den Inhalt und den Modus von Blobs, die über zwei Baumobjekte gefunden wurden
quelle
Ich möchte den Befehl git merge nicht als Vorläufer für die Überprüfung widersprüchlicher Dateien verwenden. Ich möchte keine Zusammenführung durchführen, ich möchte potenzielle Probleme identifizieren, bevor ich sie zusammenführe - Probleme, die durch die automatische Zusammenführung möglicherweise vor mir verborgen werden. Die Lösung, nach der ich gesucht habe, besteht darin, wie git eine Liste von Dateien ausspuckt, die in beiden Zweigen geändert wurden und in Zukunft relativ zu einem gemeinsamen Vorfahren zusammengeführt werden. Sobald ich diese Liste habe, kann ich andere Dateivergleichstools verwenden, um die Dinge weiter zu untersuchen. Ich habe mehrmals gesucht und in einem nativen Git-Befehl immer noch nicht gefunden, was ich will.
Hier ist meine Problemumgehung, falls sie jemand anderem da draußen hilft:
In diesem Szenario habe ich einen Zweig namens QA, der seit der letzten Produktionsversion viele Änderungen aufweist. Unsere letzte Produktionsversion ist mit "15.20.1" gekennzeichnet. Ich habe einen anderen Entwicklungszweig namens new_stuff, den ich in den QA-Zweig einbinden möchte. Sowohl QA als auch new_stuff verweisen auf Commits, die (wie von gitk gemeldet) dem 15.20.1-Tag "folgen".
Hier sind einige Diskussionen, die zeigen, warum ich daran interessiert bin, auf diese spezifischen Dateien abzuzielen:
Wie kann ich Git Merge vertrauen?
/software/199780/how-far-do-you-trust-automerge
quelle