Объединение нескольких коммитов перед нажатием в Git [дубликат]
этот вопрос уже есть ответ здесь:
У меня есть куча коммитов в моем локальном репозитории, которые тематически схожи. Я хотел бы объединить их в одну фиксацию, прежде чем нажимать на пульт. Как мне это сделать? Я думаю rebase значит ли это, но я не могу разобраться в документах.
8 ответов:
то, что вы хотите сделать, называется "раздавливание" в git. Есть много вариантов, когда вы делаете это (слишком много?) но если вы просто хотите объединить все ваши неопущенные коммиты в один коммит, сделайте следующее:
git rebase -i origin/masterэто вызовет ваш текстовый редактор (
-iдля "интерактивного") с файлом, который выглядит так: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сохраните файл и выйдите ваш редактор. Затем откроется другой текстовый редактор, позволяющий объединить сообщения фиксации из всех фиксаций в одно большое сообщение фиксации.
вуаля! Google "git squashing" даст вам объяснения всех других доступных вариантов.
Если у вас много коммитов, и вы хотите только раздавить последние X коммитов, найти идентификатор коммита, из которого вы хотите начать раздавливание и сделать
git rebase -i <that_commit_id>затем продолжайте, как описано в ответе леопда, изменяя все
pickьsquashes кроме первого.
здесь довольно много рабочих ответов, но я нашел это самым простым. Эта команда откроет редактор, где вы можете просто заменить
pickСsquashдля того чтобы удалить/объединить их в одинgit rebase -i HEAD~4здесь
4это количество коммитов, которые вы хотите раздавить в один. Это объясняется здесь как хорошо.
вы можете сделать это с помощью
git rebase -i, передавая ревизию, которую вы хотите использовать в качестве "корня":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несколькоpushis (возможно, вы нажали на свою собственную ветку много коммитов, и теперь вы хотите сделать запрос на вытягивание, и вы не хотите загромождать их многими коммитами, которые вы уже нажали). То, как я это делаю (насколько я могу судить, нет другого более простого варианта).
- создать новую ветку ради
squash(ветвь от исходной ветви вы хотите вытащить запрос).- нажимаем созданного отделение.
- объединить ветку с фиксацией (уже нажатой) в новую ветку.
- перебазировать новую ветку и сквош.
- нажимаем новую ветку.
- создать новый запрос на вытягивание для новой ветви, которая теперь имеет одну фиксацию.
пример:
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
вы можете сквош (join) коммиты с Интерактивные Перебазирования. Существует довольно хороший YouTube видео, которое показывает, как это сделать в командной строке или с SmartGit:
Если вы уже являетесь пользователем SmartGit, вы можете выбрать все исходящие коммиты (удерживая клавишу Ctrl) и открыть контекстное меню (щелкните правой кнопкой мыши), чтобы раздавить ваши коммиты.
Это очень удобно:
есть также очень хороший учебник от Atlassian, который показывает, как это работает:
вы, вероятно, хотите использовать Интерактивные Перебазирования, который подробно описан в этой ссылке.
вы можете найти другие хорошие ресурсы, если вы ищете "git rebase interactive".

Comments