こんだけ覚えてれば開発任せられるなっていうコマンド類や概念をまとめてみた。
Gitのコミットは直前のコミットのポインタを持つということを頭の中で可視化していれば、割とスッと入っていくように思う。
基礎ルール
- リモートリポジトリにPushしたコミットの履歴は変更しない
- master ブランチをリリース用ブランチに、開発はトピックブランチを作成して進める
- master ブランチはファストフォーワード(マージされるブランチのHEADがマージするブランチのHEADにそのまま移動するマージのこと)のみのマージのみを許可し、git mergeコマンド以外は利用しない
- git merge コマンドはファストフォーワードのみに利用し、トピックブランチがmasterブランチの内容を取り込む場合は、git rebaseコマンドを使用する
- masterブランチは最低限のコミットのみが残るようにする(あらかじめトピックブランチの履歴を集約しておく)
- トピックブランチをmasterブランチにマージするときは、トピックブランチをリモートリポジトリにPushし、プルリクエストを送る
- マージ以外のプルリクエストは「[WIP] 」の文字をタイトルの最初につける(WIP:Work in Progress)
- リモートリポジトリはoriginという名前にし、ブランチ名はローカルと同様にする
つまり、下記の手順で開発を行う。
- トピックブランチを作成しコード編集
- 完了したらトピックブランチのコミット履歴をきれいにする
- その後リモートのmasterブランチの内容を git rebase コマンドでトピックブランチに取り込む
- トピックブランチをリモートリポジトリにPushし、プルリクエストを送る
- マージの許可を得られれば、masterブランチでgit mergeでファストフォーワードにてトピックブランチを取り込む
- トピックブランチを削除
基本コマンド
// 現在の状況(ステージに何が追加されていないとか)確認
$ git status
// ログを確認
$ git log
// ログをワンラインで表示
$ git log --oneline
// 差分を比較
$ git diff ブランチ名、指定がなければワーキングツリー 対象のコミットID(指定がなければHEAD)
// 差分があるファイル名のみを表示
$ git diff ブランチ名、指定がなければワーキングツリー --name-only
// ステージに追加
$ git add ファイル名
// すべてステージに追加
$ git add -A
$ git add .
// コミット
$ git commit
// メッセージを単純に追加
$ git commit -m 'メッセージ'
// 直前のコミットをやり直す
$ git commit --amend
$ git reset --soft HEAD^ && git commit
// 「.gitignore」ファイルのキャッシュを削除
$ git rm -r --cached .
// 「.gitignore」ファイルのキャッシュを削除し、反映するワンライナー
$ git rm -r --cached . && git add -A && git commit --allow-empty -m 'gitignore-refresh' && git reset --soft HEAD^
ブランチ操作
// ブランチの一覧を表示
$ git branch
// 新しいブランチの作成
$ git branch 新しいブランチ名
// リモートリポジトリ含んだすべてのブランチを表示
$ git branch -a
// ブランチの移動
$ git checkout ブランチ名
// ブランチを新規作成してそのブランチに移動
$ git checkout -b ブランチ名
// ブランチの削除(masterにマージされていない変更が残っている場合は削除できない)
$ git branch -d 削除するブランチ
// ブランチの強制削除
$ git branch -D 削除するブランチ
// ブランチのコピー
$ git branch 新しいブランチ名 コピー元のブランチ名
※ masterブランチをリモートブランチと同じものにしたい場合に利用することがある
例:$ git fetch origin && git branch -D master && git branch master origin/master
// 現在のブランチとマージする(基本masterブランチ以外は使用しない)
$ git merge ブランチ名
// リベースを行う(トピックブランチはこのコマンドでmasterブランチとマージを行う)
$ git rebase ブランチ名
リモートリポジトリの操作
// リモートリポジトリの一覧を表示
$ git remote
// リモートリポジトリの一覧をURL含めて表示
$ git remote -v
// リモートリポジトリを新規追加する
$ git remote add リモートリポジトリ名 URL
// リモートリポジトリのURLを変更する
$ git remote set-url リモートリポジトリ名 URL
// リモートリポジトリのPush側のURLのみを変更する
$ git remote set-url --push リモートリポジトリ名 URL
// リモートリポジトリ名を変更する
$ git remote rename 旧リモートリポジトリ名 新リモートリポジトリ名
// リモートリポジトリを削除
$ git remote rm リモートリポジトリ名
// リモートブランチにローカルブランチをPushする
$ git push リモートリポジトリ名 ローカルブランチ名:リモートブランチ名
※ リモートリポジトリとローカルブランチの名称は合わせるべきであるため、リモートブランチ名を略した「$ git push origin master」このようなコマンドを打つ場合が多い。この場合は「$ git push origin master:master」と同様の意味を持つ。
// 初めてリモートリポジトリにPushする場合に、上流ブランチ(upstream)を設定する
$ git push -u リモートリポジトリ名 ローカルブランチ名:リモートブランチ名
※リモートブランチ名は省略可能
例:$ git push -u origin master
※ 上流ブランチの設定をした場合、次回からは「$ git push」のみで「$ git push origin master」と同様の意味を持つようになる
// 上流ブランチの確認
$ git branch -vv
// 上流ブランチの変更
$ git branch ローカルブランチ -u リモートリポジトリ名/リモートブランチ名
// リモートブランチの削除
$ git push -d リモートリポジトリ名 リモートブランチ名
// リモートリポジトリの内容をローカルリポジトリ内のリモートブランチに取り込む
$ git fetch リモートリポジトリ名
// 現在のブランチと(ローカルリポジトリ上の)リモートブランチの内容をマージする
$ git merge リモートリポジトリ名/リモートブランチ名
履歴の操作
// HEADのみを指定のコミットに移動する
$ git reset --soft 指定のコミットID(現在のHEADから相対的なコミットの距離で指定したい場合、HEAD~3 としても可能。直前の場合はHEAD^で指定できる)
※ 過去の3つのコミットを統合したい場合
$ git reset --soft HEAD~2 && git commit -m '3つのコミットを統合'
// ワーキングツリー・ステージ・HEADを指定のコミットに戻す
$ git reset --hard 指定のコミットID
// HEADが辿った今までの変遷を確認(何からも参照されていないコミットを見つけることが可能。つまりコミットさえしていれば、どの状態にでも戻せるようになる)
$ git reflog
// インタラクティブモードで履歴を変更する(ファイルの同じ行を修正している場合などは、コンフリクトが起き、結構ややこしくなることが極力使用しない)
$ git rebase -i 指定のコミットID(現在のHEADから相対的なコミットの距離で指定したい場合、HEAD~3 としても可能。直前の場合はHEAD^で指定できる)
テスト環境開発(bitbucket)
// sparsecheckoutを有効にし、publicディレクトリのみpullする
$ git clone ssh://git@altssh.bitbucket.org:443/<account_name>/<repo_name>/
$ git config core.sparsecheckout true
$ echo public/ > .git/info/sparse-checkout
// 上流ブランチにあげておく
$ git branch master -u origin/master
// pullする
$ git pull origin master
// あるいはpullでエラーが発生した場合
$ git fetch origin && git reset --hard origin/master