Gitの使い方メモ
Web+DB Press 50号に載ってるGitの特集がすごくわかりやすかった.
で,まあ,ただ読んでると頭に入ってこないから頭に入れたいところだけメモ.
git add
インデックスに追加する系.
インデックスは,次のコミットでコミットする変更を記録したもの.
git add <paths> | <paths> をインデックスに追加 |
---|---|
git add . | 現在のディレクトリ以下のすべての変更ファイル/新規ファイルをインデックスに追加 |
git add -u | インデックスから変更されてるファイルの変更をインデックスに追加 |
git add -A | -u + 新規ファイル |
git add -p | たとえば index.html の変更箇所(hunk)が2つあったとしたら, その2つのうち片方だけをインデックスに追加みたいなことができる(対話形式で) |
git commit
コミットする系.
git commit | インデックスの現在の状態をコミット |
---|---|
git commit <paths> | インデックスは無視して指定したファイルをコミット |
git commit -a | ワークツリーにあるバージョン管理対象ファイルを全部コミット |
git commit -v | パッチを再確認しつつコミット |
git diff
diffとる系.
git diff | インデックスに記録した状態とワークツリーとの変更点 | |
---|---|---|
git diff --cached | 最新のコミットとインデックスとの違い | |
git diff HEAD | 最新のコミットとワークツリーとの違い |
git log
ログ表示系.
git log | ログを表示 |
---|---|
git log -<N> | N個分のコミットログ |
git log -p | ログとパッチ |
git log <paths> | <paths> が変更されたログ |
git log --grep=<pattern> | ログメッセージに <pattern> を含むやつだけ |
git revert / git checkout / git reset / git commit --amend / git rebase
過去に戻す系.
git revert <object> | 過去のコミット<object>をなかったことにする.というか,svn的に言うと,逆マージ.<object>コミット前の状態を現在のワークツリーにマージ.<object>を探すのは git blame <path> |
---|---|
git checkout <paths> | <paths> を ワークツリー状態からインデックスの状態に戻す |
git checkout HEAD <paths> | <paths> をワークツリー状態から最新のコミットの状態に戻す.変更した箇所は捨てられる. |
git reset --hard HEAD | 前のコミット状態に戻す.ファイルの変更も捨てる. |
コミットのやり直し系.
git reset <paths> | インデックスへの追加をなかったものにする.ファイルの変更は保ちつつ,addする前の状態に戻す感じ. |
---|---|
git reset HEAD | <paths> 使ったときの挙動をワークツリー全体に. |
git reset HEAD^ | 1つ前のコミットをなかったことにする.ファイルの変更点は保たれるので,コミットを間違ったとか,そういうときに使う. |
git commit --amend | 1つ前のコミットをやり直しつつ現在のインデックスをコミット.git reset HEAD^ -> ファイル編集 -> git commit -a -m "hoge" と同じこと.ただし --amend と -m は同時に指定できない. -amend を指定したときは直前のコミットのメッセージが入力された状態でエディタが立ち上がる |
git rebase -i HEAD~n | nコミット前までをやりなおし.エディタが立ち上がるので,pick/edit/squashを選ぶ(編集).その後 git commit -amend -> git rebase --continue すると edit したコミットの書き換えができる. |
rebase がすごい.すごすぎる.
前々回のコミットに含めたかったファイルなのにaddしてなかったーみたいなものを,rebaseで昔に戻ってaddしてgit commit --amend して git rebase --continueするといとも簡単に過去のコミットに変更を加えられる.
man git-rebase を見るとさらにハンパない機能を持ち合わせていることがわかる.たとえば,
git-rebase --onto master next topic Another example of --onto option is to rebase part of a branch. If we have the following situation: H---I---J topicB / E---F---G topicA / A---B---C---D master then the command git-rebase --onto master topicA topicB would result in: H’--I’--J’ topicB / | E---F---G topicA |/ A---B---C---D master This is useful when topicB does not depend on topicA.
だそうだ.
どんだけだ.
svnで歯がゆかった点もサポートしておりますね.すばらしいです.
今のところそんなかんじ.
ブランチ関係はまだぜんぜん使いこなせていない.ややこしいというか,自由すぎるw
まあとりあえずは基本的なところおさえたから良しですか?