1350 Stimmen

Wie man einen bestimmten Commit in Git zusammenführt

Ich habe einen Zweig aus einem Repository in GitHub geforkt und etwas für mich Spezifisches committed. Jetzt habe ich festgestellt, dass das ursprüngliche Repository eine gute Funktion hatte, die bei HEAD .

Ich möchte sie nur ohne vorherige Übertragungen zusammenführen. Was soll ich tun? Ich weiß, wie man alle Commits zusammenführt:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push

29voto

Wenn Sie Änderungen am Master-Zweig vorgenommen haben. Nun möchten Sie denselben Commit in den Release-Zweig verschieben. Überprüfen Sie die Commit-ID (z.B.:xyzabc123) für den Commit.

Versuchen Sie nun folgende Befehle

git checkout release-branch
git cherry-pick xyzabc123
git push origin release-branch

26voto

LarsH Punkte 26458

Die wichtigsten Antworten beschreiben, wie man die Änderungen aus eine bestimmte Übergabe an den aktuellen Zweig. Wenn es das ist, was Sie mit "wie man zusammenführt" meinen, dann benutzen Sie einfach Cherry-Pick, wie sie es vorschlagen.

Aber wenn Sie tatsächlich eine zusammenführen d.h. Sie wollen eine neue Übertragung mit zwei Elternteilen -- der existierende Commit auf dem aktuellen Zweig und der Commit, von dem Sie Änderungen übernehmen wollten -- dann wird ein Cherry-Pick das nicht erreichen.

Eine echte Merge-Historie kann zum Beispiel wünschenswert sein, wenn Ihr Build-Prozess die Vorteile von Git-Acestry nutzt, um automatisch Versionsstrings auf der Grundlage des letzten Tags zu setzen (mit git describe ).

Anstelle der Rosinenpickerei können Sie auch eine tatsächliche git merge --no-commit und passen Sie dann den Index manuell an, um alle unerwünschten Änderungen zu entfernen.

Angenommen, Sie sind in einer Zweigstelle A und Sie wollen die Übergabe an der Spitze des Zweigs zusammenführen B :

git checkout A
git merge --no-commit B

Jetzt sind Sie in der Lage, einen Commit mit zwei Elternteilen zu erstellen, den aktuellen Tip-Commits von A y B . Es kann jedoch sein, dass Sie mehr Änderungen angewendet haben, als Sie wollten, einschließlich Änderungen aus früheren Übertragungen auf dem B-Zweig. Sie müssen diese unerwünschten Änderungen rückgängig machen und dann übertragen.

(Es gibt vielleicht eine einfache Möglichkeit, den Zustand des Arbeitsverzeichnisses und des Index auf den Stand vor der Zusammenführung zurückzusetzen, so dass Sie eine saubere Weste haben, aus der Sie den Commit, den Sie ursprünglich wollten, herauspicken können. Aber ich weiß nicht, wie man diesen Neustart erreichen kann. git checkout HEAD y git reset HEAD werden beide den Verschmelzungsstatus entfernen, was den Zweck dieser Methode zunichte macht).

Machen Sie daher die unerwünschten Änderungen manuell rückgängig. Sie könnten zum Beispiel

git revert --no-commit 012ea56

für jede unerwünschte Übertragung 012ea56 .

Wenn Sie mit den Anpassungen fertig sind, erstellen Sie Ihr Commit:

git commit -m "Merge in commit 823749a from B which tweaked the timeout code"

Jetzt haben Sie nur noch die gewünschte Änderung, und der Stammbaum zeigt, dass Sie technisch gesehen aus B hervorgegangen sind.

13voto

Rishabh Agarwal Punkte 1631

Wir müssen die git cherry-pick <commit-number>

Szenario: Ich befinde mich in einem Zweig namens Release und möchte nur wenige Änderungen aus dem Master-Zweig in den Release-Zweig übernehmen.

Schritt 1: Checken Sie den Zweig aus, dem Sie die Änderungen hinzufügen wollen

git checkout release

Schritt 2: Ermitteln Sie die Commit-Nummer der Änderungen, die Sie hinzufügen möchten

zum Beispiel

git cherry-pick 634af7b56ec

Schritt 3: git push

Hinweis: Für jede Zusammenführung wird eine eigene Commit-Nummer erstellt. Nehmen Sie nicht die Commit-Nummer für das Merge, das wird nicht funktionieren. Nehmen Sie stattdessen die Commit-Nummer für jeden regulären Commit, den Sie hinzufügen möchten.

7voto

nrkkalyan Punkte 169

In meinem Anwendungsfall hatten wir einen ähnlichen Bedarf an einer CI-CD. Wir verwendeten Git Flow mit Entwicklungs- und Master-Zweigen. Den Entwicklern steht es frei, ihre Änderungen direkt in den Entwicklungszweig oder über eine Pull-Anfrage aus einem Feature-Zweig einzubringen. In den Master-Zweig führen wir jedoch nur die stabilen Commits aus dem Entwicklungszweig automatisiert über Jenkins ein.

In diesem Fall ist die Rosinenpickerei keine gute Option. Wir erstellen jedoch einen lokalen Zweig mit der Commit-ID, führen diesen lokalen Zweig mit Master zusammen und führen mvn clean verify durch (wir verwenden Maven). Bei Erfolg wird das Artefakt der Produktionsversion mit dem Maven Release Plugin mit der Option localCheckout=true und pushChanges=false an Nexus freigegeben. Schließlich, wenn alles erfolgreich ist, werden die Änderungen und das Tag zum Ursprung gepusht.

Ein Beispiel für einen Codeschnipsel:

Vorausgesetzt, Sie befinden sich auf dem Master, wenn dies manuell geschieht. Jedoch auf Jenkins, wenn Sie das Repo auschecken, werden Sie auf dem Standard-Zweig (Master, wenn konfiguriert) sein.

git pull  // Just to pull any changes.
git branch local-<commitd-id> <commit-id>  // Create a branch from the given commit-id
git merge local-<commit-id>  // Merge that local branch to master.
mvn clean verify   // Verify if the code is build able
mvn <any args> release:clean release:prepare release:perform // Release artifacts
git push origin/master  // Push the local changes performed above to origin.
git push origin <tag>  // Push the tag to origin

So haben Sie die volle Kontrolle über eine furchtlose Verschmelzung oder eine Konflikthölle.

Falls es eine bessere Option gibt, bitte ich um Rat.

4voto

Harikrushna Patel Punkte 101

Wenn Sie Cherrypick noch nicht kennen, probieren Sie die GitHub-Desktop-Version aus. Wenn Sie die Cherrypick-Option auswählen, werden Sie von GitHub aufgefordert, den Zweig auszuwählen, für den Sie eine Übergabe durchführen möchten.

1)

enter image description here

2)

enter image description here

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