Wie kann ich ändern, auf welche Commit-Masterpunkte in Git verwiesen wird?

75

In git habe ich Commits für den Hauptzweig vorgenommen, als ich eigentlich an einem Feature-Zweig hätte arbeiten sollen. Ich möchte dies ändern, damit der Master wieder dort ist, wo er begonnen hat, und was auf dem Master war, befindet sich jetzt in einem neuen Zweig. Grundsätzlich sieht mein Commit-Verlauf folgendermaßen aus:

A -- B -- C -- D -- E
          |         |
          |       master
     origin/master

Und ich möchte, dass es so aussieht:

        master
          |
A -- B -- C -- D -- E
          |         |
          |       new_branch
     origin/master

Wie kann ich ändern, wo Masterpunkte?

Rudd Zwolinski
quelle

Antworten:

76
  • Verstecken Sie Ihre nicht gebundenen: git stash
  • Erstellen Sie einen neuen Zweig: git branch new_branch
  • Master auf Ursprung / Master zurücksetzen: git reset --hard origin/master
  • Checke die neue Filiale erneut aus: git checkout new_branch
  • Entpacken Sie Ihre Änderungen: git stash pop

Stash / Unstash ist nicht erforderlich, wenn Ihr Arbeitsbaum sauber ist. Stellen Sie einfach sicher, dass Ihr Arbeitsbaum keine Änderungen enthält, da diese beim Zurücksetzen von --hard entfernt werden


eine andere Möglichkeit (schneller und ohne das Verstauen und Zurücksetzen):

  • neue Filiale auschecken: git checkout -b new_branch master
  • Erstellen Sie einen 'neuen' Master-Zweig und verweisen Sie ihn auf das Commit von origin / master: git branch -f master origin/master
stricken
quelle
2
Beachten Sie, dass der Stash nur erforderlich ist, wenn Sie nicht festgeschriebene Änderungen vorgenommen haben.
Josh Lee
1
Wenn Ihr Arbeitsverzeichnis sauber ist, benötigen Sie die stashund unstashTeile nicht. Ansonsten perfekt: +1
Cameron Skinner
10
Genial! git reset --hard <commit>war genau das, wonach ich gesucht habe.
Rudd Zwolinski
3
Sie sollten Dateien wirklich nicht .git/refs/von Hand ändern (zum einen könnte eine bestimmte Referenz tatsächlich (in die .git/packed-refDatei) gepackt werden, anstatt „lose“ zu sein). Im Allgemeinen ist der Befehl mit der niedrigsten Ebene, den Sie zum Ändern einer Referenz verwenden sollten, entweder git update-ref oder git symbolic-ref . In diesem speziellen Fall ist es nicht erforderlich, mit Git-Interna zu mischen oder sogar die zuvor erwähnten Git-Installationsbefehle zu verwenden. Sie können es mit Git Branch tun : git branch -f master origin/master.
Chris Johnsen
4
git branch -f master <commit>hat den Trick für mich gemacht, danke!
Danr
26
$ git checkout master
$ git reset --hard <commit-id-for-master-to-sit-at>

Versuchen Sie dies zum Beispiel

$ mkdir example; cd example
$ git init
$ vi testFile.txt
(now add "test commit 1" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 1st commit" to git commit)
$ vi testFile.txt
(now add "test commit 2" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 2nd commit" to git commit)
$ vi testFile.txt
(now add "test commit 3" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 3rd commit" to git commit)
$ git tag final_head
$ git reset --hard HEAD~1

Dieses Beispiel zeigt, wie der Master auf ein anderes Commit verschoben wird. Beachten Sie hier, dass das Tag es uns ermöglicht, den alten Master für den Fall zu speichern :)

J-Dizzle
quelle
4

Wie hier beschrieben , aber noch einfacher, ohne Zurücksetzen. Erstellen Sie einfach einen neuen Zweig, in dem sich der Master befand, und löschen Sie dann den Master. Löschen Sie erneut den Ort, an den Sie den Master verschieben möchten, und erstellen Sie dort einen neuen Master-Zweig:

git stash
git checkout -b old_master_was_here
git branch -d master
git checkout origin/master
git checkout -b master
Ioannis Filippidis
quelle
3

Gehen Sie zu .git / refs / Heads / Master, das den Hash von Master hat, und ändern Sie dies in das, was Sie wollen. Ich benutze gitg, um schnell den Hash des Masters zu finden und anschließend zu überprüfen, ob der Umzug erfolgreich war.

gescho
quelle
0

Erstellen Sie einen neuen Zweig new_brancham aktuellen HEAD (unter der Annahme, dass HEAD = Master ist), setzen Sie den Master auf C zurück und wechseln Sie new_brancherneut zu (in Bezug auf SmartGit).

Mot
quelle
0

Beachten Sie, dass Sie jederzeit ändern können, wohin ein Zweig zeigt, indem Sie verwenden git update-ref refs/heads/branch id. Bevor Sie dies tun, müssen Sie der Spitze des Baums einen Namen geben, da sonst auf Ihre Arbeit nicht zugegriffen werden kann. Diese beiden Befehle können also die Arbeit erledigen

 git update-ref refs/heads/newfeature HEAD
 git update-ref refs/heads/master XXYYY

Aber stellen Sie sicher, dass Sie keine nicht festgeschriebenen Änderungen haben, sonst bricht die Hölle los

am70
quelle