Как не бояться
Я хотел бы показать вам, что, как бы плохо вы ни испортили, коммиты никогда не разрушались *, и вы всегда можете вернуться туда, откуда начали.
Я создал искусственное дерево, которое имеет ту же форму, что и вы:
Теперь я собираюсь стереть последние три коммита из ветки 'backup':
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
$ git reset --hard HEAD~3
HEAD is now at 07e71d9 Merged "getDepsForScript" function
$ git log --oneline
07e71d9 Merged "getDepsForScript" function
...
Упс, это было плохо. Вернемся к тому, с чего начали. Сначала посмотрим, что мы сделали:
$git reflog
07e71d9 HEAD@{0}: HEAD~3: updating HEAD
9b41f46 HEAD@{1}: commit: Removed extraneous whitespace
...
Вы можете видеть, что когда мы перезагружались, все, что делал git, это заставляли HEAD указывать на этот старый коммит. Но никакие коммиты на самом деле не были потеряны - они просто стали сиротами, а не частью какой-либо ветви. Давайте снова сделаем их частью «резервной» ветки:
$ git reset --hard 9b41f46
HEAD is now at 9b41f46 Removed extraneous whitespace
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
Git означает, что вам никогда не придется извиняться.
* Свободные объекты в конечном итоге собирают мусор, но только до тех пор, пока им не исполнится как минимум две недели.
Как делать то, что вы хотите.
Сначала давайте скомбинируем два коммита в master:
$ git checkout master
$ git rebase -i HEAD~2
Git запустит ваш редактор. Изменить это:
pick 6389f4e Moved "loaded" function out of "require".
pick 41fb646 comma
на это:
pick 6389f4e Moved "loaded" function out of "require".
s 41fb646 comma
И сохранить. Git снова запустит ваш редактор. Изменить это:
# This is a combination of two commits.
# The first commit's message is:
Moved "loaded" function out of "require".
# This is the 2nd commit message:
comma
на это:
Moved "loaded" function out of "require".
и сохраните.
Теперь давайте изменим порядок коммитов в 'backup':
$ git checkout backup
$ git rebase -i remotes/origin/master
Когда появится ваш редактор, измените это:
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
pick 9b41f46 Removed extraneous whitespace <-----
на это:
pick 9b41f46 Removed extraneous whitespace <-----
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
и сохраните.
Теперь выберите вишню слитого коммита «Перемещено загружено» с мастера и на текущую ветку («резервная копия»)
$git cherry-pick master
Сделать мастер-точку для того же коммита, что и для «резервного копирования»
$git checkout master
$git reset --hard backup
Избавиться от твист ветки
$git branch -D twist