Möchten Sie meinen Master in ein älteres Commit ändern? Wie kann ich das tun?

89

Ich möchte zu einem vorherigen Commit zurücksetzen, diesen Code veröffentlichen und dann zum letzten Commit zurückkehren.

Das heißt, mein Master zeigt auf eine ältere Commit-Version, nur damit ich diese Version veröffentlichen kann. Dann möchte ich zu dem letzten Commit zurückkehren, das ich ursprünglich war.

Wie kann ich das machen?

Blankman
quelle

Antworten:

97

Wenn Sie dies tun und den Master auf das vorherige Commit zurücksetzen möchten:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

Alternative:

git reset --hard master~1        # Reset current branch to one commit ago on master
Tyler Brock
quelle
1
Ein Jahr später schaue ich mir das an und denke, das ist ein schrecklicher Weg, es zu tun. Na ja, zumindest ist es etwas leicht zu verstehen.
Tyler Brock
1
Ja, deshalb habe ich positiv gestimmt, leicht zu verstehen. Vielleicht hättest du einen Link zu einem besseren Weg präsentieren sollen?
Andrew Atkinson
1
Ich musste dasselbe mit SourceTree machen. Der Prozess ist ähnlich. 1) Erstellen Sie einen neuen Zweig für den aktuellen Master-Status, damit Sie nichts verlieren. 2) Master löschen 3) Neuen Master-Zweig erstellen und das gewünschte Commit auswählen
Danilo Gomes
Was passiert mit dem Commit, das wir danach vom Master "entfernt" haben?
Arthur Colombini Gusmão
1
Dies sollte vermieden werden, wenn Sie ein Remote-Repo haben. In diesem Fall treten einige Fehler auf, da sich die Adresse des ersten Masters von der kürzlich erstellten neuen Master unterscheidet.
MAChitgarha
54

Ihre Frage ist unklar. Ich denke, was Sie verlangen, ist Folgendes:

git push -f origin $old_commit_id:master

Was wird das tun? Es drückt die $old_commit_idzu verpflichten , originals neuen Leiter von origin‚s - masterZweig.

Wenn Sie dies möchten, müssen Sie Ihre lokale masterNiederlassung überhaupt nicht berühren .

Aristoteles Pagaltzis
quelle
Dies verursachte einen master (non-fast-forward)Fehler für mich. @ jtdubs Lösung hat funktioniert.
Bobby Norton
3
Übergeben Sie -fes einfach , um es zu erzwingen - obwohl das Remote-Repo möglicherweise so konfiguriert ist, dass es dies verbietet. Ich habe die Antwort aktualisiert.
Aristoteles Pagaltzis
funktioniert bei mir nicht, die akzeptierte Antwort jedoch
MobileMon
Du hast nicht genau gesagt, was du wolltest oder warum es nicht funktioniert hat, also kann ich dir nicht sagen, warum es nicht funktioniert hat und wie es hätte gemacht werden können (wenn es hätte sein können).
Aristoteles Pagaltzis
Sie scheinen mit diesem Ansatz die Vergangenheit auf der Ferne zu verlieren, war in Ordnung für mich. Ich rufe es einfach aus.
Shawn
43

verwenden git reset --hard <old commit number>

Der HEAD wird auf dieses alte Commit zurückgesetzt.

git push -f originDarüber hinaus müssen Sie auch das Remote-Repo ändern.

KawaiKx
quelle
29

Wenn Sie Force Push vermeiden möchten, gehen Sie wie folgt vor, um Ihr Repo auf ein älteres Commit zurückzusetzen und alle dazwischen liegenden Arbeiten beizubehalten:

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

Getan! Ersetzen Sie 307a5cd durch das gewünschte Commit in Ihrem Repo.

(Ich weiß, dass die ersten beiden Zeilen kombiniert werden können, aber ich denke, das macht weniger klar, was los ist.)

Hier ist es grafisch:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

Sie entfernen effektiv c3 und c4 und setzen Ihr Projekt wieder auf c2. C3 und c4 sind jedoch weiterhin in der Projekthistorie verfügbar, wenn Sie sie jemals wieder sehen möchten.

Bronson
quelle
1
Das hat reibungslos funktioniert! Wenn Sie so weit gekommen sind und dies lesen, scheint dies der sauberste Weg zu sein, um den Master auf ein tieferes Commit zurückzusetzen.
ddisqq
Ich kann die Worte nicht finden, um zu erklären, wie sehr ich dich dafür liebe. Ich bin unbeschreiblich dankbar, dass ich etwas reparieren konnte, das mich jetzt seit 6 Stunden nervte und mir so viele Kopfschmerzen bereitete. Danke mein Herr!!!!!!!
Kostas Tsakalidis
9

Angenommen, ein Commit-Diagramm wie folgt:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

Sie möchten zuerst auschecken masterund einen Zweig erstellen, der auf die masteraktuelle Position verweist :

git checkout master
git branch pointer master

Sollte jetzt so aussehen:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

Jetzt, da Sie bereits aktiv sind master, weisen wir den masterZweig an, ein Commit rückwärts zu verschieben:

git reset master~1

Jetzt mastersollte ein Leerzeichen zurück verschoben werden, aber der pointerZweig befindet sich noch im letzten Commit:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

An diesem Punkt können Sie masterauf eine Fernbedienung drücken oder wo immer Sie sie dann schnell wieder in den pointerZweig zurückführen . Sie können den pointerZweig an diesem Punkt töten :

git push origin master
git merge --ff-only pointer
git branch -D pointer

Finale:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)
C0M37
quelle
1
Wenn sich origin / master auf C befindet, git push origin masterschlägt dies fehl, wenn sich die Spitze Ihres aktuellen Zweigs hinter seinem entfernten Gegenstück befindet . Sie sollten auch ein -f-Flag übergeben.
Sassospicco
8

Sie können einfach git checkout <commit-id>alles tun, was Sie tun müssen, und dann git checkout masterzum neuen Code zurückkehren.

Wenn Sie den alten Code tatsächlich ändern müssen, um ihn freizugeben, sollten Sie wahrscheinlich:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

Außerdem kann ich Git Flow nicht genug empfehlen . Das macht das alles ganz einfach.

jtdubs
quelle
1

So wechseln Sie zu einer früheren Version:

git checkout <version hash>

mach deine Arbeit hier und begebe sie mit

git commit --amend

Um zum Meister zurückzukehren :

git checkout master

Pablo Fernandez
quelle
1
Das wird nicht funktionieren. git reset --hardzeigte seinen Hauptzweig zurück auf das alte Commit, git checkout masterwird also nichts tun.
jtdubs
Richtig, danke für die Korrektur. +1 für Sie, würde auch meine Antwort entfernen, aber ich denke, der commit --amendSchritt ist nützlich genug
Pablo Fernandez
Was ist --amend?
Shafizadeh