Wie setze ich 'master' auf 'origin / master' zurück?

215

Kann ich auf einfachere Weise Folgendes tun?

git checkout origin/master
git branch -D master
git branch master
git checkout master
Xiè Jìléi
quelle
Manchmal kann dies geschehen, ohne den Arbeitsbaum zu berühren: stackoverflow.com/a/12343727/586086
Andrew Mao
6
Bitte aktualisieren Sie Ihre akzeptierte Antwort: @ KindDragons Antwort ist korrekter und kürzer.
Robert Siemer

Antworten:

310

Wie in der Antwort von KindDragon erwähnt, können Sie masterdirekt bei Folgendes neu erstellen origin/master:

git checkout -B master origin/master

Die git checkoutManpage erwähnt:

Wenn -Bangegeben, <new_branch>wird erstellt, wenn es nicht vorhanden ist. Andernfalls wird es zurückgesetzt . Dies ist das Transaktionsäquivalent von

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

Ursprünglich vorgeschlagen:

So etwas wie:

$ git checkout master

# remember where the master was referencing to
$ git branch previous_master

# Reset master back to origin/master
$ git reset --hard origin/master

wobei Schritt 2 optional ist.

VonC
quelle
1
Sie können das mit einer Zeile tun.
Robert Siemer
93

Git unterstützt diesen Befehl:

git checkout -B master origin/master

Überprüfen Sie den origin/masterZweig und setzen Sie ihn masterdort zurück.

KindDragon
quelle
4
Die einzig wahre Antwort.
Robert Siemer
3
Speichern Sie vier Tastatureingaben - Sie brauchen keine Anführungszeichen. Einfach: git Checkout -B Master Origin / Master
Zumalifeguard
Nehmen wir an, ich habe zwei Dinge festgeschrieben, das erste ist eine Verschmelzung mit einem Zweig und das zweite ist regulär. Was passiert mit der Zusammenführung, wenn ich zum Ursprung / Master zurückkehre?
utdev
1
Musst du nicht git fetch origin mastervorher sicher sein, dass origin/masteres aktualisiert wird?
pedrozath
Ja, natürlich mit allen Lösungen, die Sie git fetchzuerst tun sollten
KindDragon
29

Ich denke, selbst die Antwort von VonC ist im Vergleich zu dieser Option komplex:

git update-ref refs/heads/master origin/master
git reset --hard master

git protokolliert automatisch jeden Wert eines Verweises (durch das Reflog). Nachdem Sie diesen Befehl ausgeführt haben, wird master@{1}auf den vorherigen Wert von master verwiesen.

VonCs Antwort ist richtig, aber es verschwendet Zeit, den alten Wert von master in das Dateisystem auszulesen.

Wenn Sie sich für verwaiste Objekte im Repo interessieren, können Sie ausführen git gc

Alexander Bird
quelle
1
Klingt nach einer interessanten Alternative. +1
VomC
Ich bekomme immer nochAlready on 'master'
yourfriendzak
@yourfriendzak, ich habe vergessen zu berücksichtigen, dass Sie möglicherweise den Master bereits ausgecheckt haben, bevor Sie den Master aktualisieren. Ich habe die Antwort so aktualisiert, dass sie auch in diesem Fall funktionieren sollte.
Alexander Bird
Dies funktioniert auch dann, wenn Sie nicht als Master angemeldet sind (wie ein abgelöster HEAD-Status, der tatsächlich auf den Spitzenursprung / Master verweist). Dann können Sie den Master auschecken, ohne alte Dateien durch das Repo blättern zu müssen. Toll!
Andrew Mao
20

Wenn Sie bereits masterangemeldet sind, können Sie Folgendes tun:

git reset --hard origin/master

Der lokale masterZweig wird auf die entfernte origin/masterStation verwiesen, und alle Änderungen im Arbeitsverzeichnis werden verworfen.

Fuad Saud
quelle
Und löscht Dateien! Wenn Sie Dateien erstellt / bearbeitet und ein "git add" ausgeführt haben, werden diese mit diesem Befehl gelöscht. Sei gewarnt.
Cheeso
Ist dieser Ansatz besser als git checkout -B master origin/master?
Jim Aho