861 Stimmen

Zusammenführen, Aktualisieren und Ziehen von Git-Zweigen ohne Verwendung von Checkouts

Ich arbeite an einem Projekt, das 2 Zweige hat, A und B. Ich arbeite normalerweise an Zweig A und führe Sachen aus Zweig B zusammen:

git merge origin/branchB

Ich möchte jedoch auch eine lokale Kopie von Zweig B behalten, da ich den Zweig gelegentlich auschecken kann, ohne ihn zuerst mit meinem Zweig A zusammenzuführen:

git checkout branchB
git pull
git checkout branchA

Gibt es eine Möglichkeit, die oben genannten Schritte mit einem einzigen Befehl auszuführen, ohne zwischen den Verzweigungen hin und her wechseln zu müssen? Sollte ich Folgendes verwenden git update-ref dafür? Wie?

1 Stimmen

20voto

Cascabel Punkte 449595

Dies ist nur möglich, wenn es sich bei der Zusammenführung um einen Schnelldurchlauf handelt. Wenn das nicht der Fall ist, muss Git die Dateien ausgecheckt haben, um sie zusammenführen zu können!

Um es zu tun nur für einen schnellen Vorlauf :

git fetch <branch that would be pulled for branchB>
git update-ref -m "merge <commit>: Fast forward" refs/heads/<branch> <commit>

wobei <commit> ist die abgeholte Übertragung, zu der Sie vorspulen wollen. Dies ist im Grunde wie die Verwendung von git branch -f um den Zweig zu verschieben, außer dass es auch im Reflog vermerkt wird, als ob Sie die Zusammenführung tatsächlich durchgeführt hätten.

Bitte, bitte, bitte tun Sie dies nicht für etwas, das kein Fast-Forward ist, sonst setzen Sie Ihren Zweig auf den anderen Commit zurück. (Um das zu überprüfen, sehen Sie nach, ob git merge-base <branch> <commit> gibt die SHA1 des Zweigs an).

5 Stimmen

Gibt es eine Möglichkeit, den Vorgang zu unterbrechen, wenn er nicht vorspulen kann?

2 Stimmen

@gman können Sie verwenden git merge-base --is-ancestor <A> <B> . "B" ist die Sache, die mit "A" zusammengeführt werden muss. Ein Beispiel wäre A=master und B=develop, wobei sichergestellt werden muss, dass develop schnell in master überführt werden kann. Hinweis: Es existiert mit 0, wenn es nicht vorspulbar ist, und mit 1, wenn es existiert.

1 Stimmen

Nicht in git-scm dokumentiert, aber auf kernal.org. kernel.org/pub/software/scm/git/docs/git-merge-base.html

12voto

kkoehne Punkte 129

Eine andere, zugegebenermaßen recht grobe Möglichkeit ist, den Zweig einfach neu zu erstellen:

git fetch remote
git branch -f localbranch remote/remotebranch

Dadurch wird die lokale, veraltete Verzweigung verworfen und eine neue mit demselben Namen erstellt, also mit Vorsicht verwenden ...

0 Stimmen

Ich habe gerade gesehen, dass in der ursprünglichen Antwort bereits branch -f erwähnt wird ... Dennoch sehe ich keinen Vorteil darin, die Zusammenführung im Reflog für den ursprünglich beschriebenen Anwendungsfall zu haben.

7voto

wnoise Punkte 9530

Sie können das Projektarchiv klonen und die Zusammenführung im neuen Projektarchiv durchführen. Auf demselben Dateisystem werden dabei die meisten Daten nicht kopiert, sondern fest verlinkt. Zum Schluss ziehen Sie die Ergebnisse in das ursprüngliche Projektarchiv.

6voto

lkraider Punkte 3863

Eingabe git-forward-merge :

Ohne das Ziel auschecken zu müssen, git-forward-merge <source> <destination> führt den Quell- mit dem Zielzweig zusammen.

https://github.com/schuyler1d/git-forward-merge

Funktioniert nur bei automatischen Zusammenführungen, bei Konflikten müssen Sie die reguläre Zusammenführung verwenden.

3 Stimmen

Ich denke, das ist besser als git fetch <remote> <Quelle>:<Ziel>, weil ein Fast Forward eine Operation des Merge und nicht des Fetch ist und einfacher zu schreiben ist. Schlechte Sache aber, es ist nicht in der Standard-Git.

6voto

andruso Punkte 1565

Für viele GitFlow Benutzer die nützlichsten Befehle sind:

git fetch origin master:master --update-head-ok
git fetch origin dev:dev --update-head-ok

El --update-head-ok Flagge erlaubt die Verwendung desselben Befehls bei dev o master Zweige.

Ein praktischer Alias in .gitconfig :

[alias]
    f=!git fetch origin master:master --update-head-ok && git fetch origin dev:dev --update-head-ok

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X