【Git】個人用備忘録
Git 備忘録
Git で知らなかったことまとめ。随時更新していきます
対象: なんとなく Git の仕組みが分かってきた人・add,commit,push,pull,checkout,branch は一応使える人
ToC
- index, HEAD の違い
- add のオプションまとめ
- commit を削除する
- commit をまとめる
- 差分を見る
- rebase 使い方
- branch削除方法
☆index, HEAD の違い
要更新
☆add まとめ
$ git add ...
の選択肢は以下の3つ。
- file 名そのまま:
ディレクトリを指定すればそれがステージングにあがる。
ex)
$ git add ./app/models/clinic.rb
- フォルダ名
フォルダ内を再帰的に add してくれる。
ex)
$ git add ./app
まとめて追加 3 種類(⇒参考)
$ git add .
バージョン管理されていないファイルは追加されない。すなわち新たに追加されたもの、変更があったものが対象。Git ver.1 まではこうであったが、現在は追加、変更、削除いずれも追加される。$ git add -u
バージョン管理されているファイルをすべて追加。 すなわち変更があったもの、削除されたものが対象。$ git add -A[--all]
全てが追加される。
※
$ git add .
と$ git add -A
の違い 前者はカレントディレクトリ下のファイルをすべて追加するが、後者はプロジェクトのどこからでも該当ファイルをステージングにあげるという違いが存在する。
☆commit の削除方法
- commit を削除したことを残す
$ git revert <commit>
で削除可能。コンフリクトがおきたらがんばれ。 なお<commit>
のところには commit ID を入力すればよい。
☆commit をまとめる方法
$ git log --oneline
でまとめたいコミットを確認。
$ git log --oneline # 1a2b3c <commit msg3> # 4d5e6f <commit msg2> # 7g8h9i <commit msg1>
$ git rebase -i HEAD~<n>
により、HEAD から n 個の commit をまとめる。- vim が展開するので、以下のように合成元を
fixup
に書き換える。:wq
で保存。
pick 7g8h9i <commit msg1> - pick 4d5e6f <commit msg2> - pick 1a2b3c <commit msg3> + fixup 4d5e6f <commit msg2> + fixup 1a2b3c <commit msg3>
※やばいときは$ git rebase --abort
で rebase を取りやめる。
⇒参考
☆diff により差分を見る方法
git diff
で差分を見れる。アレコレ書こうと思ったけど普通にこの Qiita が優秀だったので読みましょう。
参考 ⇒忘れやすい人のための git diff チートシート
☆rebase まとめ(含: stash, fetch)
git rebase
とは?
歴史の元を改変するコマンド。以下の図が分かりやすい。
rebase
とmerge
(則ちpull
)のコミットログ比較(⇒参考)
分かりやすい。
やり方
ブランチ名は上記画像に則る。
git fetch
git fetch はリポジトリと結びついているorigin/masterが最新になる。(正確にはリモートのmasterブランチをもとに、ローカルにFETCH_HEADというブランチが構築され、それが最新状態になる。) 他人からの変更があった場合、こまめにやるのがよさそう。 ちなみにgit pull
は、この fetch の作業が終わったのち作業ディレクトリに結び付く master を origin/master をもとに更新する。git rebase origin/develop
featureブランチの"元"を上記図 D から引っ張るようにする。うまくいけば 3 へ。 以下うまくいかない場合- featureに commit が残っているとき
この場合は、rebase をする前に
git stash save
を行う。この stash コマンドにより作業を一時退避させることができる。退避させたのち rebase を行い、git stash apply
で適用する。以下便利なコマンド。git stash list
: stash の一覧を確認したい場合。git stash apply <stash_name>
: <stash_name>を適用する。コンフリクト起こしたときはがんばれ。git stash drop <stash_name>
: stash を削除するコマンド。適宜消すべし。git stash pop <stash_name>
: 適用と削除を一気に行うコマンド。自信がないうちは apply でいいよ。
- conflict を起こしたとき
Aborted! やらなにかしら吐いて rebase が一時中断される。
git status
で確認すると、コンフリクトを起こしているファイルはboth modified
となっているハズ。 適当なエディタ等でコンフリクトを solve したら、該当ファイルを add するのを忘れないように。 さらにそののちcommit はせず、git rebase --continue
で rebase 処理を再開させる。この手順じゃないとうまくいかなかった。 - よく分からなくなってしまったとき
git rebase --aborted
一択。rebase を実行する前の状態まで戻してくれるので、ヤバい!と思ったらこれを行う。
- featureに commit が残っているとき
この場合は、rebase をする前に
git push --force origin feature
あまりやりたくはないが push --force をやる。
一連の流れ
$ git fetch $ git stash # プッシュしていないcommitがあったとき $ git rebase origin/master $ git status # コンフリクトがありそうなとき $ git diff -- FILE_NAME # 差分を確認 $ git add FILE_NAME $ git rebase --continue $ git stash pop $ git push --force origin mybranch
☆branch削除方法
ローカル
# コミット済み(HEADにmerge済?)の場合 git branch --delete my-branch # 上記を問わない場合 git branch -D foo
リモート
# 一覧表示 git branch --remote # 消し方は一通り git push --delete origin my-branch