Wie ersetze ich den lokalen Zweig vollständig durch den Remote-Zweig in Git?

779

Ich habe zwei Zweige:

  1. lokale Niederlassung (die, mit der ich arbeite)
  2. Remote-Zweigstelle (öffentlich, nur gut getestete Commits gehen dorthin)

Kürzlich habe ich meine lokale Niederlassung ernsthaft durcheinander gebracht.

Wie würde ich den lokalen Zweig vollständig durch den Remote-Zweig ersetzen, damit ich meine Arbeit dort fortsetzen kann, wo sich der Remote-Zweig jetzt befindet?

Ich habe SO bereits gesucht und das lokale Auschecken in den Remote-Zweig hat keine Auswirkungen.

YemSalat
quelle
1
Ich weiß, dass die akzeptierte Antwort 1280 Up-Stimmen hat, aber Sie sollten wirklich in Betracht ziehen, die akzeptierte Antwort in die von @TTT zu ändern.
Jamie

Antworten:

1289
  1. Stellen Sie sicher, dass Sie den Zweig, den Sie ersetzen, ausgecheckt haben (aus Zoltáns Kommentar ).
  2. Angenommen, Master ist der lokale Zweig, den Sie ersetzen, und "Ursprung / Master" ist der Remote-Zweig, auf den Sie zurücksetzen möchten:

    git reset --hard origin/master
    

Dadurch wird Ihr lokaler HEAD-Zweig so aktualisiert, dass er mit Revision / Master identisch ist, und --harddiese Änderung wird auch mit dem Index und dem Arbeitsbereich synchronisiert.

araqnid
quelle
4
Vielen Dank für Ihren Vorschlag. Ich habe nur so große Angst davor, --hard und --force bereits zu verwenden. Deshalb habe ich nur die Lösung ausgewählt, die diese nicht verwendet.
YemSalat
13
@KonstantinLevin: ah ja, die Benennung dieser Optionen ist ziemlich irritierend. git resetStandardmäßig wird Ihr aktueller Zweig neu geordnet und der Index synchronisiert. --softÜberspringt die Aktualisierung des Index und --hardsynchronisiert auch den Arbeitsbereich. Meine eigene Erfahrung verwendet die --hardmeiste Zeit, außer wenn ich das letzte Commit rückgängig machen möchte (was gerade ist git reset HEAD^)
araqnid
9
Nachdem ich mehr Erfahrung mit Git habe, bin ich überzeugt, dass dies eine bessere Lösung ist, danke.
YemSalat
24
wahrscheinlich müssen Sie zuerst holen:git fetch origin remote_branch
b1r3k
53
Sie sollten beachten, dass dies den Zweig, in dem Sie sich gerade befinden, durch den Inhalt des Masters ersetzt . Wenn Sie sich beispielsweise in einem Feature-Zweig befinden, werden alle Commits durch ersetzt master. Stellen Sie daher sicher, dass Sie den Zweig, den Sie ersetzen, zuerst ausgecheckt haben.
Zoltán
218

Das ist so einfach wie drei Schritte:

  1. Löschen Sie Ihre lokale Niederlassung: git branch -d local_branch
  2. Holen Sie sich den neuesten Remote-Zweig: git fetch origin remote_branch
  3. Erstellen Sie den lokalen Zweig basierend auf dem Remote-Zweig neu: git checkout -b local_branch origin/remote_branch
Adam Smith
quelle
7
Eigentlich ist das, was @araqnid gesagt hat, richtig und prägnanter. Ich habe es getestet und Sie können es auch versuchen.
Adamsmith
Wow, die Git-Kasse -b local_branch origin / remote_branch ist großartig! Ich habe das immer in zwei separaten Befehlen gemacht. Vielen Dank!
Kendepelchin
11
Möglicherweise müssen Sie dies git branch -D local_branchim ersten Schritt tun, wenn Ihr Zweig nicht zusammengeführt wird.
Szeryf
danke, es fiel mir schwer, gitflow zu verwenden. Nachdem ich einen Zweig veröffentlicht und dann fertiggestellt hatte, wollte ich zum gelöschten Zweig gehen, und Ihre Lösung war die einzige, die funktionierte. Pull scheint nicht zu funktionieren. Oder ich mave habe es nicht gut benutzt -
Decebal
2
Wir sollten sicherstellen, dass der aktuelle Zweig nicht derjenige ist, der gelöscht werden soll.
a_secenthusiast
43
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
Sailesh
quelle
Was macht der --track Teil?
Eonist
3
@ GitSync, das git help branchsagt es aus --track. When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out. Ich habe diesen Befehl in der Antwort behoben. Vielen Dank, dass Sie den Punkt angesprochen haben.
Sailesh
Also in Laienbegriffen: Es fügt die Remote-URL zum neuen Zweig hinzu. Sie sind also für immer synchron. Sozusagen.
Eonist
2
Man kann sagen, dass es nur der Einfachheit halber ist. Wenn Sie dies tun git status, wird gemeldet, ob sich Ihre lokale Zweigstelle vor oder hinter der Remote-Zweigstelle befindet, wenn Sie ihnen zugeordnet sind. Darüber hinaus können Sie git pull(oder push) statt voll git pull <remote> <branch>ausführen, wenn Sie Ihren Zweig bereits auf Nachverfolgung eingestellt haben <remote/branch>.
Sailesh
22

Ersetzen Sie alles durch den Remote-Zweig. Aber nur von demselben Commit ist Ihre lokale Niederlassung eingeschaltet:

git reset --hard origin/some-branch

ODER holen Sie sich das Neueste aus der Remote-Niederlassung und ersetzen Sie alles:

git fetch origin some-branch
git reset --hard FETCH_HEAD

Nebenbei können Sie bei Bedarf nicht verfolgte Dateien und Verzeichnisse löschen, die Sie noch nicht festgeschrieben haben:

git clean -fd
ein bisschen weniger
quelle
Der git cleanBefehl hat es für mich getan. git reset hard origin/masterLöschen Sie nicht verfolgte Dateien nicht. Vielen Dank!
Mornor
9

Der sicherste und vollständigste Weg, um den aktuellen lokalen Zweig durch die Fernbedienung zu ersetzen:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

Die stashZeile speichert die Änderungen, die Sie nicht festgeschrieben haben. Die branchZeile verschiebt Ihren Zweig zu einem anderen Namen, wodurch der ursprüngliche Name freigegeben wird. Die fetchZeile ruft die neueste Kopie der Fernbedienung ab. Die checkoutZeile erstellt den ursprünglichen Zweig als Verfolgungszweig neu.

Oder als Bash-Funktion:

replaceWithRemote() {
    yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

Dadurch wird der aktuelle Zweig in "replace_master_98d258f" umbenannt.

Joshua S.
quelle
Möglicherweise möchten Sie git stash popin diesen Workflow aufnehmen. Wenn Sie Ihre versteckten Dateien erneut anwenden möchten.
Eonist
Was machst du mit verstecktem Ast? Ich fürchte, es wird irgendwann in der Zukunft wieder auftauchen, lange nachdem ich vergessen habe, wofür es war.
Scott Biggs
1
@ScottBiggs Wenn Sie den versteckten Zweig entfernen möchten, verwenden Sie "git stash clear".
Mark A. Durham
4

Ich bin ein bisschen überrascht, dass noch niemand dies erwähnt hat. Ich benutze es fast jeden Tag:

git reset --hard @{u}

Grundsätzlich @{u}ist dies nur eine Abkürzung für den Upstream-Zweig, den Ihr aktueller Zweig verfolgt. Zum Beispiel entspricht dies typischerweise origin/[my-current-branch-name]. Es ist schön, weil es branchenunabhängig ist.

Stellen Sie sicher, dass Sie git fetchzuerst die neueste Kopie des Remote-Zweigs erhalten.

TTT
quelle
1
das sieht wirklich gut aus, ich habe es satt, den Namen des Zweigs zu kopieren und einzufügen, um ihn zurückzusetzen!
pedroct92
1
Ich hatte einige Fälle, in denen ich Antworten auf alte Fragen hinzugefügt habe, und meine Antworten haben sich in der Rangliste hochgearbeitet. Ich hoffe das tut es.
Jamie
3

Es gibt mehrere Möglichkeiten, diese Antwort weiter zu bearbeiten, um eine bessere Wissensperspektive zu verbreiten.

1) Hart zurücksetzen

Wenn Sie vom Remote-Entwicklungszweig aus arbeiten, können Sie HEAD wie folgt auf das letzte Commit im Remote-Zweig zurücksetzen:

git reset --hard origin/develop

2) Löschen Sie den aktuellen Zweig und checken Sie ihn erneut aus dem Remote-Repository aus

In Anbetracht dessen, dass Sie an der Entwicklung eines Zweigs im lokalen Repo arbeiten, der mit dem Remote- / Entwicklungszweig synchronisiert wird, können Sie wie folgt vorgehen:

git branch -D develop
git checkout -b develop origin/develop

3) Zusammenführung abbrechen

Wenn Sie sich zwischen einer fehlerhaften Zusammenführung befinden (fälschlicherweise mit einem falschen Zweig durchgeführt) und die Zusammenführung vermeiden möchten, um wie folgt zum neuesten Zweig zurückzukehren:

git merge --abort

4) Rebase abbrechen

Wenn Sie sich zwischen einer fehlerhaften Rebase befinden, können Sie die Rebase-Anforderung wie folgt abbrechen:

git rebase --abort
Amit Kaneria
quelle
2

Sie können tun, wie @Hugo von @Laurent sagte, oder Sie können git rebasedie Commits löschen, die Sie entfernen möchten, wenn Sie wissen, welche. Ich neige dazu, git rebase -i head~N(wobei N eine Zahl ist, mit der Sie die letzten N Commits manipulieren können) für diese Art von Operationen zu verwenden.

ksol
quelle
Eigentlich war es der Befehl 'git rebase', der das Ganze durcheinander brachte, dann einige erzwungene Zusammenführungen und Hard-Resets. Was ich suchte, war nur eine einfache Möglichkeit, das gesamte Repo vom Remote-Server abzurufen, ohne es zusammenzuführen.
YemSalat
2

Die ausgewählte Antwort ist absolut korrekt , hat mich jedoch nicht mit den neuesten Commit / Pushs belassen ...

Also für mich:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

Da ich weiß, dass ich meinen Upstream-Zweig für einige Wochen vorübergehend auf einen bestimmten Zweig einstellen möchte (derselbe, zu dem ich zuvor gewechselt / ausgecheckt und einen Hard-Reset durchgeführt habe)

Also NACH dem Zurücksetzen

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 
Tom Stickel
quelle
1

Wenn Sie einen Zweig aktualisieren möchten, der derzeit nicht ausgecheckt ist, haben Sie folgende Möglichkeiten:

git fetch -f origin rbranch:lbranch
kqr
quelle
0

Wie in der gewählten Erklärung angegeben, ist das Zurücksetzen des Git gut. Aber heutzutage verwenden wir oft Untermodule: Repositorys innerhalb von Repositorys. Wenn Sie beispielsweise ZF3 und jQuery in Ihrem Projekt verwenden, möchten Sie höchstwahrscheinlich, dass sie aus ihren ursprünglichen Repositorys geklont werden. In diesem Fall reicht ein Zurücksetzen des Git nicht aus. Wir müssen Submodule auf genau die Version aktualisieren, die in unserem Repository definiert ist:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

Es ist dasselbe, wie Sie (cd) rekursiv in das Arbeitsverzeichnis jedes Submoduls gelangen und Folgendes ausführen:

git submodule update

Und es ist ganz anders als

git checkout master
git pull

weil Submodule nicht auf Verzweigung, sondern auf Commit verweisen.

In diesen Fällen können Sie einen Zweig manuell für ein oder mehrere Submodule auschecken, die Sie ausführen können

git submodule foreach git pull
Eugene Kaurov
quelle
Bitte geben Sie eine Erklärung, insbesondere bei der Beantwortung dieser alten Fragen. Ihre Antwort ist nicht hilfreich.
Erik A
Die akzeptierte Antwort schlägt bereits vor git reset --hard. Dies erhöht den Wert.
Florida
0
git reset --hard
git clean -fd

Dies funktionierte bei mir - clean zeigte alle gelöschten Dateien an. Wenn es Ihnen sagt, dass Sie Änderungen verlieren, müssen Sie verstauen.

Travis Heeter
quelle
-6

Der hässliche, aber einfachere Weg: Löschen Sie Ihren lokalen Ordner und klonen Sie das Remote-Repository erneut.

Hugo
quelle
10
Oder löschen Sie einfach den Zweig und checken Sie ihn erneut aus.
Laurent
Ja, ich denke, das werde ich tun, wenn ich nicht finde, wie ich es weniger "hässlich" machen soll
YemSalat
2
Hässlich ist manchmal nützlich zu wissen. Ich wünschte, die Leute würden die Dinge nicht ablehnen, nur weil sie nicht die konventionelle Art sind: Es muss einen rationaleren Grund für die Ablehnung geben ... und er sollte angegeben werden. Git ist eine Sache, die Ergebnisse erzielt. Es ist keine Art heiliger Text.
Mike Nagetier
3
Ich verstehe die Abstimmungen nicht :-( Ja, es ist unelegant usw., aber es kann in einigen Fällen am besten funktionieren ... sorry @Hugo
silverdr
@ Hugo, einverstanden. In meiner lokalen Entwicklungsabteilung passierte etwas Geheimnisvolles und Stinkendes, und sowohl der Teamleiter als auch der technische Leiter schlugen unter eleganteren Lösungen vor, nur das lokale Repo zu nuklearisieren und zu reklonen (zippen, kopieren und speichern).
AmitaiB