利用頻度は低いが、大事なときに使う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