利用頻度は低いが、大事なときに使うgitコマンド
いつもWeb検索しているので、備忘録として残す(随時更新していく予定)。
ワーキングディレクトリ(ローカル)では編集するが、ステージングエリアに反映したくないとき
.gitigonreで対応する場合
1. .gitigonreに追加
対象のディレクトリまたはファイルを追加する。
*.swp
/path/hogehoge
2. cacheを削除
ステータス変更があるファイルについてgit rm --cachedを実行。
$ git rm --cached [file1 file2...]
なお、ステータス変更があるファイルすべてを対象にしたいとき下記コマンドを実行。
$ git rm --cached .
こちらが参考になる。
.gitignoreにも記載したくないとき
下記コマンドを実行する、
$ git update-index --assume-unchanged [file1 file2...]
やってしまったとき
はじめに
こちらが非常にわかりやすく説明の記載があるので、怖いコマンドを実行する前に自信がないときは一読する。
git addの取り消し
既にgit管理されている場合
ファイルを指定しない場合、対象がすべてになる。なお[]内は省略可能。
$ git reset [[--mixed] HEAD] [file1 file2...]
git管理されていない場合
ファイルではなく.を指定すると、対象がすべてになる。
$ git rm --cached [file1 file2...]
git commitの取り消し
ワーキングディレクトリに取り消したcommit内容を反映させる場合
再び、addやcommitができる。
$ git reset --soft HEAD^
ワーキングディレクトリに取り消したcommit内容を反映させない場合
元に戻せなくなるので注意が必要。
$ git reset --hard HEAD^
git pushの取り消し
方法1
commit_id値はgit logで事前に確認しておく。
$ git revert commit_id
$ git push origin branch_name
方法2
強引に戻すので、いったん現状のブランチをバックアップする。commit_id値はgit logで事前に確認しておく。
$ git branch backup_branch
$ git reset --hard commit_id
$ git push -f origin this_origin
最後にforce pushをしているので、git push origin :this_branchでリモートリポジトリを削除してから、git push origin this_branchでもいいが、どちらにしてもこの方法2の利用は避けたいところ。
方法3
reflogに残っている場合。git reflogで元に戻したいHEAD@{n}を確認し、git reset --hardを実行する。
この方法が個人的には一番安全のように思えるが肝心な時に限ってreflogに残っていないことが多い。
$ git reset --hard HEAD@{n}
その他
参考資料に記載されている内容も確認する。
特定のファイルを元に戻すとき
特定のファイルをあるコミットの状態に戻したい場合は以下のコマンド。fileはパスも指定する必要がある。
$ git checkout commit_id file
なお、commit前の特定のファイルをheadの状態に戻したい場合は、以下のコマンド。
$ git checkout file
git configコマンド
アカウント変更
プロジェクトごとに変更したい場合、--globalを省くこと。
$ git config --global user.name "last first"
$ git config --global user.email local-parts@domain.tld
エディタ変更
emacsに変更したい場合。
$ git config --global core.editor emacs
git commit時のメッセージをテンプレート化する
~/message/template1.txtにテンプレートを記載する。
$ git config --global commit.template ~/message/template1.txt
ファイルのパーミッションを変更しても、無視する設定
chmodでgit管理下にあるファイルのパーミッションを変更すると、変更したファイルとして扱われてしまう。下記コマンドを実行することで、ファイルのパーミッションを変更しても無視扱いとなる。
$ git config core.filemode false
configの確認
下記コマンドで全てのconfig内容が確認できる。なお、--listではなく--lでも結果は同一。
$ git config --list
core.filemodeだけ確認したいときは、下記コマンドで。
$ git config --list | grep core.filemode
git stash関連
リスト表示
まずはstashされている内容を確認する。
$ git stash list
n番目のstash
下記コマンドについて、最新のstashを戻す場合、stash@{n}は不要。
対象ファイル一覧
stashされているファイルの一覧を確認するときは、下記コマンドを実行。
$ git stash show stash@{n}
変更差分
stashされているファイルと現在のワーキングディレクトリの差分を確認するときは下記コマンドを実行。
$ git stash show -p stash@{n}
HEADとの差分は下記で確認できる。
$ git diff HEAD..stash@{0}
適用
適用したstashを削除する場合
stashされている内容をワーキングディレクトリに反映させた後、そのstashを削除するには下記コマンドを実行。
$ git stash pop stash@{n}
適用したstashを削除しない場合
stashされている内容をワーキングディレクトリに反映させた後、そのstashを削除しないときは下記コマンドを実行。
$ git stash apply stash@{n}
削除
stashされている内容が不要で、削除するときは下記コマンドを実行。
$ git stash drop stash@{n}
リベース
こちらの資料が非常によくまとまっている。
master取込
git merge origin/masterかgit pull origin masterで済ませてしまうことが多い。
mergeと逆なので非常に注意が必要。失敗することもあるので、-iオプションを指定して、インタラクティブモードで処理をしたほうが安全だと思われる。
$ git checkout master
$ git pull origin master
$ git rebase origin origin_target
cherry-pick
git fetchを忘れずに。別のブランチでcommitされた内容をワーキングディレクトリに反映させたいときは下記コマンドを実行。
$ git cherry-pick commit_id
パッチ
パッチの扱いについて記載。
作成
git addする前に変更した内容をパッチとして作成したいときは、下記コマンドを実行。
$ git diff > branch_name.patch
適用
パッチをワーキングディレクトリに反映させるときは下記コマンドを実行。
ここでは、-p0を指定しているので、同じ階層であることに注意。
$ patch -p0 < branch_name.patch