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

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

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

Ответ 1

В git вы можете вывести вывод git-diff между двумя коммитами:

git diff fa1afe1 deadbeef > patch.diff

Отправьте patch.diff разработчику и позвольте ему git-apply его в свое рабочее пространство следующим образом:

git apply patch.diff

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

git apply < git diff fa1afe1 deadbeef

Затем вы можете add и commit изменения в 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 соответственно.

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

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

Ответ 2

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

svn diff > mypatch.diff

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

patch -p0 -i mypatch.diff

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

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

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

Ответ 3

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

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

Ответ 4

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

То, как вы делали это в Subversion, было бы создать ветку, выполнить фиксацию в ветке и попросить получателя патча переключиться на ветвь. Затем вы можете объединить ветку обратно в магистраль обычным способом.