Linusによって開発された分散型VCS (Version Controll System)

便利なコマンド

  • git remote update -p :リモートとローカルのブランチを同期?
  • git reflog :死んだコミットをよみがえらせることが出来るかも
  • git log --after=2023-01-01 --pretty='%Cgreen%as%Creset %s' :各コミットを1行で、日付とコミットメッセージの1行目だけ表示
  • git log --graph --format=reference --all:全ブランチの履歴を1行にして、グラフっぽい表示にする
    • --pretty='%Cgreen%as%Creset %Cblue%h%Creset %s'が良いのではと思っていた時代があった
      • それより前は --oneline を使っていたが、これだと日付が表示されない
      • しかしこんな長いフォーマットを毎回書いていられない
      • 日付を表示したいのであればreferenceが一応出してくれるので
        • ただ順番が hash, コミットタイトル, 日付 になるのでちょっと見づらい
  • git reset --mixed HEAD~:コミットされる前の状態に戻る
    • そのコミットによって発生していたdiffはunstageされた状態となる(mixed)
    • HEAD^ でも良い(違いはGitのHEADとresetで述べている)
  • git commit --amend :1つ前のコミットについて、ステージングしている編集を適用したり、メッセージを修正したりできる
    • n個前のものを編集する場合は git rebase -i HEAD~n して、これ↑をやってから git rebase --continue する
    • コミットメッセージを変更しない場合は --no-edit を付けるとメッセージ編集をスキップできる
  • git filter-branch --tree-filter "if [[ -e <dir0> && <dir1> ... ]]; then find <dir0> <dir1>... -type f | xargs -L1 sed -i '/STR/d' ; else true; fi" HEAD --all
    • 過去にコミットしたファイルから任意の記述を削除する
    • dir0 とか STR を置き換えるだけ
    • inc/*.hsrc/*.c に書かれた行を削除したかった時に用いた
    • git reflog expire --expire=now --all とか git gc --aggressive --prune=now もしたほうが良いらしい
  • git add -i
    • インタラクティブなgit add
    • プロンプトが表示され、diffをみたり(6: diff)、一部箇所をaddしたり(5: patch)できる
      • patchではハンク単位でステージしたり、ハンクをエディターで編集して残した部分だけステージしたりできる
  • git add -p
    • 前述のpatchでステージするモードに入る