Git слияния уплощения - PullRequest
       27

Git слияния уплощения

40 голосов
/ 24 апреля 2009

Если я работаю в нескольких ветках над одной функцией, я использую git pull branch1 branch2 branch3, чтобы перенести все изменения в основную ветку. Однако все журналы фиксации каждой ветви также копируются. Как свести журнал фиксации к одному сообщению?

Ответы [ 3 ]

71 голосов
/ 24 апреля 2009

"git merge --squash" (после "git fetch"; "git pull" - просто выборка + слияние, возможно, он также позволяет параметр --squash) может быть тем, что вы хотите.

С git-merge (1) :

- сквош

Создает рабочее дерево и состояние индекса, как если бы произошло реальное слияние, но на самом деле не делает коммит, не перемещает HEAD и не записывает $GIT_DIR/MERGE_HEAD, чтобы следующая команда git commit создала коммит слияния. Это позволяет вам создать одиночный коммит поверх текущей ветви, эффект которого аналогичен слиянию другой ветви (или более в случае осьминога).

25 голосов
/ 24 апреля 2009

Вы можете использовать интерактивные rebase и "раздавить" коммиты - см. Также учебник Git Ready по сквошу через rebase . Извините, что просто добавил ссылку на вас, но это довольно подробное руководство. О, и это также хорошо раздавит ваши слияния.

8 голосов
/ 02 сентября 2015

Как заметил Брайан Уайт, проблема с git merge --squash заключается в том, что он не дает вам видимой связи и, следовательно, не отслеживает обратную ветвь (или отдельные изменения), с которой вы слились.

Видимо (если смотреть в виде графика git log --graph), важная ветвь, которая была объединена обратно, не отличается от экспериментальной ветки, с которой вы облажались и с радостью отбросили бы. Оба просто висят там, не связанные ни с чем. Лично я хочу знать, что определенная ветвь была объединена, поэтому я знаю, что работа выполнена.

Решение, которое работает для меня, заключается в использовании слияния с опцией no-fastforward.

git merge --no-ff somebranch -m "my commit message"

Это вынуждает git создавать единый коммит со всеми включенными изменениями веток, вы можете установить сообщение коммита самостоятельно (если хотите), НО самое важное, оно связывает новый коммит с веткой, в которую он только что слился. Это заметно показывает, что работа над этой веткой завершена, но также позволяет проследить, чтобы увидеть детали отдельных коммитов из объединенной ветки.

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

Примечание. Мне пришлось вручную нарисовать один из разъемов, так как он был таким синим, что его было едва видно.

git log output

...