Подтвердить что ты не робот

Как применить два патча к той же версии git?

Это мнимая проблема, но у меня настоящие проблемы с исправлениями. Скажем, у меня есть проект со следующей историей git:

A - B - C

Теперь, если я получаю два патча, C1 и C2, которые должны применяться к C, как я должен их обрабатывать? Если сначала применить patch C1, тогда я не смогу применить patch C2, потому что репозиторий стал:

A - B - C - C1

Можно ли применить их оба, или мне нужно ответить человеку, отправляющему C2, чтобы он обновил патч?

Теперь предположим, что я выхожу в автономный режим и работаю и фиксирую, чтобы репозиторий стал:

A - B - C - D - E

Затем я проверяю свою электронную почту и получаю патч для C. Опять же, можно ли просто применить этот патч, или мне нужно попросить обновление патча?

4b9b3361

Ответ 1

Классический способ:

  • применить полученный первый патч,
  • отказаться от патча, который не ускорен, и попросить отправителя сначала восстановить его репо, а затем повторно проверить патч и повторно отправить его.

Общая идея заключается в том, что вам не решать конфликты слияния: только создатель патча обладает необходимыми знаниями для разрешения любого конфликта с текущим исходным кодом.

Как Линус Торвальдс (создатель Git) сказал в свой 2007-й разговор Google:

Итак, что происходит, помните, что распределение означает, что никто не является особенным.
Поэтому вместо того, чтобы меня сливать, я просто выталкиваю свое первое дерево, у которого не было проблем с слиянием, и я говорю второму человеку:

"Эй, я пытался оттолкнуться от тебя, но у меня были конфликты слияния, и они были не совсем тривиальными, поэтому я решил, что ты вместо этого сделаешь почести".

И они это делают. И они знают, что они делают, потому что это их изменения. Таким образом, они могут делать слияния, и они, вероятно, думают, что я идиот, потому что слияние было таким простым, и очевидно, что я должен был взять их код, но они делают слияние, и они обновляют свое дерево и говорят: "эй, от меня сейчас", и я тяну от них, и они сделали для меня всю работу.

Что это значит: они сделали для меня всю работу. Итак... и я беру кредит. Теперь мне просто нужно выяснить шаг 3: прибыль.

Ответ 2

В большинстве случаев C2 будет применяться поверх C1. Это только в том случае, если они редактируют для перекрытия разделов тех же файлов, что и конфликт слияния. Git возьмет все части патча, которые не конфликтуют, и вставьте маркеры конфликтов, которые помогут вам решить слияние.

Что касается того, что нужно делать, это зависит от того, насколько велик ваш проект и насколько вы компетентны в этом разделе кода. Я всегда просто исправлял конфликты самостоятельно, пока заявитель использовал достаточно недавнюю проверку как основу для их патча.

Другой комментатор упомянул цитату Линуса, в которой говорилось, что он всегда заставляет других людей разрешать конфликты, но даже это не совсем так; он часто просит людей оставить конфликты нерешенными при отправке запросов на тягу, чтобы он сделал снимок.

Ответ 3

Вы можете, по крайней мере, попытаться применить все эти исправления. Возможно, вы можете получить конфликты слияния, и, как предлагает VonC, вы можете захотеть, чтобы получатели патча решали их, или вы можете сделать это сами, как говорит cjb! В любом случае, вот что вы хотите сделать.

Первый случай: два патча, C1 и C2.

# apply C1
git am C1.patch
# create a temporary branch (use a real name instead of C2)
git checkout -b C2 C
# apply C2
git am C2.patch
# return to master
git checkout master
# merge the other branch
git merge C2
# and delete the other branch
git branch -d C2

Аналогичным образом вы можете обрабатывать второй случай; это просто, что вместо применения C1 вы совершили совершение D и E самостоятельно.

И, конечно, если слияние не удастся, и вам будет слишком страшно разбираться в себе, просто уберите его и скажите подателю C2, чтобы исправить это на их конце. (git reset --merge; git branch -D C2)