Мерзавец: Как создать патчи для слияния?

Когда я использую 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

26
задан geofflee 18 February 2010 в 01:21
поделиться

2 ответа

Если вы изучите содержимое первых двух патчей, вы увидите проблему:

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.

5
ответ дан 28 November 2019 в 07:08
поделиться

Обратите внимание, что чистый git log -p не отображает никакого содержимого патча для фиксации слияния «M», но использование git log -p -c действительно уговаривает его . Однако git format-patch не принимает никаких аргументов, аналогичных -c (или - вместе , -cc ). принято git log .

Я тоже остаюсь в тупике.

9
ответ дан 28 November 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: