Skript zum automatischen Zusammenführen von 2 Git-Zweigen?

Lesezeit: 3 Minuten

Mein Git-Repository hat 2 Branches: Master und Develop. Ich möchte ein Skript, das alle Änderungen von der Entwicklung zum Master automatisch zusammenführt.

Ich habe Jenkins verwendet: Das Git-Plugin klont das Repository und dann wird dieses Skript (die Variable „version“ ist ein Jobparameter) ausgeführt:

# merge
git checkout -b develop origin/develop
git checkout master
git merge -Xtheirs --squash develop -m "v${version}"

# commit
git commit -m "v${version}"

# tag
git tag v${version} -m "v${version}"

# push
git push origin v${version}

Ich habe es in einem Test-Repository versucht und es schlägt fehl mit:

git merge -Xtheirs entwickeln
CONFLICT (Löschen/Ändern): test.txt in der Entwicklung gelöscht und in HEAD geändert. Version HEAD von test.txt links im Baum.
Automatische Zusammenführung fehlgeschlagen; Konflikte beheben und das Ergebnis dann festschreiben.

Wie löse ich diesen Konflikt automatisch? Ich möchte, dass das Skript immer Dateien gemäß dem Zweig „Entwickeln“ hinzufügt / ändert / löscht, da der Master sowieso nie berührt wird …

  • Sie sagen, dass “der Meister nie berührt wird”, aber Sie bekommen trotzdem einen Konflikt? Wenn es tatsächlich nie eine Berührung wäre, eine einfache git merge --ff-only origin/develop wäre genug.

    – fg

    20. Dezember 2011 um 9:19 Uhr

  • Wenn Sie wollen ersetzen die Master-Version mit der origin/develop Version und keinen Merge-Commit aufzeichnen, warum sich die Mühe machen merge --nosquash? Wäre es nicht sauberer, einfach git checkout master && git reset origin/develop && git reset --soft HEAD@{1} oder ähnliches?

    – CB Bailey

    20. Dezember 2011 um 9:24 Uhr

Benutzer-Avatar
Markus Longair

Das -X theirs Die Zusammenführungsstrategie funktioniert nur, um widersprüchliche Hunks innerhalb einer Datei aufzulösen. Die Dokumentation für diese Optionen ist in das git-merge Manpage:

      ours
           This option forces conflicting hunks to be auto-resolved
           cleanly by favoring our version. Changes from the other tree
           that do not conflict with our side are reflected to the merge
           result.

           This should not be confused with the ours merge strategy, which
           does not even look at what the other tree contains at all. It
           discards everything the other tree did, declaring our history
           contains all that happened in it.

       theirs
           This is opposite of ours.

In diesem Fall hat ein Zweig die Datei gelöscht, während der andere sie geändert hat, was ein anderer Fall ist als ein einfacher Konflikt zwischen zwei Zweigen, die unterschiedliche Änderungen vorgenommen haben.

  • Gibt es eine Möglichkeit, Git dazu zu bringen, automatisch “Datei löschen” auszuwählen, wenn einer sie gelöscht hat?

    – Nigel Thorne

    21. Juli 2014 um 4:16 Uhr

5 Jahre alt…. Aber immer noch aktuell.

Hier ist meine Lösung: Ich lösche den Master-Branch und erstelle einen neuen Master-Branch aus dem Branch, aus dem ich „zusammenführen“ möchte:

GIT_BRANCH_TO_MERGE_FROM=`git symbolic-ref HEAD | sed 's!refs\/heads\/!!'`
GIT_BRANCH_TO_MERGE_TO="master"

git checkout "${GIT_BRANCH_TO_MERGE_TO}"
git checkout "${GIT_BRANCH_TO_MERGE_FROM}"

# Delete TO branch
git branch -D "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to delete ${GIT_BRANCH_TO_MERGE_TO}"
git push origin :"${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} delete to origin"

# Create TO branch
git checkout -b "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to create local branch ${GIT_BRANCH_TO_MERGE_TO}"
git push origin "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} to origin"

1018120cookie-checkSkript zum automatischen Zusammenführen von 2 Git-Zweigen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy