Есть ветка, в которой последовательно лежит 13 коммитов. Есть нормальный способ их объединить?
А по сути, я могу перейти в основную ветку и перекинуть в нее только последний
помощь cherry-pick, т.к. он содержит в себе актуальную версию, что и нужно в итоге. Хотя могу ошибаться
Ответы
Ответ 1
Пусть вы хотите склеить последние три коммита (для 13-ти коммитов процесс выгляди
аналогично). Для этого есть отличный метод с использованием git rebase. Эта команда позволяет изменять историю коммитов. Алгоритм работы выглядит следующим образом:
Сделайте резервную копию. Это совсем не обязательно, но поможет сохранить нервные клетки, если что-то пойдет не так. Варианты:
Копия каталога с файлами в котором развернут git репозиторий.
git branch backup или git tag backup в последнем коммите.
Прочитать справку по командам reflog и reset и знать, что бэкапы уже есть.
Избавьтесь от незакоммиченных изменений (git add + git commit или git stash или что-то еще).
Выполните git rebase -i HEAD~3. В ответ на это вы получите "диалог" (окно редактирования файла) вида:
pick bcdca61 Second commit
pick 4643a5f The third commit with cool stuff
pick e0ca8b9 The last commit
# Rebase 48411de..e0ca8b9 onto 48411de
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
при этом, коммиты указаны в порядке возрастания времени создания (самый нижний -- самый свежий).
В "диалоге" из п.2 вам нужно заменить pick на squash для двух самых свежих коммитов (две нижние строки). В примере выше, это должно выглядеть вот так:
pick bcdca61 Second commit
squash 4643a5f The third commit with cool stuff
squash e0ca8b9 The last commit
# Rebase 48411de..e0ca8b9 onto 48411de
#
# ...
После этого вы должны закрыть этот "диалог" (сохранить редактируемый файл). Есл
для работы с git используется vi (по умолчанию), то это делается последовательным нажатием ESC, вводом :wq и нажатием Enter.
В следующем "диалоге" вам предложат указать заголовок для получившегося коммита.
Вот здесь, есть развернутая информация о том, как перезаписывать историю в git.
Ответ 2
Есть вот такой, довольно деструктивный метод (пример слияния последних 12 коммитов):
# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12
# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}
# Commit those squashed changes. The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit
Взято отсюда: https://stackoverflow.com/questions/5189560/squash-my-last-x-commits-together-using-git
Комментариев нет:
Отправить комментарий