2016-09-11 2 views
1

Betrachten Sie die folgenden Schritte aus:Klärung git zurückkehren und rebase

git init 
touch foo.txt 
git add . 
git commit -m 'initial commit' 

Nun werden wir einen neuen Zweig erstellen und eine Datei namens foo2.txt hinzufügen:

git checkout -b new_branch 
touch foo2.txt 
git add . 
git commit -m 'added foo2.txt' 

Jetzt werden wir Gehen Sie zurück zum Master-Zweig und setzen Sie den 'initialen Commit' zurück, den wir gemacht haben (Hinweis: Sie können den Commit-Hash 'initial commit' mit dem Befehl git log herausfinden).

git checkout master 
git revert <commit hash of initial commit> 

An diesem Punkt haben wir weder foo.txt noch foo2.txt in dem Master-Zweig. Nun lassen Sie uns verschmelzen new_branch

git merge new_branch 

An diesem Punkt zu meistern, wird foo2.txt jetzt verschmolzen in Meister, aber foo.txt ist nicht da.

Die Frage ist also, wie bekomme ich foo.txt zurück zum Master? Ich habe versucht, dies zu tun:

git rebase new_branch 

Aber das bringt es nicht zurück. Wenn wir also ein Commit auf Master zurücksetzen, müssen wir einen anderen Zweig zurück zum Master zusammenführen, wie würden wir es zwingen, irgendwelche "fehlenden" Dateien (foo.txt in diesem Beispiel) zu übernehmen?

Die einzige Problemumgehung, die ich fand, die ziemlich drastisch war, war Master zu löschen und new_branch zum Master umzubenennen.

Antwort

1

Machen Sie ein neues Commit, um foo.txt zurück zu bringen. Sie könnten entweder git revert <revert commit> oder git cherry-pick <init commit> oder fügen Sie foo.txt von Hand und commit.

Oder entfernen Sie <revert commit> aus dem Verlauf. Setzen Sie master auf <add foo2 commit> über git reset <add foo2 commit> --hard zurück. Es könnte auch über git rebase --onto <init commit> <init commit> <add foo2 commit> gemacht werden, aber es endet in detached HEAD state, so dass Sie master auf diesen neuen HEAD zurücksetzen müssen.

+0

Kannst du erklären, wie man diesen Schritt macht: "also musst du den Master auf diesen neuen HEAD zurücksetzen", vielleicht mit einem Beispiel? – dcp

+1

@dcp 'git Verzweigung -D Master; git Branch Master' oder schreibe aktuelle HEAD's sha1 und' git checkout master; git reset --hard'. – ElpieKay

+0

Vielen Dank für die hilfreichen Informationen und zeigen verschiedene Möglichkeiten, diese Dinge in git zu tun, wirklich gute Antwort. – dcp

1

Sie können foo.txt wiederherstellen, indem Sie git cherry-pick mit Hash des initialen Commits verwenden.

git revert fügt ein Commit hinzu, das Zeilen entfernt, die durch initiales Commit hinzugefügt wurden, wenn Sie new_branch auf master umbuchen Alle Änderungen, die in diesem Zweig vorgenommen wurden, werden nach diesem Zurücksetzen angewendet.