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:
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
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"
10181200cookie-checkSkript zum automatischen Zusammenführen von 2 Git-Zweigen?yes
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 machenmerge --nosquash
? Wäre es nicht sauberer, einfachgit checkout master && git reset origin/develop && git reset --soft HEAD@{1}
oder ähnliches?– CB Bailey
20. Dezember 2011 um 9:24 Uhr