バージョン管理システムであるGit。
便利なGUIツールはたくさんありますが、私はもっぱらコマンド派です。
今回はそんなGitで私がよく使うコマンドについて、備忘のために書いておきます。
※2019/4/22追記
コマンドに誤りがあったため修正しました。
失礼しました。
リモートを追加する
git remote add ${remote_name} ${repository_url}
ブランチをチェックアウトする
# ${upstream_branch_name}を省略すると、現在のブランチを${upstream_branch_name}としてブランチが生成される
git checkout -b ${branch_name} ${upstream_branch_name}
リモートブランチの一覧を取得する
# `-p`を付与すると消えたリモートブランチをローカルに反映
git fetch ${remote_name}
ブランチをマージする
git merge ${remote_name} ${branch_name}
git pull
でfetch~mergeまでやってくれます(先述の${upstream_branch_name}が${branch_name}になります)が、私はブランチ名を明示的に指定したいので上記をそれぞれ使っています。
変更をインデックスする
git add ${target_file}
削除対象だとマークする
git rm ${target_file}
# ファイルを残す場合
git rm --cached ${target_file}
コミットする
git commit -m ${message}
コミットを取り消す
git reset --hard HEAD^
# ローカルの変更は維持
git reset --soft HEAD^
HEAD^
は必要に応じて変更します(3つ前ならHEAD^^^
、もしくは git reflog
から参照した HEAD@{n}
を指定する)。
この場合、取り消したコミットに対して後述のプッシュをすでに行っていた場合、再度プッシュが必要です。
1つ前のコミットメッセージを変更する
git commit --amend
コミットログを見る
git log
ブランチへプッシュする
git push ${remote_name} ${branch_name}
${remote_name}と${branch_name}はオプションです。-u
オプションを付与することでデフォルトを設定できますが、実際はブランチをSwitchしながら色々やることが多いので、私は必ずどちらも打つようにしています。
前述のコミットを取り消して再度プッシュする場合は-f
オプションが必要ですが、他の人に影響が出るので共用ブランチではやらないべきです。
実際そういった取り決めをしている(GitHubなどは防止機能もある)プロジェクトも多いですね。
ローカルの変更を一時退避する
git stash
一時退避した変更を1つ戻す
git stash pop
スタックになっているので、stashした数だけpopできます。
一時退避した変更をすべて削除する
git stash clear
ちなみに、rebase
やrevert
はあまり使いません。
ざっくり言うと、rebase
は指定のコミットまで戻って履歴操作(複数のコミットをまとめるとかコメント修正もこれで出来ます)、revert
はコミットを打ち消すコミットです。
私は特によく使うコマンドをまとめたものを以下のようにエイリアスにしています。
# !/bin/bash
set -eu
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
alias co='/path/to/checkout.sh'
# 実行する
co ${branch_name}
このコマンドでは以下を実施しています。
- ローカルの変更を退避
- リモートにあるブランチと同名のブランチをローカルにチェックアウト
- リモートの変更をfetchしてチェックアウトしたブランチにマージ
- 退避していた変更を戻す
実際の作業時には、ローカルのブランチを別名にしたいとか、一気にやるとmergeのタイミングでconflictが起きた場合にpopを忘れそうといったケースが起こると思います。
上記はあくまでも参考ということで。