Как применить два патча к одной и той же версии git? - PullRequest
12 голосов
/ 07 марта 2011

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

A - B - C

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

A - B - C - C1

Возможно ли применить их оба, или ядолжен ответить человеку, отправляющему C2 и сообщив ему / ей об обновлении патча?

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

A - B - C - D - E

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

Ответы [ 3 ]

8 голосов
/ 07 марта 2011

Классическим способом является:

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

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

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

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

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

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

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

5 голосов
/ 07 марта 2011

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

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

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

3 голосов
/ 08 марта 2011

Вы можете, по крайней мере, попробовать , чтобы применить все эти патчи.Возможно, у вас могут возникнуть конфликты слияния, и, как предполагает 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, чтобы исправить это на своем конце.(* 1 010 *)

...