Лучшая стратегия для сквош-коммитов в Git - PullRequest
0 голосов
/ 05 ноября 2018

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

Если я делаю

git checkout master
git merge --squash <feature>

Это может привести к 1 сдавленному коммиту с мастером, но сдавлены ли коммиты на ветви функций?

В качестве альтернативы, я могу сделать перебазирование ветви функции, но тогда мне придется принудительно нажать, потому что коммиты уже были переданы в удаленную ветку. Разве это не плохая практика?

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018
git checkout master
git merge --squash <feature>

приведет к 1 сдавленному коммиту с мастером,

Correct.

но сдавлены ли коммиты в ветви функций?

Нет, или да, или, может быть, "мю": вопрос не имеет смысла. В настоящий момент ветвь объектов фактически dead: ее больше не следует использовать. То, что у вас есть сейчас, можно нарисовать так:

       ABCD   <-- master (HEAD)
      /
...--*
      \
       A--B--C--D   <-- feature

, где ABCD - это один коммит, который делает то же самое, что и последовательность из четырех коммитов A--B--C--D. (Обратите внимание, что до git merge --squash имя master указывало на коммит *.)

Теперь вы можете указать ветку объекта на новый коммит, используя, например, git branch -f feature master, давая:

       ABCD   <-- master (HEAD), feature
      /
...--*
      \
       A--B--C--D   [abandoned]

Обратите внимание, что если вы вместо этого используете:

git checkout <feature>
git rebase -i master

и затем измените три из четырех pick команд на squash, вы стерли старую ветвь функций и создали новую ветвь feature и переместили имя feature, чтобы указать на него, во многом так же. Отличительной особенностью является то, что имя master все еще указывает на его исходную фиксацию, а вы на новой feature:

       ABCD   <-- feature (HEAD)
      /
...--*   <-- master
      \
       A--B--C--D   [abandoned]

Теперь вы можете git checkout master и git merge --ff-only feature получить тот же результат, что и при предыдущем методе git merge --squash.

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

0 голосов
/ 05 ноября 2018

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

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

# assuming you want to squash the 10 latest commits
git checkout X
git reset --soft HEAD~10
git commit -m 'last 10 commits in 1 new commit'

Вы также можете сделать интерактивный ребаз:

git checkout X
git rebase -i HEAD~10

Это вызовет окно с 10 последними коммитами перед заголовком ветви X. Затем вы можете изменить pick на squash для всех коммитов, кроме самого старого (тот, который находится в самом верху). Затем завершите ребаз, и все коммиты будут сдавлены до коммита 10 перед ГОЛОВОЙ.

В обоих случаях у вас должна остаться ветка X с раздавленными коммитами, а затем вы можете объединиться в master.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...