Как отправить патч другому разработчику и избежать конфликтов слияния?

Как получить патч из коммита, чтобы отправить его другому разработчику? И как мне лучше избежать конфликта слияния с этим патчем при слиянии наших деревьев позднее?

Если вы знаете, как, пожалуйста, объясните, как это сделать в выбранной вами VCS, такой как subversion, git, Mercurial, bzr или т. Д.

4 ответа

Решение

В Git вы можете передать вывод git-diff между двумя коммитами вот так:

git diff fa1afe1 deadbeef > patch.diff

Отправить patch.diff разработчику и пусть он git-apply это в его рабочее пространство, как это:

git apply patch.diff

Если у другого разработчика уже есть коммиты, доступные в его репозитории, он всегда может передать его в себя, не сливаясь так:

git apply < git diff fa1afe1 deadbeef

Затем вы можете добавить и зафиксировать изменения в diff обычным способом.


Теперь начинается интересная часть, когда вам нужно объединить патч с основной веткой (которая является публичной). Рассмотрим следующее дерево ревизий, где C* применяется патч от C в мастер ветке:

A---B---C---D          master, public/master
     \
      E---C*---F       feature_foo

Ты можешь использовать git-rebase обновить ветку темы (в этом примере feature_foo с головой вверх по течению. Это означает, что вы вводите следующее:

git rebase master feature_foo

Git перестроит дерево ревизий следующим образом, а также применит сам патч:

A---B---C---D          master, public/master
             \
              E*---F*  feature_foo

Слияние с вышестоящей ветвью теперь будет простым быстрым слиянием. Также проверьте, что новые коммиты E* а также F* работать как предыдущий E а также F соответственно.

Вы можете сделать то же самое в отношении ветки другого разработчика, используя те же шаги, но вместо того, чтобы делать это в общедоступном репозитории, вы будете получать ревизии из репозитория разработчика. Таким образом, вам не придется спрашивать у другого разработчика патч, если он уже доступен из того, что он опубликовал в своем репо.

Обратите внимание, что никогда не перебазируйте публичную ветку, потому что команда переписывает git history, что вы не хотите делать в ветках, от которых зависят люди, и создаст беспорядок при слиянии с удаленными репозиториями. Также никогда не забывайте часто интегрироваться, чтобы другие члены вашей команды могли принять участие в ваших изменениях.

В SVN вы можете просто внести свои изменения, а затем перед передачей направить вывод svn diff в файл как таковой.

svn diff > mypatch.diff

Затем вы можете отменить изменения и применить исправление позже, используя

patch -p0 -i mypatch.diff

Как всегда, не применяйте патчи вслепую к вашему коду и всегда сначала проверяйте их.

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

Вы также не можете гарантировать, что не будет конфликтов слияния при попытке проверить код.

Bzr обрабатывает отправку "директивы слияния", то есть отправляет патч для вас, чтобы другая сторона могла просто нажать "OK" для слияния, и было меньше проблем с патчем / применением и т. Д.

просто: $ bzr отправить -o mycode.patch

В Subversion нет хорошего способа сделать это. Да, вы можете использовать svn diff + patch, но это только откладывает ваши проблемы до тех пор, пока вы не собираетесь объединяться, и к тому времени, скорее всего, вы забыли об этом.

В Subversion вы можете создать ветку, выполнить коммит на ветке и попросить получателя патча переключиться на ветку. Затем вы можете слить ветку обратно в ствол обычным способом.

Другие вопросы по тегам