Объединение нескольких коммитов перед нажатием в Git [duplicate]

этот вопрос уже есть ответ здесь:

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

8 ответов


то, что вы хотите сделать, называется "раздавить" в git. Есть много вариантов, когда вы делаете это (слишком много?) но если вы просто хотите объединить все ваши непущенные коммиты в один коммит, сделайте следующее:

git rebase -i origin/master

это вызовет ваш текстовый редактор (-i для "interactive") с файлом, который выглядит следующим образом:

pick 16b5fcc Code in, tests not passing
pick c964dea Getting closer
pick 06cf8ee Something changed
pick 396b4a3 Tests pass
pick 9be7fdb Better comments
pick 7dba9cb All done

изменить все pick до squash (или s) кроме первого:

pick 16b5fcc Code in, tests not passing
squash c964dea Getting closer
squash 06cf8ee Something changed
squash 396b4a3 Tests pass
squash 9be7fdb Better comments
squash 7dba9cb All done

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

вуаля! Googling "git squashing" даст вам объяснения всех других доступных вариантов.


Если у вас много коммитов, и вы хотите только раздавить последние X коммитов, найдите идентификатор коммита коммита, из которого вы хотите начать раздавить и сделать

git rebase -i <that_commit_id>

затем продолжайте, как описано в ответе леопда, изменяя все picks до squashes за исключением первого.


здесь довольно много рабочих ответов, но я нашел это самым простым. Эта команда откроет редактор, в котором вы можете просто заменить pick С squash для того чтобы удалить/объединить их в один

git rebase -i HEAD~4

здесь 4 - это количество коммитов, которые вы хотите раздавить в один. Это объясняется здесь как хорошо.


вы можете сделать это с помощью git rebase -i, передавая ревизию, которую вы хотите использовать в качестве 'root':

git rebase -i origin/master

откроется окно редактор показывает все коммиты, которые вы сделали после последнего коммита в origin/master. Вы можете отклонять коммиты, сквош-коммиты в один коммит или редактировать предыдущие коммиты.

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

http://book.git-scm.com/4_interactive_rebasing.html

и

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

первые две хорошие страницы, которые я смог найти.


Я придумал

#!/bin/sh

message=`git log --format=%B origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft origin
git commit -m "$message"

объединяет, сортирует, объединяет и удаляет пустые строки из сообщения фиксации. Я использую это для локальных изменений в GitHub wiki (используя gollum)


и мой способ squashing несколько push is (возможно, вы нажали на свою собственную ветку много коммитов, и теперь вы хотите сделать запрос на вытягивание, и вы не хотите загромождать их множеством коммитов, которые вы уже нажали). То, как я это делаю (насколько я могу судить, нет другого более простого варианта).

  1. создать новую ветку ради squash (ветвь от исходной ветви, на которую вы хотите вытащить запрос).
  2. нажимаем созданного отделение.
  3. объединить ветку с фиксацией (уже нажатой) в новую ветку.
  4. Rebase новая ветка и сквош.
  5. нажимаем новую ветку.
  6. создать новый запрос pull для новой ветви, которая теперь имеет одну фиксацию.

пример:

git checkout from_branch_you_wish_to_pull_request_to
git checkout -b new_branch_will_have_single_squashed_commit
git push -u new_branch_will_have_single_squashed_commit
git merge older_branch_with_all_those_multiple_commits
git rebase -i (here you squash)
git push origin new_branch_will_have_single_squashed_commit

теперь вы можете вытащить запрос в from_branch_you_wish_to_pull_request_to


вы можете раздавить (присоединиться) коммиты с помощью Интерактивные Перебазирования. Существует довольно хорошее видео YouTube, которое показывает, как это сделать в командной строке или с SmartGit:

Если вы уже являетесь пользователем SmartGit, вы можете выбрать все исходящие коммиты (удерживая клавишу Ctrl) и открыть контекстное меню (щелкните правой кнопкой мыши), чтобы раздавить ваши коммиты.

Это очень удобно:

enter image description here

есть также очень хороший учебник от компании Atlassian, который показывает, как это работает:


вы, вероятно, хотите использовать Интерактивные Перебазирования, который подробно описан в этой ссылке.

вы можете найти другие хорошие ресурсы, если вы ищете "git rebase interactive".