ゆっくりのんびり。

いの (@inox_ee) です

【Git】個人用備忘録

Git 備忘録

Git で知らなかったことまとめ。随時更新していきます

対象: なんとなく Git の仕組みが分かってきた人・add,commit,push,pull,checkout,branch は一応使える人

ToC

  • index, HEAD の違い
  • add のオプションまとめ
  • commit を削除する
  • commit をまとめる
  • 差分を見る
  • rebase 使い方
  • branch削除方法

☆index, HEAD の違い

要更新


☆add まとめ

$ git add ... の選択肢は以下の3つ。

  • file 名そのまま: ディレクトリを指定すればそれがステージングにあがる。 ex) $ git add ./app/models/clinic.rb
  • フォルダ名 フォルダ内を再帰的に add してくれる。 ex) $ git add ./app
  • まとめて追加 3 種類(⇒参考)

    • $ git add . バージョン管理されていないファイルは追加されない。 すなわち新たに追加されたもの変更があったものが対象。 Git ver.1 まではこうであったが、現在は追加変更削除いずれも追加される。
    • $ git add -u バージョン管理されているファイルをすべて追加。 すなわち変更があったもの削除されたものが対象。
    • $ git add -A[--all] 全てが追加される。

    $ git add .$ git add -Aの違い 前者はカレントディレクトリ下のファイルをすべて追加するが、後者はプロジェクトのどこからでも該当ファイルをステージングにあげるという違いが存在する。


☆commit の削除方法

  • commit を削除したことを残す $ git revert <commit>で削除可能。コンフリクトがおきたらがんばれ。 なお<commit>のところには commit ID を入力すればよい。

☆commit をまとめる方法

  1. $ git log --onelineでまとめたいコミットを確認。
$ git log --oneline

# 1a2b3c <commit msg3>
# 4d5e6f <commit msg2>
# 7g8h9i <commit msg1>
  1. $ git rebase -i HEAD~<n>により、HEAD から n 個の commit をまとめる。
  2. vim が展開するので、以下のように合成元をfixupに書き換える。:wqで保存。
pick 7g8h9i <commit msg1>
- pick 4d5e6f <commit msg2>
- pick 1a2b3c <commit msg3>
+ fixup 4d5e6f <commit msg2>
+ fixup 1a2b3c <commit msg3>

※やばいときは$ git rebase --abortで rebase を取りやめる。

参考


☆diff により差分を見る方法

git diffで差分を見れる。アレコレ書こうと思ったけど普通にこの Qiita が優秀だったので読みましょう。

参考 ⇒忘れやすい人のための git diff チートシート


☆rebase まとめ(含: stash, fetch)

git rebaseとは?

歴史のを改変するコマンド。以下の図が分かりやすい。

rebasemerge(則ちpull)のコミットログ比較(⇒参考)

rebaseとmergeの比較

分かりやすい。

やり方

ブランチ名は上記画像に則る。

  1. git fetch git fetch はリポジトリと結びついているorigin/masterが最新になる。(正確にはリモートのmasterブランチをもとに、ローカルにFETCH_HEADというブランチが構築され、それが最新状態になる。) 他人からの変更があった場合、こまめにやるのがよさそう。 ちなみにgit pullは、この fetch の作業が終わったのち作業ディレクトリに結び付く master を origin/master をもとに更新する。
  2. git rebase origin/develop featureブランチの"元"を上記図 D から引っ張るようにする。うまくいけば 3 へ。 以下うまくいかない場合
    • featureに commit が残っているとき この場合は、rebase をする前にgit stash saveを行う。この stash コマンドにより作業を一時退避させることができる。退避させたのち rebase を行い、git stash applyで適用する。以下便利なコマンド。
      • git stash list: stash の一覧を確認したい場合。
      • git stash apply <stash_name>: <stash_name>を適用する。コンフリクト起こしたときはがんばれ。
      • git stash drop <stash_name>: stash を削除するコマンド。適宜消すべし。
      • git stash pop <stash_name>: 適用と削除を一気に行うコマンド。自信がないうちは apply でいいよ。
    • conflict を起こしたとき Aborted! やらなにかしら吐いて rebase が一時中断される。 git statusで確認すると、コンフリクトを起こしているファイルはboth modifiedとなっているハズ。 適当なエディタ等でコンフリクトを solve したら、該当ファイルを add するのを忘れないように。 さらにそののちcommit はせずgit rebase --continueで rebase 処理を再開させる。この手順じゃないとうまくいかなかった。
    • よく分からなくなってしまったとき git rebase --aborted一択。rebase を実行する前の状態まで戻してくれるので、ヤバい!と思ったらこれを行う。
  3. git push --force origin feature あまりやりたくはないが push --force をやる。

一連の流れ

$ git fetch
$ git stash # プッシュしていないcommitがあったとき
$ git rebase origin/master
$ git status # コンフリクトがありそうなとき
$ git diff -- FILE_NAME # 差分を確認
$ git add FILE_NAME
$ git rebase --continue
$ git stash pop
$ git push --force origin mybranch

☆branch削除方法

ローカル

# コミット済み(HEADにmerge済?)の場合
git branch --delete my-branch
# 上記を問わない場合
git branch -D foo

リモート

# 一覧表示
git branch --remote
# 消し方は一通り
git push --delete origin my-branch