Überschreiben meiner lokalen Niederlassung mit Remote-Niederlassung

153

Ich habe meine örtliche Niederlassung komplett verlassen und möchte von vorne anfangen. Die Version auf dem Server ist korrekt.

Ich möchte nicht von vorne anfangen, ich möchte meine lokale Geschichte nutzen, um meinen großen Fehler zu beheben. (Ich kann, wenn ich muss.)

git fetch branchnameund git pull branchnamenicht arbeiten. Die Meldung, die ich erhalte, ist " aktuell ". Meine lokale Version stimmt jedoch nicht mit der des Servers überein.

git pull origin/branchnamegibt mir einen " nicht gefunden " Fehler.

Sara Chipps
quelle

Antworten:

248

Erstellen Sie zunächst einen neuen Zweig an der aktuellen Position (falls Sie Ihren alten "vermasselten" Verlauf benötigen):

git branch fubar-pin

Aktualisieren Sie Ihre Liste der Remote-Zweige und synchronisieren Sie neue Commits:

git fetch --all

Setzen Sie dann Ihren Zweig auf den Punkt zurück, an dem Ursprung / Zweig auf Folgendes zeigt:

git reset --hard origin/branch

Seien Sie vorsichtig , dies entfernt alle Änderungen von Ihrem Arbeitsbaum !

stricken
quelle
2
+1, aber Sie möchten vielleicht eine Erinnerung hinzufügen, die git fetch originvor dem Zurücksetzen zu tun ist
Mark Longair
Ich habe dies mit einer kleinen Änderung gemacht und es hat nicht funktioniert: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (einige andere Sachen), git reset --hard origin / branch. Das Endergebnis war, dass ich immer noch beim alten Commit war. Dieser Ansatz mag in einigen Fällen funktionieren, aber ich denke, er funktioniert nicht in allen Fällen.
greggles
@Greggles: Irgendwelche Fehler? Nach dem letzten Befehl muss HEAD auf Ursprung / Zweig zeigen.
Knittl
1
@ Gavin: Nein, dies wird unter keinen Umständen andere Zweige als betreffen origin/branch. Noch nie.
Knittl
1
@greggles Ich weiß, dass dies sehr spät ist, aber für andere Leute, die sich fragen, warum das passieren könnte, funktioniert dieser Ansatz nur, wenn Sie einen Zweig ausgecheckt haben. Es hat bei Ihnen nicht funktioniert, weil Sie sich im getrennten HEAD-Status befanden (HEAD zeigt auf ein Commit, nicht auf einen Zweig), und diese Befehle funktionieren nur, wenn HEAD auf einen Zweig zeigt. Wenn Sie dies tun, git resetwährend HEAD auf einen Zweig zeigt, folgt dieser Zweig.
Michael Dorst
60

Was ich mache, wenn ich meinen lokalen Zweig durcheinander bringe, ist, dass ich meinen defekten Zweig einfach umbenenne und den vorgelagerten Zweig erneut auschecke / verzweige:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Wenn Sie sicher sind, dass Sie nichts von Ihrem alten Zweig möchten, entfernen Sie es:

git branch -D branch-old

Aber normalerweise lasse ich die alte Filiale vor Ort, nur für den Fall, dass ich etwas drin habe.

Casey Marshall
quelle
4
Dies scheint die beste Antwort zu sein. Es hilft bei der Erstellung einer Sicherungskopie für alle Fälle und führt sehr wahrscheinlich dazu, dass der lokale Zweig eine exakte Kopie des Remote-Zweigs ist.
greggles
Tolle Antwort, nützlich für mich. Eine Frage: Die offizielle Dokumentation zum Auschecken von Git scheint zu sagen, dass Ihr dritter Befehl lauten sollte: git checkout -b <branch> --track <remote>/<branch>Funktioniert Ihr Befehl genauso gut, ohne den --track?
Starman
1
Ich denke, die Konfigurationsvariable branch.autoSetupMerge(die meiner Meinung nach standardmäßig true ist) macht das --trackimplizit. Und ja, in all meinen Git-Setups muss ich nicht explizit, --trackwenn ich ein mache checkout -b, sondern YMMV.
Casey Marshall
5

Ihre lokale Niederlassung hat wahrscheinlich Änderungen daran, die Sie verwerfen möchten. Dazu müssen Sie den Zweigkopf git resetauf die letzte Stelle zurücksetzen, an der Sie vom Zweig des vorgelagerten Repos abgewichen sind. Verwenden git branch -vSie diese Option, um die sha1-ID des Upstream-Zweigs zu ermitteln und Ihren Zweig mit diesem zurückzusetzen git reset SHA1ID. Dann sollten Sie in der Lage sein, die git checkoutin Ihrem Verzeichnis verbleibenden Änderungen zu verwerfen.

Hinweis: Tun Sie dies immer auf einem gesicherten Repo. Auf diese Weise können Sie sicher sein, dass es richtig funktioniert hat. Wenn dies nicht der Fall ist, können Sie auf ein Backup zurückgreifen.

Wes Hardaker
quelle
Dies scheint wahrscheinlich zu funktionieren, aber angesichts der Einfachheit und Zuverlässigkeit des Ansatzes "Erstellen Sie eine Kopie Ihrer Arbeit an einem anderen Ort, erstellen Sie eine neue Kopie des Remote-Zweigs" sehe ich nicht, wie dies besser ist.
greggles
2
git reset --hard

Dies dient dazu, alle Ihre lokalen Änderungen am Ursprungskopf zurückzusetzen

Karthikeyan Varadarajan
quelle