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



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



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

674   8  

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 несколько push is (возможно, вы нажали на свою собственную ветку много коммитов, и теперь вы хотите сделать запрос на вытягивание, и вы не хотите загромождать их многими коммитами, которые вы уже нажали). То, как я это делаю (насколько я могу судить, нет другого более простого варианта).

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

пример:

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) и открыть контекстное меню (щелкните правой кнопкой мыши), чтобы раздавить ваши коммиты.

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

enter image description here

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

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

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

Comments

    Ничего не найдено.