2021/03/01に数年ぶりに更新しつつ書き直しました!オリジナルはこのブログで7年前に書いたもので、途中からはQiitaで更新していたのですが今後はこちらを更新します。
自分用のメモですが、Gitを使って開発してる場合によくあることを簡単にまとめました。 特に使い始めの頃とか初心者の人が困ったときの手助けになれば。 なお、自己責任でお願いします。 ※間違いあったら指摘してください
- 変更確認系
- あれこれ修正したい
- 取り消し系
- その他いろいろ
- 他人のリポジトリをローカルの別ブランチにチェックアウトしたい
- github上でforkしたリポジトリの最新化
- 指定のタグをチェックアウトしてブランチ作成
- タグとタグの間のコミットログを表示
- タグの一覧表示
- タグがリンクしているコミットのハッシュ値を確認
- 特定のハッシュ値のコミットログを確認
- リモートリポジトリのタグを削除
- 特定ファイルのブランチによる違いの比較
- リモートブランチをトラッキング先に設定
- リモートブランチを削除したい
- 強制的にpushする
- 特定のコミットだけをマージしたい
- gitignoreで指定する前にaddしてしまった場合
- gitの設定を確認したい
- ユーザ名とメールアドレスを設定したい
- 普通にrmしたファイルをまとめてgit rmしたい
- mergeではなくrebaseで処理したい
- 最後に
変更確認系
変更箇所を直前のコミットタイミングと比較したい
git diff HEAD~1
差分のサマリを見たい
git diff --stat <source> <target>
スペースの変更を無視してdiffしたい
これをしないと全体をインデントしたときとかに悲惨です。
git diff --ignore-space-change <source> <target>
自分のリポジトリをフォークして作られた他人のリポジトリを比較
git remote add <name> <フォーク元もしくは比較したいリポジトリ> git fetch <name> #先ほど追加したリモートをfetch git diff FETCH_HEAD
フォーク元との比較にもどうぞ。
あれこれ修正したい
直前のコミットメッセージを変更したい
git commit --amend -m "new comment"
コミットをまとめたい
git rebase -i HEAD~5
エディタが開くのでpickなりrewordなりfixupなりを行う。 上記はHEADから5個前までのコミットを対象に作業している。
直前以前のコミットメッセージを変更したい
「コミットをまとめたい」とやり方は同じ。変更したい箇所までのHEADを指定してrebaseを実行する。 あとは変更したい箇所でpickなりをする。
コミッタ名やメールアドレスを変更したい
通常は以下の2コマンドで名前とメールアドレスを設定しておけば問題ない。
git config --global user.name "Your Name" git config --global user.email you@example.com
が、既に異なる名前でコミットされているものを後から変更したい場合は以下のような処理を実行すればよい
git filter-branch --commit-filter ' GIT_AUTHOR_NAME="New Name" GIT_AUTHOR_EMAIL="new@example.com" GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="new@example.com" git commit-tree "$@" ' HEAD
commit-filterの後にシェルスクリプトを記述する。 上記の場合は、全てのコミットログに対して名前とアドレスを変更する処理を行っているが特定のコミッタだけ変更したい場合などはシェルのif文なりで引っ掛ければよい
取り消し系
githubにpushしたcommitの取り消し
githubにpushして後にcommitが間違っていたことに気づいた場合など。 ただし、以下の手順を実施するとcommitだけでなく変更も失われるので注意。ローカルのソースツリーは残された最後のcommitに戻されます。変更を保存したい場合は使わないように。
git rebase -i HEAD~2 #エディタが開くので二行目を削除して保存する git push origin +master
github側だけcommitの取り消し
commitの取り消しをgithub側だけで行う場合。ローカルは同期されない。
git push -f origin HEAD^:master
ローカルだけcommitの取り消し
git reset HEAD^
git addの取り消し
git rm --cached <取り消したいファイル>
いろいろやり直したい(間違ってreset --hardした時とか)
git reflog
でHEADの変遷を表示して戻したい位置を指定してresetする。ちなみにHEAD@[0}が現在のHEAD位置。
git reset --hard HEAD@{1}
みたいな感じで。
間違って削除したファイルを元に戻したい
git checkout -f <対象ファイル>
ただし、変更も戻る。
ファイルを指定しない場合は全体が戻ります。
その他いろいろ
他人のリポジトリをローカルの別ブランチにチェックアウトしたい
git remote add <name> <フォーク元もしくは比較したいリポジトリ> git fetch <name> git checkout -b <branch_name> remotes/<remote_name>/<remote_branch_name>
github上でforkしたリポジトリの最新化
forkしたリポジトリをcloneした上でfork元のリポジトリをpullするだけ。 pullするにあたってはfork元をremoteに追加しておいてもいいし直接URL指定でもいい。
指定のタグをチェックアウトしてブランチ作成
git checkout -b <ブランチ名> refs/tags/<タグ名> #ブランチ作らないなら-b不要
タグとタグの間のコミットログを表示
git log v1.0..v1.1 --pretty=format:"%ci [%h]%s" #タグの代わりにハッシュ値を指定することもできる
タグの一覧表示
git tag -l
タグがリンクしているコミットのハッシュ値を確認
git rev-parse <タグ名>
特定のハッシュ値のコミットログを確認
git log ハッシュ値
リモートリポジトリのタグを削除
まずローカルでタグを削除してリモートを空のタグで上書きする
git tag -d <タグ名> git push origin :refs/tags/<タグ名>
特定ファイルのブランチによる違いの比較
git diff branch1 branch2 filepath
リモートブランチをトラッキング先に設定
git branch --set-upstream work remotes/origin/work
リモートブランチを削除したい
git push [remotename] :[branch]
強制的にpushする
リモート側のツリーを強制的に上書きしてローカルの内容でpushしたい場合
git push <リモート名> <ローカルブランチ> --force
特定のコミットだけをマージしたい
git log等で対象コミットのハッシュ値を確認した上でcherry-pickを実行する。
git cherry-pick <ハッシュ値>
gitignoreで指定する前にaddしてしまった場合
インデックスから削除すると同時にファイルも削除する場合
$ git rm -f hogehoge~
インデックスからだけ削除する場合 ※つまりファイルはそのまま
$ git rm --cached -f hogehoge~
gitの設定を確認したい
git config --list
ユーザ名とメールアドレスを設定したい
システム上の特定ユーザすべてのリポジトリで設定するには--global
オプションを指定する。
$ git config --global user.name "foo bar" $ git config --global user.email foo@example.com
普通にrmしたファイルをまとめてgit rmしたい
OS上でrmで削除してしまったものをgit上でも削除したいがうっかりフォルダごと、しかも複数消してしまって大量にある場合など
$ git rm $(git ls-files --deleted)
mergeではなくrebaseで処理したい
これはチーム開発とかをしていて開発ブランチがあって、そこから作業用のブランチを作成してプルリクしようってなったときに開発ブランチ側が別のコードがマージされてたりする場合に使えます。 普通に開発ブランチをpullして手元で作業ブランチにマージしてからプッシュしてプルリクでもいいけど、これだとmergeコミットが無限に増えるのでそれが嫌な場合など
$ git fetch $ git rebase 開発ブランチ $ git push -f origin 開発ブランチ
最後に
とりあえずこんなところで。 今後も自分で躓いたりして新しいネタ見つけたらちょいちょい気まぐれに追加していきます。