Gitコマンドの利用シーン別チートシート
目次
各種取り消し
addの取り消し (コミットの有無で使えるコマンドが異なる)
■ はじめてのaddの時(まだ一回もコミットしていない状態)
git rm --cached -r .
■ 2回目以降のaddの時(一回はコミットしている状態)
git reset HEAD or git restore --staged .
commitの取り消し
■ 作業途中のファイルを残しつつコミットを取り消す場合
git reset --soft HEAD^
■ 作業途中のファイルを捨て、完全にコミットを取り消す場合
git reset --hard HEAD^
merge (pull)の取り消し
■ 成功しているmergeを取り消す場合
git reset --hard HEAD@{1}
■ 失敗しているmergeを取り消す場合
git merge --abort
rebaseの取り消し
git rebase --abort
pushの取り消し
■ 最新のローカルコミットを捨てて諦める場合
ローカルのコミットをpushのひとつ前に戻して、
git reset --hard HEAD^ (HEAD^はひとつ前のコミットの意味)
100%コンフリクトするので強制的にpushする。
git push -f origin main
■ 最新のローカルコミットをリモートに強制的に押し付ける場合
git push -f origin <ローカルの最新のコミットID>:main
git reset タイムマシン
git resetは3通りある。HEADとは現在使っているブランチの作業点。
作業中のファイルとステージングは今のままHEADだけ移動
もし、移動後に移動前後の差分すべてを 自動的にstagedにしたいなら、
git reset --soft < コミットID >
これをすると、すべての差分がステージに上がった状態で戻る。
作業中のファイルは今のまま、今のステージングを捨ててHEADを移動
※ git logに戻りたいコミットが表示されないときはgit reflogに載っている。
git reset --mixed < コミットID >
--mixedはgit resetのデフォルトオプションでもあるので、省略して
git reset < コミットID >
とすればいい。
これをすると、移動前後の差分はunstagedの状態になる。(つまり何もステージングされていない状態)
今の作業中のファイルとステージングすべてを捨てて、HEADを移動
git reset --hard < コミットID >
すべてが移動したコミットの状態になる。
このオプションがあるおかげで、何をどうしようが最終的には復元できるので思い切ってgit操作できる。
これを実行するとリモートがローカルより進んでいる状態になるから、
-f オプションを付けて git push origin main -f
をする。
git rebase コミットをまとめる
git log か git reflogでまとめるひとつ前のコミットIDを調べてから、
git rebase -i < コミットID >
まとめ先をpick のままに、まとめ対象(nonとか)をfにして:wq
first commitを編集起点にしたい
一番古いコミット(first commit)へはコミットIDではなくrootオプションで編集する。
git rebase -i --root
とりあえずやったfirst commit から時が経ち、いくつかの保存的なコミットを数回重ねたが、今の状態をfirst commitにしたいときなどに使える。
.gitignoreに後から除外対象を指定したがそれが反映されない時
ファイルはそのままで、Gitのインデックス(cached)のみ削除する。
git rm -r --cached .
のように最後に「 . 」をつけて、すべてのディレクトリとファイルのインデックスを対象にして実行した後、 git add .
してインデックスをやり直してから git commit
すればいい。(addとcommitをVSCodeのGitのGUIを使ってやると失敗するからコマンドで!)
cachedはワークツリーにはファイルを残すがインデックスだけ削除する。 -rはディレクトリを再帰的に削除するオプション。
この時に新しいコミットができてしまうが、それがイヤなら git rebase -i
などでコミットをまとめればいい。
この処理をしたのにVSCodeのエクスプローラー上で、追跡対象外を表すファイル名の色が薄暗くならない時があり、リフレッシュボタンを押しても変わらず、まるで今でも追跡対象に見えるという誤作動を起こす時がある。
そんな時は、git ls-files --others を実行すると、VSCodeの誤作動に惑わされること無く、Gitが実際に追跡対象外にしているファイル名の一覧が表示される。
解決するにはVSCodeを一旦閉じてから再度開き直す。
リモートリポジトリが進んでいるのに、ローカルでコードをコミットしてしまい枝分かれになった場合の対処
この画像のように別々の場所でそれぞれコミットを進めてしまい枝分かれになったものを、
このようにまっすぐに修正したい。
状況設定:
「エディターのh2微調整」というコミットまでは、オフィスと自宅にある2つのローカルPCは同じコミットだった。
オフィスでコードを編集して「微調整」コミットまで進めてリモートリポジトリにgit pushした。
そのことを忘れて自宅に帰宅後、自宅のPCでコードを編集して「titleタグ」をコミットした。
リモートリポジトリにgit pushしようとした時点ではじめて上記のように枝分かれになっているのに気がついた。
① まず、「titleタグ」コミットを取り消して、stashして編集内容を保管する。
git reset --soft HEAD^
git stash -u
以下のようになる。
② オフィスで進めたコミットを自宅のPCにgit pullで取り込んでから、stashから先程の編集内容を復活させる。
git pull
git stash apply stash@{0}
以下のようになる。
③ ステージングされていない状態で復活するので、おなじみの一連のコマンドを打ってリモートリポジトリにpushする。
git add .
git commit -m "titleタグ"
git push
以下のようになる。
④ 不要になったstashを削除する
git stash clear
できた!
直近のコミットへのメッセージや状態の上書き amend
このコマンドは直近のコミットをやり直す
git add .
git commit --amend -m "message"
ファイル無しの空の状態でfirst commit
git commit --allow-empty "first commit"
すでに中身のあるフォルダにgit cloneしたい
git init
git remote add origin https://github.com/<ユーザー名>/<リポジトリ名>.git
git fetch origin
git merge origin/main
特定ファイルを特定のコミットの状態にする
git restore --source <コミットID> <ファイル名>
過去にaddしたことのあるファイルを復元する
.git/objectsフォルダでコミットIDを調べて
git cat-file -p 30d74d258442c7c65512eafab474568dd706c430
過去のコミットにしかないファイルを復元する。
例えば、今、4th commitした状態で、2th commitにしかないファイルを復元して、それを編集したあと、それらもろとも新たに5th commitにしたいときは、
git reset < 2th commit ID >
・・ ファイル編集 ・・
git reset < 4th commit ID >
git add . <- 2th commit から引っ張ってきたものをステージング
git commit -m "5th commit"
で出来る。
リモートをローカルの内容に強制的に書き換える
git push -f origin main
ローカル・リモートのブランチ削除
ローカル:
git branch -d <branch name>, (強制)は -D
リモート:
git push --delete origin <branch name>
リモートリポジトリの登録を削除
git remote rm origin