Wie zu erkennen, widersprüchlichen übertragungen von hash-beim git rebase?
Wenn ich auch eine merge-Konflikt mit git rebase
, wie kann ich das identifizieren der Ursache des Konflikts in Bezug begeht, anstatt Sie einfach Datei Unterschiede?
Ich weiß schon, wie machen die (basic -) Nutzung von git mergetool
oder git add
vor git rebase --continue
, aber manchmal sind die Unterschiede zwischen den Dateien ist einfach nicht genug: will ich sehen, der commit-log-und diff der änderung, dass nur konnte nicht angewendet werden, um die arbeiten Baum.
Habe ich gelesen in anderen Fragen, die git log --merge
zeigen würde, die Eltern-commits, wenn ich mit git merge
. Ich versuchte es trotzdem, als ich bei einem Konflikt-und habe gesagt fatal: --merge without MERGE_HEAD?
.
Wie kann ich identifizieren, die problematisch zu Begehen?
- Vergessen Sie nicht, die März 2018 Git 2.17+ Befehl
git am --show-current-patch
. Siehe meine Antwort unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort
Wenn er sagt,
Führen
Bekommen die SHA
ad1c77
des Scheiterns zu Begehen, und verwenden Sie danngit show ad1c77
haben Sie einen Blick auf es.Lange Antwort
Let ' s start mit diesem Baum:
Wenn ein rebase-Konflikt, es ist ein Konflikt zwischen
C--D
) aus der der gemeinsame Vorfahr (B
) PLUS die bereits zurückgesetzt änderungen und bereits behoben-Konflikt (E'
) versusF
)Lassen Sie uns sehen, was passiert:
Hier ist die Fehlermeldung:
Zuerst, können Sie sehen, dass es war
F
, da die commit-Nachricht angezeigt wird. Allerdings, wenn Ihre commit-Nachrichten, die alle Aussehen wie "foo", "Dokumentation" oder "einige Updates", dann ist dies nicht helfen, und Sie wirklich wollen, SHA-idad1c77
oder der Inhalt der patch.Hier ist, wie um herauszufinden, die tatsächliche Identität des
F
:Wenn es Listen der rebase-Konflikt, es wird etwas sagen wie:
Schauen Sie jetzt in
.git/rebase-apply/
, wo Sie die patch-Datei0001
:Die patch-Datei enthält die ursprünglichen commit-id
Können Sie dann sehen, dass.
Muss es einen einfacheren Weg, aber so funktioniert es.
Beachten Sie, dass die Tatsache, dass der patch fehlgeschlagen ist, kann durch einen anderen zu Begehen (wenn Sie rebasierung auf einen gemeinsamen Vorfahren von
HEAD
- und rebase-Ziel). Finden Sie, dass zu Begehen ist eher kompliziert, Sie könnten zwar versuchen, den Stellungswechsel in reverse, um es zu finden:1
von dem patch, er versucht im moment. Beachten Sie, das es nicht die führenden Nullen.head -1 .git/rebase-apply/0001 | awk '{ print $2 }'
wenn Sie wollen einfach nur das SHA und diegit show $(head -1 .git/rebase-apply/0001 | awk '{ print $2 }')
wenn Sie möchten, können Sie sofort erkennen, die zu BegehenWährend einer
git rebase
hält, um Konflikte zu lösen, wird der folgende Befehl zeigt die widersprüchliche commit (alles davon, nicht nur den Konflikt stehende Dateien), das heißt, Ihr verpflichten, die derzeit wiedergegeben/zurückgesetzt auf die neue base, unabhängig davon, wo Sie sind:Wenn Sie möchten, um zu sehen, nur die Konflikte, die für einen bestimmten Konflikt stehende Datei (die, die Sie auflösen), in-isolation:
Keine Katzen, die missbraucht wurden in der Konstruktion dieser Antwort :).
Zeigen den aktuellen/failed commit
Dies ist möglicherweise eine neue Funktion, aber
REBASE_HEAD
Ihnen Begehen, wo Sie gerade beendet wurde (z.B. wenn der Vorgang fehlgeschlagen ist, anzuwenden). Wenn Sie sehen wollen, die Begehen in full können SieAls ausführlichere alternative, die Sie verwenden können
git rebase --show-commit-patch
. Die docs sagen, Sie sind gleichwertig.Zeigen, was sich verändert, seit Sie begann Ihre Arbeit
Wenn Sie möchten, um zu sehen, was sich verändert zwischen, wo Sie sind Rebase aus und wo sind Sie rebasierung, können Sie ein diff zwischen den beiden Zweigen. Zum Beispiel, wenn Sie rebasierung von
master
auforigin/master
Sie verwenden können:Oder wenn Sie wollen, um die änderungen zu sehen, wie einzelne verpflichtet:
Wenn Sie es vorziehen, verwenden Sie die hash-oder vielleicht wieder einen Stellungswechsel, nachdem eine Weile und kann mich nicht erinnern, welche Zweige Sie sind, erneute basiszuordnung verwenden, können Sie
git status
zu sehen, die zwei Zweige. Zum Beispiel:Dann, um zu sehen, was geändert, die Sie verwenden können:
Gegeben:
und angesichts der Tatsache, dass ein merge-Konflikt versucht, F:
dann die
original-commit
Datei wird der hash-Wert von F. Dies ist "Ihre" version.Auch, KOPF (.git/HEAD) wird E' in diesem Fall. Dies ist "meine" version. KOPF^ werden "Basis" - version.
Dies ist wahr für mindestens git 1.7.9
Nicht sicher, warum ich nicht
.git/rebase-apply
in meiner situation. Für diejenigen, die in der gleichen situation, hier ist meine Variante.Oder als alias...
rebase-apply
Ordner erstellt für non-interactive rebase, währendrebase-merge
ist für die interactive one.Viele Male werden Sie in der Mitte einen Stellungswechsel und überspringen möchten diejenigen verpflichtet, die nicht benötigt werden.
Leider, während
git status
sagt, dass Sie in der Mitte Begehen, und empfiehlt die Verwendunggit rebase --continue
git rebase --skip
odergit rebase --abort
es nicht sagen, was Sie Begehen, sind Sie derzeit auf.So kann es oft schwierig sein zu wissen, wenn Sie sollten
git rebase --skip
oder nicht.Aber es gibt noch einen Weg, um herauszufinden, welcher commit sind auf durch läuft:
Da Git 2.17 (März 2018), sollten Sie nicht verwenden müssen
rebase-apply
.Den neuen "
--show-current-patch
" - option ermöglicht eine end-Benutzer die Verkleidung Weg ist, um diediff
angewendet wird, wenn "git rebase
" (und "git am
") hält mit einem Konflikt.Sehen commit fbd7a23, commit 6633529, commit 984913a (11 Feb 2018) von Nguyễn Thái Ngọc Duy (
pclouds
).(Zusammengefasst von Junio C Hamano --
gitster
-- in commit 9ca488c, 06 Mar 2018)Sehen Sie mehr an "Zeigt die aktuelle git interactive rebase-Vorgang"
Beispiel:
Würden Sie dann bekommen: