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 …

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.
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 [email protected]{1}
oder ähnliches?– CB Bailey
20. Dezember 2011 um 9:24 Uhr