恐れない方法
どんなに失敗しても、コミットが破棄されることはなく*、いつでも開始した場所に戻ることができることをお見せしたいと思います。
あなたが示したのと同じ形の偽のgitツリーを作成しました:
ここで、「バックアップ」ブランチから最後の 3 つのコミットを消去します。
$ 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 とは、申し訳ないと言う必要がないことを意味します。
*ルーズ オブジェクトは最終的にガベージ コレクションを実行しますが、少なくとも 2 週間経過するまでは実行されません。
あなたがしたいことをする方法。
まず、マスターで 2 つのコミットを結合しましょう。
$ 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
保存します。
次に、マージされた「Moved loaded」コミットをマスターから現在のブランチ (「バックアップ」) にチェリーピックします。
$git cherry-pick master
マスターが「バックアップ」と同じコミットを指すようにする
$git checkout master
$git reset --hard backup
ツイスト ブランチを取り除く
$git branch -D twist