Ich habe einen Zweig aus einem Repository in GitHub gegabelt und etwas Spezielles für mich festgelegt. Jetzt fand ich, dass das ursprüngliche Repository eine gute Funktion hatte, die bei war HEAD
.
Ich möchte es nur ohne vorherige Zusagen zusammenführen. Was sollte ich tun? Ich weiß, wie alle Commits zusammengeführt werden:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
Antworten:
'
git cherry-pick
' sollte hier deine Antwort sein.Vergessen Sie nicht, die Antwort von bdonlan über die Konsequenzen des Kirschpflückens in diesem Beitrag zu lesen :
"Alle Commits aus einem Zweig ziehen, bestimmte Commits in einen anderen verschieben" , wobei:
wird:
quelle
Sie können Git Cherry-Pick verwenden, um ein einzelnes Commit für sich auf Ihren aktuellen Zweig anzuwenden.
Beispiel:
git cherry-pick d42c389f
quelle
git cherry-pick d42c
odergit cherry-pick d42c3
wird funktionieren. Git ist schlau. ;)d42c389f
. Vielleicht war es dem OP nicht wichtig , eine Zusammenführung per se zu erstellen , aber der Unterschied spielt manchmal eine Rolle.Versuchen wir ein Beispiel zu nehmen und zu verstehen:
Ich habe einen Zweig, sagen wir Master , der auf X <commit-id> zeigt, und ich habe einen neuen Zweig, der auf Y <sha1> zeigt.
Wobei Y <commit-id> = <master> Zweig festschreibt - wenige Festschreibungen
Sagen wir nun für den Y-Zweig, ich muss die Commits zwischen dem Hauptzweig und dem neuen Zweig schließen. Nachfolgend finden Sie die Vorgehensweise, die wir befolgen können:
Schritt 1:
Dabei ist local der Filialname. Jeder Name kann angegeben werden.
Schritt 2:
Führen Sie die Commits vom Hauptzweig zum neuen Zweig zusammen und erstellen Sie ein Zusammenführungs-Commit der Protokollnachricht mit einzeiligen Beschreibungen von höchstens <n> tatsächlichen Commits, die zusammengeführt werden.
Weitere Informationen und Parameter zu Git Merge finden Sie unter:
Wenn Sie ein bestimmtes Commit zusammenführen müssen, können Sie Folgendes verwenden:
quelle
Y
in deinem 3D-Satz geändert ? "Ich habe einen neuen Zweig, der auf Y zeigt" vs "Jetzt sag für Y-Zweig", klingt wie Y war früher ein Commit und dann wurde es ein ZweigIn meinem Anwendungsfall hatten wir einen ähnlichen Bedarf an CI-CD. Wir haben Git Flow mit Entwicklungs- und Master-Zweigen verwendet. Entwickler können ihre Änderungen direkt zusammenführen, um sie zu entwickeln, oder über eine Pull-Anfrage aus einem Feature-Zweig. Um dies zu meistern, führen wir jedoch nur die stabilen Commits aus dem Entwicklungszweig automatisiert über Jenkins zusammen.
In diesem Fall ist Kirschpflücken keine gute Option. Wir erstellen jedoch einen lokalen Zweig aus der Commit-ID und führen diesen lokalen Zweig dann zusammen, um mvn clean verify zu meistern und durchzuführen (wir verwenden maven). Wenn dies erfolgreich ist, geben Sie das Artefakt der Produktionsversion mithilfe des Maven-Release-Plugins mit der Option localCheckout = true und pushChanges = false an nexus frei. Wenn alles erfolgreich ist, schieben Sie die Änderungen und das Tag zum Ursprung.
Ein Beispielcode-Snippet:
Angenommen, Sie sind auf dem Master, wenn Sie dies manuell tun. Bei Jenkins befinden Sie sich jedoch beim Auschecken des Repos im Standardzweig (Master, falls konfiguriert).
Dies gibt Ihnen die volle Kontrolle mit einer furchtlosen Verschmelzung oder Konflikthölle.
Fühlen Sie sich frei zu beraten, falls es eine bessere Option gibt.
quelle
In den wichtigsten Antworten wird beschrieben, wie Sie die Änderungen aus einem bestimmten Commit auf den aktuellen Zweig anwenden . Wenn Sie das mit "Zusammenführen" meinen, verwenden Sie einfach Cherry-Pick, wie sie vorschlagen.
Aber wenn Sie tatsächlich eine Zusammenführung wünschen , dh Sie möchten eine neue Verpflichtung mit zwei Eltern - das vorhandene Commit für den aktuellen Zweig und das Commit, von dem aus Sie Änderungen anwenden -, kann ein Cherry-Pick dies nicht erreichen.
Ein echter Zusammenführungsverlauf kann beispielsweise wünschenswert sein, wenn Ihr Erstellungsprozess die Git-Abstammung nutzt, um automatisch Versionszeichenfolgen basierend auf dem neuesten Tag (unter Verwendung
git describe
) festzulegen .Anstelle von Cherry-Pick können Sie eine tatsächliche
git merge --no-commit
und dann den Index manuell anpassen, um alle Änderungen zu entfernen, die Sie nicht möchten.Angenommen, Sie befinden sich in einer Verzweigung
A
und möchten das Commit an der Spitze der Verzweigung zusammenführenB
:Jetzt können Sie ein Commit mit zwei Elternteilen erstellen, die aktuellen Tipp-Commits von
A
undB
. Möglicherweise werden jedoch mehr Änderungen angewendet, als Sie möchten, einschließlich Änderungen aus früheren Commits im B-Zweig. Sie müssen diese unerwünschten Änderungen rückgängig machen und dann festschreiben.(Es gibt möglicherweise eine einfache Möglichkeit, den Status des Arbeitsverzeichnisses und des Index auf den Stand vor dem Zusammenführen zurückzusetzen, sodass Sie eine saubere Tabelle haben, auf der Sie das gewünschte Commit auswählen können ich weiß nicht , wie das reine Weste zu erreichen.
git checkout HEAD
undgit reset HEAD
werde sowohl den Fusions - Zustand entfernen, um den Zweck dieses Verfahrens zu besiegen.)Machen Sie die unerwünschten Änderungen manuell rückgängig. Zum Beispiel könnten Sie
für jedes unerwünschte Commit
012ea56
.Wenn Sie mit dem Anpassen fertig sind, erstellen Sie Ihr Commit:
Jetzt haben Sie nur die gewünschte Änderung, und der Ahnenbaum zeigt, dass Sie technisch von B zusammengeführt wurden.
quelle