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になるようにしています。