Когда я использую git format-patch
, это, кажется, не включает слияния. Как я могу выполнить слияние и затем послать его по электронной почте кому-то как ряд патчей?
Например, скажем, то, что я объединяю два ответвления и выполняю другую фиксацию сверху слияния:
git init
echo "initial file" > test.txt
git add test.txt
git commit -m "Commit A"
git checkout -b foo master
echo "foo" > test.txt
git commit -a -m "Commit B"
git checkout -b bar master
echo "bar" > test.txt
git commit -a -m "Commit C"
git merge foo
echo "foobar" > test.txt
git commit -a -m "Commit M"
echo "2nd line" >> test.txt
git commit -a -m "Commit D"
Это создает следующее дерево:
B
/ \
A M - D
\ /
C
Теперь я пробую к контролю начальную фиксацию и воспроизвожу вышеупомянутые изменения:
git checkout -b replay master
git format-patch --stdout master..bar | git am -3
Это производит конфликт слияния. В этом сценарии, git format-patch master..bar
только производит 3 патча, опуская "Фиксацию M". Как я имею дело с этим?
- Geoffrey Lee
Если вы изучите содержимое первых двух патчей, вы увидите проблему:
diff --git a/test.txt b/test.txt
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-initial file
+foo
diff --git a/test.txt b/test.txt
index 7c21ad4..5716ca5 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-initial file
+bar
с точки зрения ветки, над которой вы работали в то время (foo и bar), оба этих коммита удалили "начальный file "и полностью заменил ее чем-то другим. AFAIK, нет способа избежать такого конфликта, когда вы генерируете патч нелинейной прогрессии с перекрывающимися изменениями (в этом случае ваша ветка фиксирует B и C).
Люди обычно используют патчи для добавления одной функции или исправления ошибки из заведомо исправного предыдущего рабочего состояния - протокол исправления просто недостаточно сложен для обработки истории слияния, как это делает Git изначально. Если вы хотите, чтобы кто-то увидел ваше слияние, вам нужно нажимать / тянуть между ветвями, а не отбрасывать diff / patch.
Обратите внимание, что чистый git log -p
не отображает никакого содержимого патча для фиксации слияния «M», но использование git log -p -c
действительно уговаривает его . Однако git format-patch
не принимает никаких аргументов, аналогичных -c
(или - вместе
, -cc
). принято git log
.
Я тоже остаюсь в тупике.