Git

[初心者向け]こんなときどうする⁉︎ GitのTips31選!


はじめに

半分自分用のメモですが、Gitを使って開発してる場合によくあることを簡単にまとめました。

よくあるネタではあるのですが、自分が困ったときに調べた結果をまとめています。

特に使い始めの頃とか初心者の人が困ったときの手助けになれば。

なお、自己責任でお願いします。

※この記事は元々自分のブログに投稿していたものを少し手直しして転載したものです

※間違いあったら指摘してください

※数が増えてたのにタイトルが26のままだったので修正しました


変更確認系


変更箇所を直前のコミットタイミングと比較したい

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)


最後に

今後も自分で躓いたりして新しいネタ見つけたら更新していきます。

  • あれこれ修正したい
  • 取り消し系
  • その他いろいろ
  • 最後に