Git のコマンドメモ。
コミット
ステージングエリアに追加する
$ git add [--all] <filepattern>
オプション –all を指定するとすべてのファイルをステージングエリアに追加する。
ステージングエリアから削除する
$ git rm --cached <filepattern>
git rm を使うと、ファイルを作業ツリーから削除する。–cached オプションを指定するとステージングエリアから削除するが作業ツリーには残った状態になる。
単にステージングエリアへの追加を取り消したい場合は対話モードを使って revert(取り消し)を行う。
$ git add -i staged unstaged path 1: +1/-1 nothing README.txt *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> revert staged unstaged path 1: +1/-1 nothing [R]EADME.txt Revert>> 1 staged unstaged path * 1: +1/-1 nothing [R]EADME.txt Revert>> reverted one path *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> quit Bye.
リポジトリにコミットする
$ git commit [-a] -m <message>
オプション -a を指定すると、ステージングエリアに登録していないものでも全て直接コミットできる。
ブランチ
ブランチを作る目的(例)
- 実験的な変更のため
- 新しい機能の追加のため
- バグフィックスのため
ブランチを作る
$ git branch <branch> [<start-point>]
start-point(コピー元のブランチ)を指定しないと、現在のブランチを元に新しいブランチが作られる。
ブランチをチェックアウトする
$ git checkout <branch>
ブランチの名前を変更する
$ git branch (-m|-M) <old_branch> <new_branch>
new_branch がすでに存在する場合 -M オプションを使って強制的に上書きできる。
ブランチを作成すると同時にチェックアウトする
$ git checkout -b <branch> [<start-point>]
branch で指定したブランチを作成し、すぐにチェックアウトする。
ブランチを削除する
$ git branch (-d|-D) <branch>
削除する際に現在のブランチにマージが完了していないブランチは、-d オプションではエラーになる。マージが完了していなくても強制的に削除したい場合に -D オプションを使用する。
マージ済みのブランチを表示する
$ git branch --merged * masert merged_branch
このコマンドで現在のブランチにマージ済みのブランチの一覧が表示される。*マークがついていないブランチは、すでにマージ済みのため通常は消しても良いこととなる。
未マージのブランチを表示する
$ git branch --no-merged no_merged_branch
現在のブランチにまだマージを行っていないブランチの一覧を表示する。
コミットしていない変更を一時的に保管する
git ではコミットしていない変更があると、別のブランチに checkout できない。そんなときは、一時的に変更を保管する git stash を使う。
$ git stash
stash すると別のブランチに checkout できるようになる。stash した保管データを元に戻すには git stash pop を使う。
$ git stash pop
マージ
マージの種類
- 直接マージ
ブランチを一つ持ってきて、すべてのコミットをマージする
- 圧縮コミット
あるブランチのコミットを最後の一つに圧縮して現在のブランチにマージする
- チェリーピック
別のブランチからコミットを一つ取ってきて現在のブランチにマージする
直接マージ
$ git merge <branch>
merge コマンドは現在のブランチにマージしたいブランチをマージする。
圧縮コミット
$ git merge --squash <branch> $ git commit -a -m <message>
squash オプションは指定したブランチからすべてのコミットを取ってきて、ひとつのコミットに圧縮する。実際に現在のブランチにマージするには、commit を行う必要がある。
チェリーピック
ブランチの全部をマージする必要はないが、コミットの一部を取り込みたい場合に使う。このコマンドはマージ先のブランチをチェックアウトした状態で行う。現在のブランチに対して、リポジトリのコミットをつまみ食いする。
$ git cherry-pick [-n] <commit> $ git commit
コミット名は Git がコミットを追跡するために生成する SHA-1 のハッシュの先頭7文字。-n オプションをつけることで、マージはするがコミットしないように留まる。複数のコミットをチェリーピックする場合にこのオプションを使う。最後にコミットを行う際には -m オプションはつけない。
コンフリクトが起こったら
$ git mergetool $ git commit
マージ解決ツールを使用して、コンフリクトを解決しコミットを行う。コミットの時には -m オプションは不要。
ブランチを統合する(rebase)
$ git rebase <branch>
現在のブランチの履歴を指定したブランチに全部統合して一つの作業履歴のように見せる。
参考
履歴を使った作業
ログを見る
$ git log [-p]
現在のブランチのログを見る。オプション -p を使用すると変更した内容を一緒に表示する。
バージョン間の違いを見る
$ git diff [<option>]
diff で使えるオプションは、log で使ったリビジョンの範囲指定や修飾子が使える。比較するリビジョンを省略した場合は HEAD との比較になる。HEAD は、最新のコミットを表す。
ファイル内の変更がいつ、誰によって行われたかを知る
$ git blame [<option>] <file>
ファイルの一部だけを表示するには、[-L 開始行,終了行] のように記述する。
$ git blame -L 12,13 index.html
これで、index.html の12行目から13行目だけを表示する。
コミットを取り消す
$ git revert [-n] <commit>
オプション -n をつけることで、巻き戻しを即座にコミットしないようにする。revert をするときは、最新のコミット(HEAD)から順番に巻き戻すようにする。
リポジトリからコミットをなかった事にする
リポジトリをリセットし、コミットをなかった事にする。
$ git reset (--soft|--hard) <commit>
オプション –soft は、リセットした内容をステージングエリアに戻してくれる。すなわち、リセットした内容をやり直せる。–hard オプションは即座に消す。コミット名の修飾子には ^ や ~N が使える。HEAD^ は最新のコミットを表す。
前回コミットからの編集をすべてすてて、前回コミットの状態に戻す
git reset を利用して、次のようにする。
$ git reset --hard HEAD
リモートリポジトリ
リモートリポジトリを使って作業を共有する
- リポジトリ
リポジトリは、ローカルのディレクトリにあるかもしれないし、ネットワーク上にあるかもしれない。とにかく、git でコンテンツを格納する場所がリポジトリ。
- ローカルリポジトリ
自分専用のリポジトリ。git init で作ることもできるし、git clone で他の場所にあるリポジトリをコピーすることもできる。
- リモートリポジトリ
git clone でコピーした元のリポジトリのこと。
- リモートブランチ
リモートリポジトリから作成したブランチのこと。リモートブランチはローカルリポジトリにできるが、ローカルブランチとは区別される。origin/master というような表記になり、origin がリモートリポジトリの別名になる。
参考
リモートリポジトリのクローンをつくる
$ git clone <repository>
git clone [email protected]:hamasyou/git_demo.git のように使う。これにより、ローカルリポジトリに master ブランチ、自分のリモートリポジトリに origin/master ブランチが作られる。
$ git clone [email protected]:hamasyou/git_demo.git Initialized empty Git repository in /home/hamasyou/gitdemo/git_demo/.git remote: Counting objects: 49, done. remote: Compressing objects: 100% (41/41), done. remote: Total 49 (delta 7), reused 0 (delta 0) Receiving objects: 100% (49/49), 5.20 KiB, done. Resolving deltas: 100% (7/7), done. $ cd git_demo $ git branch * master $ git branch -r origin/HEAD -> origin/master origin/master
git branch -r で自分のリモートリポジトリの一覧が表示される。git clone でリポジトリを作成するとデフォルトで origin という名前でリモートサイトの別名が作られる。また、ローカルブランチに master、リモートブランチに origin/master というブランチが作成される。
Git では誰かがリモートリポジトリを更新すると、自分のリモートブランチ(origin/master)と違う歴史がつくられる。リモートリポジトリの更新を取り込むには、リモートブランチ(origin/master)をリモートリポジトリに再接続しなければならない。そのためのコマンドが fetch である。
リモートリポジトリの変更を取り込む(fetch)
リモートブランチを最新の状態にするには fetch コマンドを利用する。
$ git fetch <repository>
git fetch origin のように使う。これにより、リモートリポジトリの更新をリモートブランチに反映させることができる。ただし、リモートブランチを更新しただけではローカルで編集はできない。ローカルブランチにマージする必要がある。
$ git merge <remote_branch>
git merge origin/master のように使う。この、fetch と merge を同時に行うものが pull コマンドになる。
リモートリポジトリのブランチを確認する
$ git branch -r
これでリモートリポジトリにあるブランチの一覧が表示される。
$ git branch -r origin/HEAD origin/master
origin というのはローカルとリモートを区別するためのプレフィックスで、clone で作成した作成元のリポジトリに割り当てられるデフォルトのリモートリポジトリ名である。この名前は、.git/config に設定されている。
- origin以外のリモートリポジトリを追加する
$ git remote add <alias> <url>
remote add はリモートリポジトリに別名(エイリアス)をつけるコマンド。
リモートリポジトリに変更をプッシュする(push)
$ git push [<repository> <refspec>]
リポジトリにはリモートリポジトリ名(デフォルトはorigin)を指定することもできるし、リポジトリのアドレスを指定することもできる。リモートリポジトリ名とプッシュするものが省略された場合、リモートリポジトリ名が origin、プッシュするものは現在のブランチ、プッシュ先は現在のブランチに対応するリモートのブランチとなる。
$ git push origin mybranch:master
上記のように指定することで、origin リモートリポジトリの master ブランチに、ローカルの mybranch ブランチをプッシュするという指定になる。
リモートリポジトリから変更をプルする(pull)
$ git pull [<repository> <branch>]
リモートリポジトリ名は git remote add で追加したリポジトリ名を指定する。リモートリポジトリアドレス(git://example.com/example.git)を指定することもできる。現在登録されているリモートリポジトリ名の一覧は git remote show で表示できる。リモートリポジトリ名を削除するには git remote rm <repository> を実行する。
$ git pull origin master:tmp
上記のように指定することで、origin リモートリポジトリの master ブランチを、ローカルの tmp ブランチにプルすることができる。push の時と最後の引数の:の順番が違う。
リモートブランチをローカルブランチの追跡ブランチにする
git clone を使って作成したリモートリポジトリはデフォルトでリモートブランチの origin/master とローカルブランチの master が追跡状態になる。そのため、master ブランチ上で git push を行うと引数がなくても origin/master に対してプッシュを行う。
master ブランチ以外を追跡ブランチするためには、次のコマンドを使用する。
$ git checkout --track <remotename>/<branch>