おつかれさまです。otapediaのotaです。
毎度毎度、ググってしまうので、自分用によく使うgitコマンドをまとめておく。都度更新。
コマンドまとめ
リモートリポジトリをコピー
git clone githubなどのリモートリポジトリのURL
今どこのブランチにいるか確認
git branch
ブランチの作成
git checkout -b ブランチ名
ブランチの移動
git checkout ブランチ名
ブランチ名の変更
# 今いるブランチの名前を変える
git branch -m 変更するブランチ名
# 別のブランチの名前を変える
git branch -m 古い名前 新しい名前
リモートブランチをローカルで取得
git checkout -b ブランチ名 origin/取得したいブランチ名
ex) git checkout -b master origin/master
差分の確認
# 変更したがまだ add していない分
git diff
# add 済みの分
git diff --staged
最新のリモートリポジトリの状態をローカルリポジトリに取得
git fetch
変更をステージングエリアに追加
git add
ex)
- 差分を全て追加
git add .
- ファイルを指定して追加
git add app/views/users/show.html.erb
ローカルリポジトリに保存
git commit -m "コミットメッセージ"
ローカルリポジトリをリモートリポジトリにアップロード
git push origin ブランチ名
# 初回は -u を付けておくと、次からは git push だけで済む
git push -u origin ブランチ名
commit情報を確認
git log
# 1行ずつ、枝分かれも見える形で
git log --oneline --graph --all
任意の gitコミットを、作業中の HEAD に追加
git cherry-pick [コミットID]
※ git log でコミットIDを確認
switch と restore
ここから追記。Git 2.23 以降、checkout の役割が2つのコマンドに分かれました。
checkout は「ブランチを移動する」と「ファイルの変更を元に戻す」という全く違う仕事を1つのコマンドが兼ねていて分かりにくかったので、それぞれ switch と restore に整理された、という経緯です。
# ブランチを移動する
git switch ブランチ名
# ブランチを作って移動する(checkout -b と同じ)
git switch -c ブランチ名
# 直前にいたブランチに戻る(これが地味に便利)
git switch -
リモートにしか無いブランチも、origin/ブランチ名 が存在すれば git switch ブランチ名 だけで勝手に追跡ブランチを作ってくれます。上に書いた git checkout -b ブランチ名 origin/ブランチ名 を打たなくてよくなりました。
ファイルを元に戻す方はこちら。
# 変更を捨てて、最後のコミットの状態に戻す
git restore ファイル名
# add を取り消す(ステージから下ろす。変更自体は残る)
git restore --staged ファイル名
checkout も今まで通り動くので慌てて覚え直す必要はないですが、git restore --staged は git reset HEAD ファイル名 より分かりやすいので、これだけでも使う価値があります。
やり直したいとき
一番ググるのがこのあたりなので、まとめておきます。
直前のコミットをやり直す
# メッセージだけ直す
git commit --amend -m "新しいメッセージ"
# 直前のコミットに、今の変更を混ぜる(メッセージはそのまま)
git add .
git commit --amend --no-edit
コミットを取り消す
# コミットだけ取り消す(変更はステージに残る)
git reset --soft HEAD~1
# コミットを取り消す(変更は残るが、ステージから下りる)
git reset HEAD~1
# コミットも変更もまるごと消す ※戻せません
git reset --hard HEAD~1
--hard は本当に消えるので、打つ前に一呼吸おいてください。
すでにpushしたコミットを取り消す
この場合は reset ではなく revert を使います。打ち消すためのコミットを新しく積むので、履歴が壊れません。
git revert [コミットID]
共有ブランチでは基本的にこちらです。
作業を一時的に退避する
「他のブランチを見たいけど、今の変更はまだコミットしたくない」というときに使います。
# 今の変更を退避する
git stash
# 新規ファイルも一緒に退避する
git stash -u
# 退避したものの一覧
git stash list
# 最後に退避したものを戻す
git stash pop
git stash pop は戻すと同時に退避リストから消えます。残しておきたいときは git stash apply です。
ブランチを消す
# ローカルのブランチを消す(マージ済みのものだけ)
git branch -d ブランチ名
# マージしていなくても強制的に消す
git branch -D ブランチ名
# リモートのブランチを消す
git push origin --delete ブランチ名
push が拒否されたとき
--amend や rebase で履歴を書き換えたあとは、普通の push が拒否されます。そこで force を使うことになるのですが、
# ❌ 他の人のpushを巻き込んで消す可能性がある
git push --force
# ⭕ 自分が最後に見た状態から変わっていなければ push する
git push --force-with-lease
--force-with-lease を使ってください。 自分がfetchした後に他の人がpushしていた場合、こちらは失敗してくれます。--force は問答無用で上書きするので、共同作業では事故のもとです。
困ったときの reflog
最後に一番助けられているやつを。
git reflog
これはHEADがどう動いたかの全履歴です。git reset --hard で消したはずのコミットも、ここには残っています。
# reflog でIDを確認して
git reflog
# その時点に戻る
git reset --hard [コミットID]
「やらかした」と思ったら、まず git reflog を打ってみてください。だいたい助かります。