Git
GitHub

Gitコマンド チートシート

ステータス確認系

  • git status : 状態の確認
  • git show [ID] : 変更の確認
  • git log : ログ確認
  • git log --decorate : HEADつきのログを表示
  • git log --oneline : ワンラインのログ表示
  • git log --graph : ログをグラフ表示
  • git log [branch] : 指定branchのログを見る
  • git config -l : gitの設定を表示
  • git cat-file -p [hash] : commit情報を確認
  • git diff [id1] [id2] : 差分を確認

git remote 系

  • ※originはリモートリポジトリの変数名のようなもの
  • git remote : リモートの名前を表示
  • git remote rm [name] : 設定削除
  • git remote -v : originの向き先を確認
  • git remote prune origin : リモートリポジトリを更新(state=消えていないブランチを消す)

originの設定変更

  • git remote add [name] [remote repository] : リモートリポジトリの名前設定を付追加
  • git branch --set-upstream master [name] : originの変更

git init 系

  • git init : 新規リポジトリの作成
  • git init --bare —shared : bareリポジトリの作成
    • 作業ファイルがなく(裸)、管理ファイル(更新情報)のみ
    • サーバー側のリモートリポジトリとして扱われる
    • sharedオプションで共有設定
    • bareの前にハイフンを二つつけないと内部構造がおかしくなる
    • 変更状態のみ保持しているので、実際に作業したファイルは直接みれない
    • ワーキングディレクトリをもたない

git clone 系

  • git clone [対象リポジトリのuri] [clone場所] : cloneを作成
    • clone場所に注意

git add 系

  • git add [file] : インデックスにあげる

git commit 系

  • git commit -m “message” [file] : コミットを行う
    • mオプションをつけることで単一コメントが可能
    • 新規ファイルやディレクトリも、add commitしない限り反映されない
  • git commit -am [file] : 一度addしたファイルに対して、addとcommitとを同時に行う
  • git commit —amend : 最新のcommit Messageを変更
    • editerで編集することができる
    • HashIDも変化するのでpullやpushする際は注意が必要

git push 系

  • git push [リモートリポジトリのパス] [ローカルのブランチ名]:[リモートのブランチ名(正しくは特殊変数refspec)]
    • 他リポジトリのbranchに変更を加える
    • 引数の両ブランチ名が同じなら[branch]を一つ書くだけで省略できる
    • 引数省略するとgitの設定により挙動が変わる場合があるので注意
    • cloneしてきたリポジトリなら、リモートリポジトリのパスをoriginに省略できる
    • --allオプション(宣言位置はどこでも)で、全てのローカルブランチをpushできる
    • エラーメッセージ:fast-forwardsは、最新ということを示す
    • 指定branchがremoteにない場合は新規作成される
    • git push [remote] :[remote branch] で空を送る =remote branchの削除が可能

git fetch 系

  • git fetch [remote repo] [branch]
    • 他リポジトリのbranchから追跡ブランチを取得
    • fetchで取得したブランチのcommitは、名前のないブランチとして取り込まれる
      • これは、FETCH_HEADというブランチ名でチェックアウトできる
    • 取得ブランチを取り込みたい場合はこのブランチをmergeするか、改めてpullすればいい
    • [branch]を省略で全てのbranchを取得
    • push時にconfrictが起きる状態で行うと、勝枝を増やしてくれる(= branchの取得)
      • これは、リモートリポジトリの情報をローカルに持ってきているため
      • git merge origin/master でmergingモードに入ることができconfrictを解消する必要はある

git pull 系

  • git pull [リモートリポジトリのパス] [リモートのブランチ名(正しくは特殊変数refspec)]
    • 他branchの変更をカレントbranchに取り込む
    • pull自体、fetchのあとにmergeをするようなもの
    • branchを省略した場合は、カレントbranchに[branch]がfetch → mergeされる(remote branchの追跡ブランチがローカルに残らない)
      • 指定した[branch]に変更が加わるわけではないので注意
    • エラーメッセージ:non-fast-forwardは、最新でないという意味
  • git pull --rebase
    • pullした時の挙動が fetch → mergeから fetch → rebaseになる

git merge 系

  • git merge [branch]
    • カレントbranchに、選択branchを統合する

コンフリクト起こしたら

  • 自分で該当箇所を編集 → add → commitすればいい
    • confrict時のcommitメッセは残らないままでいい(再commit時のメッセージで統合されるので)
  • push時のconfrictに関して、解消して再度pushをすれば、相手側で取り込む(pull)ものはconfrict解消済みのものを取り込める
  • pull時のmerge messageでvimが開く場合は、「mergeを勝手にしたのでmerge messageを編集しろ」という意味

マージ時のconfrictを片方だけ採用したいとき

  • git checkout --ours [file] : checkoutしているbranch側にあわせる
  • git checkout --theirs [file] : mergeされたbranch側にあわせる
    • confrict状態であれば、何回でも繰り返せる
    • 解消後、add commitを忘れないように注意

git branch 系

  • git branch : 現在のブランチを表示
  • git branch -a : 追跡ブランチ(赤色)含むlocal branchを確認
  • git branch -r : 追跡ブランチのみ確認
    • remotes/origin/HEAD->origin/*** はcloneした後に作業ディレクトリにcheckoutするbranchを表す
  • git branch [branch] : 新規branch作成
  • git branch [old_branch] [new_branch] : new branch を old branch に取り込む
  • git branch -d [branch] : branchを削除
    • DオプションでHEADにmergeされていないbranchも削除できる
    • カレントbranchはcheckout後でないとdeleteできない
  • git branch -m [old name] [new name] : branchの名前を変更
  • git branch -m [new name] : カレントbranchの名前を変更

git checkout 系

  • git checkout [branch] : branchに移動
    • : 追跡ブランチを指定してリモートにアクセスすることも可能
  • git checkout -b [branch] : 作成と同時に移動(branchのb)
  • git checkout [ID] [file] : 特定のcommitIDの時点に戻す
  • git checkout HEAD [file] : 最後にcommitした時点まで戻す = git checkout [file]
  • git checkout -b [branch] [origin/branch] : リモートブランチを[branch]の名前で取得して移動

git reset 系

  • git reset --hard
    • すべて(ワーキングツリー、インデックス、HEAD)を最新のcommit地点まで戻す
  • git reset HEAD : HEADの位置とインデックスをHEADに動かす
    • = git reset --mixed HEAD
    • addしたものを戻す
    • ただしrmで消すのとは異なり、足跡が残る
  • git reset --hard HEAD~ : 1つ前のcommit状態に戻る
  • git reset --hard HEAD~2 : 2つ前のcommit状態に戻る
  • git reset softとhardの違い
    • git reset --soft : ワークディレクトリの内容はそのままでコミットだけを取り消す。
    • git reset --hard : コミット取り消した上でワークディレクトリの内容も書き換える。

git stash 系

  • git stash : commit後の更新されていない変更を退避
  • git stash list : 退避リストが見れる
  • git stash pop : 元に戻す
  • git stash apply : リストを残したまま戻す
  • git stash save 'hoge' : stash自体に名前をつける
    • ただし、名前からstashを取れるわけではない(メモリは一つなので)
  • git stash drop : stashを削除

git tag 系

  • git tag [val] : 最新のcommitにタグをつける
    • checkoutでタグを指定して戻すことができる

git revert 系

  • git revert [ID] : ID時のコミットのみを取り消す
    • AA → BB → CC のコミット順序で、BBのIDをrevertすると、AAとCCのみ残る
      • resetやcheckoutではBB以降のCCも消えてしまう
    • revertを取り消すのは、git revert --abort

git rebase 系

  • git rebase [元になるbranch] [変更されるbranch(省略するとカレントbranch)]
    • 他branchの変更を取り込み吸収する
    • 履歴がわかりやすくなるというメリットがあり、複数のcommitを一つにできる。
  • git rebase develop [branch]
    • [branch]にdevelopを取り込む。headは[branch]になる
    • rebaseの後は git addgit rebase --continueを行う
      • rebaseは古い履歴から順にcommit単位でたどられるので、最新の情報とconfrictするわけではない
      • つまり、過去のコンフリクトから順に解消してしなければならない

git rebase -i [ID(HEAD~[数値])]

  • 指定したcommitの削除
    • 修正したいIDの一つ前を指定
    • 指定されたID以降のcommitがpickで表示される pick=そのまま利用
    • pick idを消すとそのコミットが消される
  • 指定したcommitの変更
    • 修正したいIDの一つ前を指定
    • 下の"pick"を"s"に書き換える → editerが再度立ち上がり、commit messageを変更できる
  • 指定したcommitの編集
    • 修正したいIDの一つ前を指定
    • "pick"を"e"に書き換え
    • (一時的に停止, コンフリクトしているので修正&addしろとmessage)vimで編集 → git add
    • git commit --amend で、commit message変更
    • git rebase --continue で、rebaseの再開

その他

インデックスからファイルをアンステージする(deleted logの削除)

  • git rm [file]
    • --cachedオプションでファイルは残す
    • -rオプションでディレクトリ削除
    • -fオプションで強制

ファイルをgitの対象外に指定したい

  • .gitignore
    • このファイルに追記したファイルはgitの対象外になる(トッラキングの対象外)
    • ただし、一度インデックスに載ったことがあるファイルは後で.gitignoreにいれても対象外にならない。
    • git rm --cached [file]でインデックスから降ろし、対象外にできる
    • 正規表現で判定されるので注意

その他 : 「No newline at end of file」が出た時

  • 末尾に改行が含まれていないため、警告がでている状態
  • vimにて、:set binary noeol実行で解決。