git: Besserer Weg für Git-Zurücksetzung ohne zusätzliches zurückgesetztes Commit

8

Ich habe ein Commit in einem entfernten + lokalen Zweig und ich möchte dieses Commit aus dem Verlauf werfen und einige davon in einen eigenen Zweig einfügen.

Im Grunde habe ich jetzt:

%Vor%

Und ich will:

%Vor%

Das sollte sowohl in meinem lokalen als auch in dem (es gibt nur einen, so genannten Ursprung) entfernten Repository sein.

Was ist der sauberste Weg, um das zu bekommen?

Auch gibt es noch andere Leute, die dieses Repo geklont haben und die den Master-Zweig überprüft haben. Wenn ich eine solche Änderung in der Remote-Repo machen würde, würde 'git pull' für sie arbeiten, um auch in den gleichen Zustand zu kommen?

    
Albert 06.10.2009, 16:29
quelle

3 Antworten

7

Wenn Sie publiziert haben, dann haben Sie recht, dass Sie den Verlauf von master nicht neu schreiben wollen. Was Sie wollen, ist ein Commit zu master zu veröffentlichen, das es in den Zustand zurückbringt, in dem es sich bei D befand, während es seinen aktuellen Verlauf beibehält, so dass andere Benutzer ihre Arbeit leicht zusammenführen oder neu erstellen können.

Wenn Sie zu einem späteren Zeitpunkt planen, topic in master zusammenzufassen, dann sollten Sie wahrscheinlich auch eine neue gemeinsame Basis zwischen master und topic erstellen, so dass Sie dies tun Wenn Sie anschließend topic zusammenführen, verlieren Sie die in master zurückgesetzten Commits nicht. Der einfachste Weg dazu besteht darin, ein 'Redo' Commit zu setzen, zusätzlich zu dem 'Undo' Commit, das master auf seinen ursprünglichen Zustand zurücksetzt und den neuen topic Zweig zusätzlich darauf basiert.

%Vor%

Als Alternative hätten Sie Commits E ', F' und G 'machen können jeden Teil separat wiederholen, aber da E, F und G bereits in Ihrer veröffentlichten Geschichte sind, ist es wahrscheinlich verständlicher, wenn Sie nur die' Rückgängig 'commit und sagen, dass dieses Commit rückgängig gemacht wird. Das macht git revert sowieso.

Was Sie wissen, ist im Wesentlichen das.

%Vor%

Die wichtigen Dinge sind, dass Sie die Geschichte nicht neu geschrieben haben und das Thema auf dem Master basiert, so dass die Merges nicht versehentlich irgendwelche "Rückgängig" Commits anwenden werden. Sie können jetzt sicher master und topic auf Ihr Remote-Repository übertragen.

    
Charles Bailey 06.10.2009, 18:12
quelle
4

Sie können Ihre Geschichte neu schreiben, wenn Sie es wünschen, aber es ist eine schlechte Idee, wenn jemand andere Kopien der Geschichte hat. In diesem Fall würden Sie wahrscheinlich interaktives Rebase verwenden: git rebase -i master topic . Dies gibt Ihnen eine Liste der Commits von Master zu Thema, mit Hinweisen, wie man mit ihnen spielt. Sie müssen nur die Zeile mit dem Commit entfernen, das Sie entfernen möchten.

Ich muss jedoch betonen, dass es unverantwortlich ist, dies zu tun, wenn jemand anderes diese Geschichte hat. Sie müssten es zu Ihrem zentralen Repo zwingen, und alle anderen müssten ihre Repositories entsprechend anpassen, je nach den Umständen relativ einfach oder komplex.

In der git-rebase man-Seite gibt es einen schönen Abschnitt namens "recovering from upstream rebase" damit umgehen, wenn Sie sich wirklich dafür entscheiden.

Bearbeiten:

Für eine einfache Historie wäre ein übliches Szenario, nachdem ein nicht schneller Push zum zentralen Repo ( push -f ) gezwungen wurde, andere Entwickler:

  • Sichern Sie ihren alten Master: git branch -m master master_old
  • Holen Sie sich Updates und erstellen Sie den Master vom Ursprung neu: git remote update origin; git branch master origin/master
  • Richten Sie alle Zweige auf den neuen Master um: git rebase --onto master master_old topic

Wenn sie in ihrem Master-Zweig arbeiten, der noch nicht im Ursprung ist, müssen sie raffinierter werden und diese Arbeit und alle Zweigstellen auf die neue Position des Masters umlenken ... das sollte dir eine Idee geben, warum es so schrecklich ist, die Geschichte neu zu schreiben, die andere Leute haben. Wirklich, sobald etwas in das öffentliche Repository gelangt ist, solltest du es als hart aufgezeichnete Geschichte ansehen, nicht als laufende Arbeit.

    
Cascabel 06.10.2009 16:50
quelle
-3

Ich finde git stash ist ziemlich hilfreich

Verstecke es einfach und sieh es dir nie wieder an.

    
twig 30.04.2010 06:36
quelle

Tags und Links