Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Как объединить несколько коммитов в один


Есть ветка, в которой последовательно лежит 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

Комментариев нет:

Отправить комментарий