Die kurze Antwort
Solange Sie eine Schnellvorlaufzusammenführung durchführen , können Sie diese einfach verwenden
git fetch <remote> <sourceBranch>:<destinationBranch>
Beispiele:
# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master
# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo
Während Bernsteins Antwort auch in Fällen mit schnellem Vorlauf funktioniert, ist die Verwendung git fetch
auf diese Weise etwas sicherer als nur das gewaltsame Verschieben der Verzweigungsreferenz, da git fetch
ein versehentliches Nicht-Schnellvorlauf automatisch verhindert wird, solange Sie es nicht verwenden+
in der verwenden refspec.
Die lange Antwort
Sie können einen Zweig B nicht mit Zweig A zusammenführen, ohne vorher A ausgecheckt zu haben, wenn dies zu einer Zusammenführung ohne schnellen Vorlauf führen würde. Dies liegt daran, dass eine Arbeitskopie erforderlich ist, um potenzielle Konflikte zu lösen.
Bei Schnellvorlaufzusammenführungen ist dies jedoch möglich , da solche Zusammenführungen per Definition niemals zu Konflikten führen können. Um dies zu tun, ohne vorher einen Zweig git fetch
auszuchecken , können Sie ihn mit einer Referenzspezifikation verwenden.
Hier ist ein Beispiel für die Aktualisierung master
(das Nicht-Schnellvorlauf-Änderungen nicht zulässt), wenn Sie einen anderen Zweig feature
ausgecheckt haben:
git fetch upstream master:master
Dieser Anwendungsfall ist so häufig, dass Sie wahrscheinlich einen Alias dafür in Ihrer Git-Konfigurationsdatei erstellen möchten, wie diesen:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
Dieser Alias bewirkt Folgendes:
git checkout HEAD
: Dadurch wird Ihre Arbeitskopie in einen Zustand mit getrenntem Kopf versetzt. Dies ist nützlich, wenn Sie ein Update durchführen möchten, master
während Sie es auschecken lassen. Ich denke, es war notwendig, damit zu tun, weil sich sonst die Zweigreferenz für master
nicht bewegt, aber ich erinnere mich nicht, ob das wirklich direkt von meinem Kopf ist.
git fetch upstream master:master
: Dies spult Ihren Einheimischen schnell master
an den gleichen Ort wie vor upstream/master
.
git checkout -
checkt Ihren zuvor ausgecheckten Zweig aus (das -
macht das in diesem Fall).
Die Syntax git fetch
für (Nicht-) Schnellvorlaufzusammenführungen
Wenn Sie möchten, dass der fetch
Befehl fehlschlägt, wenn die Aktualisierung nicht schnell vorspult, verwenden Sie einfach eine Referenz des Formulars
git fetch <remote> <remoteBranch>:<localBranch>
Wenn Sie Aktualisierungen ohne schnellen Vorlauf zulassen möchten, fügen Sie +
an der Vorderseite der Referenz ein hinzu:
git fetch <remote> +<remoteBranch>:<localBranch>
Beachten Sie, dass Sie Ihr lokales Repo als "Remote" -Parameter übergeben können, indem Sie .
:
git fetch . <sourceBranch>:<destinationBranch>
Die Dokumentation
Aus der git fetch
Dokumentation, die diese Syntax erklärt (Hervorhebung von mir):
<refspec>
Das Format eines <refspec>
Parameters ist ein optionales Plus +
, gefolgt von der Quellreferenz <src>
, gefolgt von einem Doppelpunkt :
, gefolgt von der Zielreferenz <dst>
.
Die übereinstimmende Remote-Referenz <src>
wird abgerufen, und wenn <dst>
es sich nicht um eine leere Zeichenfolge handelt, wird die übereinstimmende lokale Referenz mithilfe von weitergeleitet<src>
. Wenn das optionale Plus+
verwendet wird, wird die lokale Referenz aktualisiert, auch wenn dies nicht zu einer Schnellvorlaufaktualisierung führt.
Siehe auch
Git checkout und zusammenführen, ohne den Arbeitsbaum zu berühren
Zusammenführen ohne das Arbeitsverzeichnis zu ändern