Wie spule ich einen Zweig zum Kopf vor?

249

Ich wechselte zum Master, nachdem ich mich lange auf einem Ast entwickelt hatte. Das Protokoll zeigt:

Ihre Filiale liegt mit 167 Commits hinter 'origin / master' und kann schnell weitergeleitet werden.

Ich habe es versucht:

git checkout HEAD

Es hat keine Wirkung. Dies liegt daran, dass ich ein Zwischen-Commit für den Master ausgecheckt habe.

Wie kann man den Meister auf dem Kopf halten?

pengguang001
quelle
6
git checkout HEADmacht nie etwas. HEADbedeutet bereits das ausgecheckte Commit.
Emre Tapcı

Antworten:

244

Tun:

git checkout master
git pull origin

ruft den origin/masterZweig ab und führt ihn zusammen (Sie können einfach sagen, dass git pullder Ursprung der Standard ist).

Greg Hewgill
quelle
52
Ich denke, Robs Antwort ist besser. Normalerweise stoße ich auf diese Situation, in der ich gerade mit dem Ziehen fertig bin und dann zu einem anderen Zweig wechsle, der schnell vorgespult werden muss. Es ist ärgerlich für mich, wenn ich einen weiteren (No-Op-) Pull ausführen und warten muss, bis er abgeschlossen ist. Eine Operation nur vor Ort ist schneller und ich möchte sie trotzdem.
Baron Schwartz
353

Versuchen Sie es git merge origin/master. Wenn Sie sicher sein möchten, dass nur ein schneller Vorlauf ausgeführt wird, können Sie sagen git merge --ff-only origin/master.

Rob Mayoff
quelle
4
Dies ist hilfreich, wenn Ihre Fernbedienung über einige Authentifizierungsrahmen verfügt, durch die Sie springen können. Wenn ich einen Zweig einziehe, muss ich mich authentifizieren. Wenn ich dann zu einem anderen Zweig wechsle (dh um meine Änderungen auszuwählen), bevorzuge ich die Verwendung dieses mergeBefehls, damit ich mich nicht erneut authentifizieren muss.
RustyTheBoyRobot
30
--ff-onlyist äußerst nützlich.
Luke
4
Ich weiß nicht, ob der origin/masterTeil erforderlich ist oder ob er vernünftigerweise standardmäßig verwendet wird, aber ich fand es nützlich, einen Alias ​​für den schnellen Vorlauf zu erstellen. Deshalb wollte ich sicherstellen, dass der Upstream-Zweig verwendet wird, anstatt ihn fest zu codieren origin/master: ff = merge --ff-only @{u}( @{u}ist Upstream) .
Thor84no
2
Das ist besser als die vorgeschlagene Antwort, wenn Sie offline sind
Jacek Pietal
1
Können Sie erklären, warum ein einfacher Zug nicht dasselbe bewirkt? Wird auch noch gezogen, wenn wir dies tun?
Zuzu Corneliu
40

In Ihrer Situation git rebasewürde auch der Trick tun. Da Sie keine Änderungen haben, die der Master nicht hat, spult git nur schnell vor. Wenn Sie mit einem Rebase-Workflow arbeiten, ist dies möglicherweise ratsamer, da Sie bei einem Durcheinander kein Merge-Commit erhalten würden.

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean
Hohlraumvektor
quelle
1
Und sehr nützlich für mich, da wir kein Git Pull verwenden sollen!
Stefan
Selbst wenn noch Änderungen anstehen, können Sie diese jederzeit aufbewahren und neu aufbauen. Ich weiß nicht, ob dies der "richtige" Weg ist, aber Wunder wirkt.
fn.
28
git checkout master
git pull

sollte den Job machen.

Sie erhalten jedes Mal die Meldung "Ihr Zweig ist im Rückstand", wenn Sie an einem anderen Zweig als dem Master arbeiten , jemand Änderungen am Master vornimmt und Sie ziehen.

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

Jetzt wird die Ursprungs- / Master-Referenz gezogen, aber Ihr Master wird nicht mit dieser zusammengeführt

(branch) $ git checkout master
(master) $ 

Jetzt steht Master hinter Origin / Master und kann schnell weitergeleitet werden

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

Jetzt sind Ihr Master und Ihr Ursprung / Master synchron

Kuba
quelle
13

Wenn Sie in einem anderen Zweig stehen und die neueste Version von Master auschecken möchten, können Sie dies auch tun

git checkout -B master origin/master

jontro
quelle
9

Für alle, die schnell vorspulen möchten, dass sie sich nicht in einem anderen Remote-Zweig befinden (einschließlich sich selbst), ohne diesen Zweig auszuchecken, können Sie Folgendes tun:

git fetch origin master:other

Dies spult den Index von otherim Grunde schnell vor , origin/masterwenn Sie sich nicht in einer otherVerzweigung befinden. Auf diese Weise können Sie mehrere Zweige schnell vorspulen.

Wenn Sie einige Zeit an einem anderen Zweig gearbeitet haben und veraltete Zweige von Remote auf den jeweiligen Kopf aktualisieren möchten:

git fetch origin master:master other:other etc:etc
Sonniger Patel
quelle
2

Es sind keine Komplexitäten erforderlich. Stellen Sie sich einfach in Ihre Filiale und machen Sie einen Git-Pull

Oder versuchen Sie als zweiten Versuch git pull origin master nur für den Fall, dass Sie mit dem ersten Befehl Pech haben

Hasan Junaid Hashmi
quelle
0

So starten Sie den aktuellen lokalen Tracker- Zweig neu, indem Sie lokale Änderungen auf den neuesten Remote-Status verschieben:

$ git fetch && git rebase

Allgemeiner gesagt, um die lokalen Änderungen vorzuspulen und zu löschen ( Hard-Reset ) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

zu vorspulen und halten Sie die lokalen Änderungen ( Rebase ):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* - git reflogUm die durch einen unbeabsichtigten Hard-Reset verursachte Änderung rückgängig zu machen , suchen Sie zuerst den Hash, auf den der HEAD vor dem Reset-Vorgang zeigte (normalerweise offensichtlich), und setzen Sie den Zweig auf diesen Hash zurück.

Bobah
quelle
0

Führen Sie in Ihrem Fall zum Schnellvorlauf Folgendes aus:

$ git merge --ff-only origin/master

Dies nutzt die --ff-onlyOption von git merge, da die Frage speziell nach "Schnellvorlauf" fragt.

Hier ist ein Auszug davon git-merge(1), der weitere Optionen für den schnellen Vorlauf zeigt:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

Ich spule oft genug vor, so dass ein Alias ​​gerechtfertigt ist:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

Jetzt kann ich dies zum schnellen Vorlauf ausführen:

$ git ff
aude
quelle
-2

Bewegen Sie Ihren Verzweigungszeiger auf den KOPF:

git branch -f master

Ihr Zweig ist masterbereits vorhanden, sodass Sie ihn mit git nicht überschreiben können, es sei denn, Sie verwenden ... -f(dieses Argument steht für --force)

Oder Sie können rebase verwenden:

git rebase HEAD master

Mach es auf eigenes Risiko;)

Asynchronisieren
quelle
1
Versuchen Sie dies nicht. Wenn Sie folgende Situation haben, werden schlimme Dinge passieren: C0 --- C1 --- C2 --- C3 --- C4 (Master). C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) Wenn Ihr Kopf bei B3 (dev) ist und Sie git branch -f master ausführen, erhalten Sie C0 - - C1 --- C2 --- B1 --- B2 --- B3 (dev) (Master). C3 --- C4 sind von keinem Zweig aus erreichbar und werden schließlich mit Müll gesammelt. Wenn Sie sich in dieser Situation befinden, schauen Sie sich das Reflog an und checken Sie das C4-Commit mit der Option -b <branch> aus, um einen neuen Zweig zu erstellen.
A_P