Bei allen oben genannten Optionen werden Sie aufgefordert, Zusammenführungskonflikte aufzulösen. Wenn Sie Änderungen zusammenführen, die für ein Team vorgenommen wurden, ist es schwierig, die Zusammenführungskonflikte von den Entwicklern lösen zu lassen und fortzufahren. Der Befehl "git merge" führt die Zusammenführung in einem Schritt durch, aber man kann keinen Revisionsbereich als Argument übergeben. Wir müssen die Befehle "git diff" und "git apply" verwenden, um einen Revisionsbereich zusammenzuführen. Ich habe festgestellt, dass "git apply" fehlschlägt, wenn die Patchdatei einen Diff für zu viele Dateien hat, also müssen wir einen Patch pro Datei erstellen und dann anwenden. Beachten Sie, dass das Skript nicht in der Lage ist, Dateien zu löschen, die im Quellzweig gelöscht wurden. Dies ist ein seltener Fall, Sie können solche Dateien manuell aus dem Zielzweig löschen. Der Exit-Status von "git apply" ist nicht Null, wenn es nicht in der Lage ist, den Patch anzuwenden. Wenn Sie jedoch die Option -3way verwenden, fällt das Skript auf den 3-Wege-Merge zurück und Sie müssen sich keine Sorgen über diesen Fehler machen.
Nachstehend finden Sie das Skript.
enter code here
#!/bin/bash
# This script will merge the diff between two git revisions to checked out branch
# Make sure to cd to git source area and checkout the target branch
# Make sure that checked out branch is clean run "git reset --hard HEAD"
START=$1
END=$2
echo Start version: $START
echo End version: $END
mkdir -p ~/temp
echo > /tmp/status
#get files
git --no-pager diff --name-only ${START}..${END} > ~/temp/files
echo > ~/temp/error.log
# merge every file
for file in `cat ~/temp/files`
do
git --no-pager diff --binary ${START}..${END} $file > ~/temp/git-diff
if [ $? -ne 0 ]
then
# Diff usually fail if the file got deleted
echo Skipping the merge: git diff command failed for $file >> ~/temp/error.log
echo Skipping the merge: git diff command failed for $file
echo "STATUS: FAILED $file" >> /tmp/status
echo "STATUS: FAILED $file"
# skip the merge for this file and continue the merge for others
rm -f ~/temp/git-diff
continue
fi
git apply --ignore-space-change --ignore-whitespace --3way --allow-binary-replacement ~/temp/git-diff
if [ $? -ne 0 ]
then
# apply failed, but it will fall back to 3-way merge, you can ignore this failure
echo "git apply command filed for $file"
fi
echo
STATUS=`git status -s $file`
if [ ! "$STATUS" ]
then
# status is null if the merged diffs are already present in the target file
echo "STATUS:NOT_MERGED $file"
echo "STATUS: NOT_MERGED $file$" >> /tmp/status
else
# 3 way merge is successful
echo STATUS: $STATUS
echo "STATUS: $STATUS" >> /tmp/status
fi
done
echo GIT merge failed for below listed files
cat ~/temp/error.log
echo "Git merge status per file is available in /tmp/status"
1 Stimmen
draconianoverlord.com/2013/09/07/keine-kirschen-pflücken.html (nicht mein Blog)
5 Stimmen
Der TLDR; ist:
git cherry-pick <one-sha-before-the-oldest-sha-to-pick>..<sha-of-latest-to-pick>