Как не бояться
Я хотел бы показать вам, что как бы сильно вы ни накосячили, коммиты никогда не уничтожаются*, и вы всегда можете вернуться к тому, с чего начали.
Я сделал искусственное дерево git, которое имеет ту же форму, что и вы:
Теперь я собираюсь стереть последние три коммита из ветки «резервное копирование»:
$ 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 указывать на этот старый коммит. Но на самом деле никакие коммиты не были потеряны — они просто стали сиротами, а не частью какой-либо ветки. Давайте снова сделаем их частью ветки «backup»:
$ 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".
и сохранить.
Теперь давайте изменим порядок коммитов в «резервной копии»:
$ 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
Укажите master на ту же фиксацию, что и «резервная копия».
$git checkout master
$git reset --hard backup
Избавьтесь от ветки поворота
$git branch -D twist
person
Wayne Conrad
schedule
17.01.2010
twist
иbackup
? Я спрашиваю, потому что у них обоих есть коммиты с идентичными описаниями. - person CB Bailey   schedule 17.01.2010