Ich habe zwei Zweige:
- lokale Niederlassung (die, mit der ich arbeite)
- 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.
Antworten:
Angenommen, Master ist der lokale Zweig, den Sie ersetzen, und "Ursprung / Master" ist der Remote-Zweig, auf den Sie zurücksetzen möchten:
Dadurch wird Ihr lokaler HEAD-Zweig so aktualisiert, dass er mit Revision / Master identisch ist, und
--hard
diese Änderung wird auch mit dem Index und dem Arbeitsbereich synchronisiert.quelle
git reset
Standardmäßig wird Ihr aktueller Zweig neu geordnet und der Index synchronisiert.--soft
Überspringt die Aktualisierung des Index und--hard
synchronisiert auch den Arbeitsbereich. Meine eigene Erfahrung verwendet die--hard
meiste Zeit, außer wenn ich das letzte Commit rückgängig machen möchte (was gerade istgit reset HEAD^
)git fetch origin remote_branch
master
. Stellen Sie daher sicher, dass Sie den Zweig, den Sie ersetzen, zuerst ausgecheckt haben.Das ist so einfach wie drei Schritte:
git branch -d local_branch
git fetch origin remote_branch
git checkout -b local_branch origin/remote_branch
quelle
git branch -D local_branch
im ersten Schritt tun, wenn Ihr Zweig nicht zusammengeführt wird.quelle
git help branch
sagt 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.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 Siegit pull
(oderpush
) statt vollgit pull <remote> <branch>
ausführen, wenn Sie Ihren Zweig bereits auf Nachverfolgung eingestellt haben<remote/branch>
.Ersetzen Sie alles durch den Remote-Zweig. Aber nur von demselben Commit ist Ihre lokale Niederlassung eingeschaltet:
ODER holen Sie sich das Neueste aus der Remote-Niederlassung und ersetzen Sie alles:
Nebenbei können Sie bei Bedarf nicht verfolgte Dateien und Verzeichnisse löschen, die Sie noch nicht festgeschrieben haben:
quelle
git clean
Befehl hat es für mich getan.git reset hard origin/master
Löschen Sie nicht verfolgte Dateien nicht. Vielen Dank!Der sicherste und vollständigste Weg, um den aktuellen lokalen Zweig durch die Fernbedienung zu ersetzen:
Die
stash
Zeile speichert die Änderungen, die Sie nicht festgeschrieben haben. Diebranch
Zeile verschiebt Ihren Zweig zu einem anderen Namen, wodurch der ursprüngliche Name freigegeben wird. Diefetch
Zeile ruft die neueste Kopie der Fernbedienung ab. Diecheckout
Zeile erstellt den ursprünglichen Zweig als Verfolgungszweig neu.Oder als Bash-Funktion:
Dadurch wird der aktuelle Zweig in "replace_master_98d258f" umbenannt.
quelle
git stash pop
in diesen Workflow aufnehmen. Wenn Sie Ihre versteckten Dateien erneut anwenden möchten.Ich bin ein bisschen überrascht, dass noch niemand dies erwähnt hat. Ich benutze es fast jeden Tag:
Grundsätzlich
@{u}
ist dies nur eine Abkürzung für den Upstream-Zweig, den Ihr aktueller Zweig verfolgt. Zum Beispiel entspricht dies typischerweiseorigin/[my-current-branch-name]
. Es ist schön, weil es branchenunabhängig ist.Stellen Sie sicher, dass Sie
git fetch
zuerst die neueste Kopie des Remote-Zweigs erhalten.quelle
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:
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:
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:
4) Rebase abbrechen
Wenn Sie sich zwischen einer fehlerhaften Rebase befinden, können Sie die Rebase-Anforderung wie folgt abbrechen:
quelle
Sie können tun, wie @Hugo von @Laurent sagte, oder Sie können
git rebase
die 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.quelle
Die ausgewählte Antwort ist absolut korrekt , hat mich jedoch nicht mit den neuesten Commit / Pushs belassen ...
Also für mich:
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
quelle
Wenn Sie einen Zweig aktualisieren möchten, der derzeit nicht ausgecheckt ist, haben Sie folgende Möglichkeiten:
quelle
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:
Es ist dasselbe, wie Sie (cd) rekursiv in das Arbeitsverzeichnis jedes Submoduls gelangen und Folgendes ausführen:
Und es ist ganz anders als
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
quelle
git reset --hard
. Dies erhöht den Wert.Dies funktionierte bei mir - clean zeigte alle gelöschten Dateien an. Wenn es Ihnen sagt, dass Sie Änderungen verlieren, müssen Sie verstauen.
quelle
Der hässliche, aber einfachere Weg: Löschen Sie Ihren lokalen Ordner und klonen Sie das Remote-Repository erneut.
quelle