Help us understand the problem. What is going on with this article?

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実行で解決。
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away