私の使うGitコマンドまとめ 歴史操作編

Gitでバージョン管理をしていく際に、どうしても間違ったコミットやバグを含む内容の修正、ブランチの統合などを行う必要があります。
そういうときに使えるコマンドを今回は書いていきます。

ブランチのマージなどはブランチのまとめの方に書くべきかもしれませんが、リベースとの対比のためにこちらに書きました。

git reset (HEADの位置を変更する)

HEADの位置を変更する(+ インデックス、ワーキングツリーの位置も変更する)コマンド。
単なる修正以外にも使っている人も多くいるらしい。

--soft

HEADだけ位置を変更することができます。
なので

の状態から

git reset --soft HEAD

としても何も起りません。

git reset --soft HEAD^

でHEADの位置だけHEAD^に移動します。インデックスやワーキングツリーは変更されません。

この状態でコミットすれば、まさに git commit --amend と同じ効果です。

--mixed

HEADとインデックスの位置を変更します。
オプションなしの

git reset <コミット>

と同じです。なので、このオプションを明示的に指定することは無いのではないかと思います。

インデックスを「リセット」するときに使うと考えるのがいいと思います。

--hard

HEAD、インデックス、ワーキングツリーすべての位置を変更します。

つまりインデックス、ワーキングツリーの内容も「リセット」されます。
インデックスやワーキングツリー自体もあるコミットの状態にしてしまいたいときに用います。

fast fowardでブランチのHEADをつけ替えるためにつかったりもします。

下の状態で

git reset --hard topic

とすれば


になる!

マージをせずともfast forwardなら git reset --hard でもいいよ!

git rebase (歴史の変更をする)

オプションなしの git rebase は、ブランチの親を変更します。

しかし、ただ単にブランチの親を変更するわけではないです。もともと取り込まれていた変更は入れずに、取り込まれていない変更に関するコミットをつけると言うことをします。

まず例として

のような場合を考えます。ここで

git checkout topic
git rebase master
git checkout master

とすると、

のようになります。ここで次のようにすると、masterにtopicの変更を取り込むような形になります。

git reset --hard topic (もしくは git merge topic)


-i

対話的モードで、歴史改変します。

このコマンドを実行すると行頭に"pick"と書かれたコミットの列がエディタで表示されます。

コミットの行頭の"pick"を書き変えることで、コミットの修正や統合を行えます。

p, pick
 コミットをそのまま使う(変更しない)
r, reword
 コミットコメントのみ変更する
e, edit
 コミット自体をやり直す(そのコミットを git commit --amend することになる)
s, squash
 コミットを一つ前のコミットに統合する。コミットメッセージを編集できる。
f, fixup
 コミットを一つ前のコミットに統合する。コミットメッセージは統合するコミットのものを採用する。

--continue

git rebase <ブランチ名> でコンフリクトや git rebase -i でeditなどを実行した際に残りのrebaseを実行する際に使います。たいていはGitが丁寧に教えてくれるので、その時に見て使っても問題ないと思います。

--abort

rebase中にrebaseを取り消すことができます。

--skip

rebase中にそのコミットをスキップします。

git stash (一時的にインデックスを保存する)

ワーキングツリーに変更を加えている時に別タスクが入った場合、ワーキングツリーはどうすればよいでしょうか。

そのようなときにワーキングツリーを一時的に保存しておくのが git stash です。

save

オプションなしの

git stash

と同じです。

このコマンドを実行するとワーキングツリーを一時的に保存します。
実際にはキューにエンキューされています。

pop

キューに保存されているワーキングツリーを取り出します。
そのため、ワーキングツリーの状態が復元されます。
その時、一時保存されていたワーキングツリーはキューから削除されます。

-k

インデックスはそのままで、ワーキングツリーを一時的に保存します。

clear

キューに一時保存されたワーキングツリーの状態をすべてクリアします。

list

現在保存されているワーキングツリーの一覧を表示します。

git cherry-pick (コミットを付け替える)

たまに別ブランチにコミットをしてしまうという経験はありませんか。
そういったときにコミットをつけ替えることができるコマンドです。

例えば

のような場合に

git cherry-pick X

とすると次のようになります。

git merge (ブランチをマージする)

私はほぼ使いませんが、ブランチを統合する際に使います。
たいてい私はマージをせずに

git rebase master
git checkout master
git reset --hard topic

のようなことを行うことが多いです。たいてい rebase と reset --hard で何とかします。
基本的にはfast forwardになるようにしています。