誰か、git rebaseを簡単に元に戻す方法を知っていますか?
思いつく限りでは、手動で作業するしかありません。
私の現在の状況では、両方のブランチからのコミットを簡単に見つけることができるので、この方法がうまくいくでしょう (片方は私のもの、もう片方は同僚のもの)。
しかし、この方法は最適ではなく、エラーが起こりやすいと思います(例えば、自分のブランチを2つ使ってリベースしたとしましょう)。
何かアイデアはありませんか?
明確にします。私が言っているのは、たくさんのコミットが再生されたリベースのことです。1つだけではありません。
最も簡単な方法は、reflog...でリベースが始まる直前の、ブランチのヘッドコミットを見つけることです。
git reflog
でリベースが始まる直前のブランチのヘッドコミットを見つけ、現在のブランチをそのコミットにリセットすることです (ただし、--hard
オプションを使ってリセットする前には絶対的な確信が必要だという通常の注意点があります)。
古いコミットが ref log で HEAD@{5}
だったとします。
git reset --hard HEAD@{5}
Windowsでは、リファレンスを引用する必要があるかもしれません:。
git reset --hard "HEAD@{5}"
古いヘッドの候補の履歴は、git log HEAD@{5}
(Windows: git log "HEAD@{5}"
)するだけで確認できます。
ブランチごとのリログを無効にしていなければ、リベースでは最終ヘッドに再接続する前にブランチヘッドを切り離すので、単純に git reflog branchname@{1}
を実行することができるはずです。しかし、私は最近これを検証していないので、再確認する必要があります。
デフォルトでは、裸のリポジトリではすべてのreflogが有効になっています。
[core]
logAllRefUpdates = true
もちろん、ブランチを以前のチップのコミットオブジェクトにリセットするのが一番の解決策です。なぜなら、手間をかけずに以前の状態を復元できるからです。しかし、もしそのコミットを失ってしまった場合 (たとえば、その間にリポジトリをガベージコレクションしてしまったとか、新しくクローンした場合など)、いつでもブランチをリベースすることができます。ここで重要なのは、--onto
スイッチです。
たとえば、「topic」という名前のトピックブランチがあり、「master」の先端が「0deadbeef」というコミットだったときに「master」から分岐したとします。topic` ブランチのある時点で、git rebase master
を行いました。さて、これを元に戻したいと思います。方法は以下の通りです。
git rebase --onto 0deadbeef master topic
これは、master
にない topic
のすべてのコミットを、0deadbeef
の上に再生します。
このように、--onto
を使えば、自分の履歴をほぼどんな形にでも並べ替えることができます。
楽しんでください。:-)