Git でよく使うコマンドを、自分用メモとしてまとめています。
- GitHub でリポジトリを作った直後にやること
- ブランチ操作
- コンフリクトの解消
- リモートリポジトリの設定
- .gitignore が反映されない
- ローカルだけ追跡対象から外したい
- 過去のコミットに戻りたい
- 最後のコミットを取り消す
- 誤って push したコミットを取り消す
- コミットメッセージを変更したい
- HEAD が宙ぶらりんになったとき
- stash で一時退避する
- 特定ファイルの差分を別ブランチと比較する
- 特定ファイルをコミット間で差分表示する
- 指定したコミット時点の特定ファイルを書き出す
- コミットツリーを見やすく表示する
- 特定ファイルを直近で変更した人を調べる
- リポジトリ全体で過去にコミットした人を一覧表示する
- 著者ごとのコミット数ランキングを表示する
- 特定ファイル内の文字列を、いつ・誰が入れたか調べる
GitHub 側で空のリポジトリを作成しておきます。
このとき、GitHub 側では README や .gitignore を作らないようにします。
プロジェクト配下で以下を実行します。
git init
touch .gitignore
git add .
git commit -m "first commit"
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
git push -u origin mainこれでローカルリポジトリをリモートへ反映できます。
git branch --show-currentgit branch feature/xxxgit checkout feature/xxxgit branch -d feature/xxx削除するブランチ以外にチェックアウトしている必要があります。
git branch -D feature/xxxコンフリクトが起きたら、まず落ち着いて状況を確認します。
git status対象ファイルを開くと、以下のようなマーカーが入っています。
<<<<<<< HEAD
(自分の変更)
=======
(相手側の変更)
>>>>>>> branch-name
<<<<<<< HEADから=======までが自分の変更=======から>>>>>>>までが相手側の変更
内容を確認して必要な形に修正し、マーカーも削除します。 VS Code などのエディタを使うと見やすいです。
git add 修正したファイル名git commitエディタが開いたら、必要に応じてメッセージを編集します。
git remote -vgit remote remove origingit remote add origin リモートリポジトリのURL.gitignore を書いたあとでも、すでに追跡済みのファイルには効かないことがあります。
その場合は一度キャッシュを削除します。
git rm -r --cached .大きなファイル (zip, mov など) は、できるだけ .gitignore に入れておくと安心です。
セキュリティ情報や個人設定など、ローカルだけ変更を無視したい場合に使います。 ただし、対象は すでに Git 管理されているファイル に限られます。
git update-index --skip-worktree path/to/filegit update-index --no-skip-worktree path/to/filegit ls-files -v | grep ^Sまたは:
git ls-files --others --ignored --exclude-standardskip-worktree はディレクトリ指定できないため、次のようにします。
find somewhere_dir -type f | while read f; do git update-index --skip-worktree "$f"; doneまたは、除外したいディレクトリ配下に .gitignore を置く方法も有効です。
まず履歴を確認します。
git log戻りたいコミットを見つけたら、そのハッシュでチェックアウトします。
git checkout コミットハッシュまだリモートへ push していない場合に使います。
git reset --soft HEAD^git reset --hard HEAD^リモートへ push 済みの場合の取り消し方法です。 共同開発では影響が大きいため、慎重に行います。
共同作業でない場合は次の方法が使えます。
git resetなどでローカルのコミットを戻す- 以下で強制反映する
git push origin ブランチ名 --force履歴を残したまま安全に取り消したい場合はこちらです。
git logで対象コミットを確認するgit revert <commit-hash>を実行する- そのまま push する
まだ push 前なら修正できます。
git commit --amendエディタが開いたらメッセージを編集します。
git refloggit show a1b2c3dgit checkout <branch>
git cherry-pick <commit-id>または:
git merge <commit-id>
git cherry-pickは、特定のコミットだけを現在のブランチへ取り込むコマンドです。
コミットせずに、いったん作業内容を退避したいときに使います。
git stashgit stash listgit stash popgit diff 別ブランチ名 -- path/to/file別ブランチ同士の比較もできます。
git diff ブランチA ブランチB -- path/to/filegit diff <commit1> <commit2> -- <file_path>例:
git diff abc1234 def5678 -- src/main.c現在の HEAD と比較する場合:
git diff abc1234 -- src/main.cgit show <commit_hash>:<file_path> > filenamegit show に渡すパスは、プロジェクトルートからの相対パス を使います。
git log --graph --date=short でも見られますが、エイリアスを追加すると見やすくなります。
git config --global --edit以下を追記します。
[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
lg = lg1その後、以下で表示できます。
git lg
git lg2git log -1 --pretty=format:"%h %an %ad %s" -- path/to/filegit log -n 5 --pretty=format:"%h %an %ad %s" -- path/to/filegit log --format='%aN' | sort -ugit log --format='%aN <%aE>' | sort -ugit shortlog -snegit blame -L <開始行>,<終了行> <file>