バージョン管理システムであるGit。
便利なGUIツールはたくさんありますが、私はもっぱらコマンド派です。
今回はそんなGitで私がよく使うコマンドについて、備忘のために書いておきます。
リモート追加
1 2 | git remote add <remote_name> <repository> |
ブランチをチェックアウト
1 2 3 | # <remote_branch_name>を省略すると、リモートと関連づいていないブランチが生成される git checkout -b <branch_name> <remote_branch_name> |
リモートからブランチを取得
1 2 3 | # `-p`を付与すると消えたリモートリポジトリをローカルに反映 git fetch <remote_name> |
ブランチをマージ
1 2 | git merge <remote_name> <branch_name> |
git pull
でfetch~mergeまでやってくれますが、私は上記をそれぞれ使っています。
変更をインデックスする
1 2 | git add <target_file> |
変更をなかったことにする
1 2 3 4 | git rm <target_file> # ファイルを残す場合 git rm --cached <target_file> |
コミットする
1 2 | git commit -m <message> |
コミットを取り消す
1 2 3 4 | git reset --hard HEAD^ # ローカルの変更は維持 git reset --soft HEAD^ |
HEAD^
は必要に応じて変更します(3つ前ならHEAD^^^
など)。
この場合、push済みの場合は履歴を書き換えているので-f
オプションが必要ですが、他の人に影響が出るので共用ブランチではやらないほうが良いです。
1つ前のコミットメッセージ変更
1 2 | git reset --amend |
ブランチへpush
1 2 | git push <remote_name> <branch_name> |
-u
オプションを付与することでデフォルトを設定できますが、実際はブランチをSwitchしながら色々やることが多いので、私は必ずどちらも打つようにしています。
ローカルの変更を一時退避
1 2 3 4 | git stash # 退避を戻す git stash pop |
スタックになっているので、stashした数だけpopできます。
ちなみに、rebase
やrevert
はあまり使いません。
ざっくり言うと、rebase
は指定のコミットまで戻って履歴操作(複数のコミットをまとめるとかコメント修正もこれで出来ます)、revert
はコミットを打ち消すコミットです。
私は特によく使うコマンドをまとめたものを以下のようにエイリアスにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | BRANCH=$1 EXIST=$(git branch --list ${BRANCH}) # 同名ブランチがローカルに存在しなければ新規作成コマンドに変更 CHECKOUT_CMD="git checkout ${BRANCH}" if [ "${EXIST}" == "" ]; then CHECKOUT_CMD="git checkout -b ${BRANCH} origin/${BRANCH}" fi git stash && \ git fetch -p origin && \ ${CHECKOUT_CMD} && \ git merge origin/master && \ git stash pop |
1 2 3 4 5 | alias='/path/to/checkout.sh' # 実行する co <new_branch_name> |
このコマンドでは以下を実施しています。
- ローカルの変更を退避
- リモートにあるブランチと同名のブランチをローカルにチェックアウト
- リモートの変更をfetchしてチェックアウトしたブランチにマージ
- 退避していた変更を戻す
実際の作業時には、ローカルのブランチを別名にしたいとか、一気にやるとmergeのタイミングでconflictが起きた場合にpopを忘れそうといったケースが起こると思います。
上記はあくまでも参考ということで。