Git
GitHub

Gitコマンドまとめ

ステータス確認系

  • git status //状態の確認
  • git show [ID] //変更の確認
  • git tree //treeを表示
  • 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 add [name] [remote repo] //リモートの名前を付与
  • git remote rm [name] //削除
  • git remote -v //originの向き先を確認
  • git remote prune origin //リモートリポジトリを更新(pullやpushをしたから最新の状態とは限らない)

originの設定変更

  • git remote add [name] [remote repo] //リモートリポジトリに任意の名前を付与
  • 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場所に注意 . のように指定しないと構造がおかしくなる

git add 系

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

git commit 系

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

git push 系

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

git fetch 系

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

git pull 系

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

git merge 系

  • //カレントbranchと選択branchを統合する
  • git merge [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] //リモートブランチを取得し移動

git reset 系

  • git reset --hard
    • //すべて(ワーキングツリー、インデックス、HEAD)を最新のcommit地点まで戻す
  • git reset HEAD //HEADの位置とインデックスをHEADに動かす
    • //git reset 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 hoge
    • //hogeブランチにdevelopを取り込む。headはhogeになる
    • rebaseの後はadd→rebase --continue
    • rebaseは古い履歴から順にcommit単位でたどられるので、最新の情報とconfrictするわけではない(過去のコンフリクトから順に解消してしなければならないということ)

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

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