Gitで直前のコミットを別ブランチへ移す手順
作業中に「うっかり違うブランチのままコミットしてしまった」という経験は、多くのエンジニアが一度は通る道です。とくに複数の機能を並行して開発している場合や、ブランチの切り替えを忘れたまま作業を進めてしまった場合に起こりやすいトラブルです。
このような場合、コミットをやり直すために変更を一つずつ手作業でコピーし直す必要はありません。Gitの機能を使えば、直前のコミットをそのまま新しいブランチへ移動させることができます。本記事では、その具体的な手順を解説します。
なお、この手順はリモートブランチにまだpushしていないことが前提条件です。すでにpush済みのコミットに対してこの手順を行うと、リモートとローカルの履歴に食い違いが生じ、他のメンバーの作業に影響を与えたり、強制的な履歴の書き換え(push --force)が必要になったりする恐れがあります。作業前に必ずpushしていないことを確認してください。
手順
1. 現在のブランチの状態を確認
まず、今どのブランチにいるのか、コミットしていない変更が残っていないかを確認します。
git status
git statusは、現在のブランチ名や、ステージング済み・未ステージングの変更内容を表示するコマンドです。作業を始める前に必ず実行し、想定外の変更が紛れ込んでいないかをチェックする習慣をつけておくと、事故を防ぎやすくなります。
2. 新しいブランチを作成
直前のコミットを移動させたい新しいブランチを作成します。以下のコマンドで新しいブランチを作成し、そのブランチに切り替えます。
git checkout -b new-branch-name
checkout -bは「新しいブランチを作成する」処理と「作成したブランチに切り替える」処理を同時に行うコマンドです。このタイミングで新しいブランチは、切り替え元のブランチ(直前のコミットを含む状態)からそのまま分岐するため、直前のコミットはすでに新しいブランチにも含まれています。この点が後の手順を理解するうえで重要なポイントになります。
new-branch-nameの部分は、実際に作成したいブランチ名に置き換えてください。
3. 元のブランチに戻る
新しいブランチを作成したら、一度元のブランチに戻ります。
git checkout original-branch-name
original-branch-nameは、誤ってコミットしてしまった元のブランチ名に置き換えてください。ここで元のブランチに戻るのは、次の手順でこのブランチからだけ直前のコミットを取り除くためです。
4. 元のブランチから直前のコミットを削除
その後、直前のコミットを元のブランチから削除します。HEAD~1は直前のコミットを指します。
git reset --soft HEAD~1
--softオプションを使うと、コミット自体は取り消されますが、変更内容はステージングエリアに残る- 変更を完全に取り消したい場合は
--hardオプションを使うこともできるが、この場合は変更内容そのものが失われるため注意が必要
--softを使う理由は、あくまで「コミットという記録」だけを取り消したいためです。ファイルの変更内容自体は手元に残しておきたいケースがほとんどなので、基本的には--softを選ぶことをおすすめします。
まとめ
以上の4つの手順で、直前のコミットを新しいブランチへ移動させることができました。
ポイントは、手順2で新しいブランチを作成した時点で、そのコミットはすでに新しいブランチの履歴として存在しているという点です。そのため、手順4で元のブランチに対してgit reset --soft HEAD~1を実行するだけで、元のブランチからはコミットが消え、新しいブランチにはそのコミットが残っている、という目的の状態が完成します。新しいブランチに切り替え直して変更を確認したり、あらためてコミットし直したりする作業は不要です。むしろ、その状態で改めてgit commitを実行してしまうと、同じ変更を二重にコミットしてしまったり、コミット対象がなくエラーになったりする原因になるため注意してください。
作業が完了したらgit statusやgit logで、元のブランチと新しいブランチそれぞれの状態を確認しておくと安心です。
