【Git】diffコマンドパターンの因数分解


コマンドのほうを、すっきりさせられないか、トライしてみました。

主な考え方

まずは、 大きく 修正しているもの(Working Tree / index)がdiffの比較対象にあるかないかで3パターンずつに分けられます。その時、 diff比較対象として WTの記述は省略します。 WTではなく、あるcommitとindexを対象とするときは --cachedを使います。commitを省略した場合、HEADが比較対象になります。

もう一方の3つは、同じ種別の比較対象を2つ明記するやり方です。

HEAD
1
Working Tree
2
index
3


WT/indexに
関係あり
用途 比較対象を 対象旧 対象新 備考
○あり
修正対象に対して
今、修正しているもの(WT)が
ステージングにあるか
省略する
(2つとも)
WT(*) index(*)
commit済み内容と、
修正しているもの(WT)
省略する
(commit側
だけ書く)
commit WT(*)
commitするもの(index)と、
commitしたもの
省略可
(--cached
を記載)
HEAD(*)
/commit
index(*)
×なし <commit> 2つとも省略しない - - 比較対象の間はスペース以外に..でも可
...だと比較元は共通の親のcommitとなる。
<blob> - -
--no-index <file-path> - -
(*):デフォルト・既定値


  • blob比較以外 file-pathを指定することが可能。git内で解決できないパスの場合 -- オプションをパスより前に1度つける。
  • commit /blob は branchやタグ、ハッシュIDが使える。
  • branch:a.txtのようにブランチとファイルパスを指定可能。
  • 一つ前のcommitをしているするときは、^か~を使う。mergeされている場合~[数字]を使う。番号は commit情報で確認するか、interactive modeでできる。
  • コマンドサンプル

    コマンドフォーマットと、実行例(⇒)をイメージしやすいように、並べてみます。

    ◆比較対象省略パターン
    ◇WTが対象にある
    git diff
     [<options>] [<commit>] [--] [<path>…​]

    ⇒ git diff
    ⇒ git diff HEAD^
    ⇒ git diff HOTFIX

    ◇index( + 特定commit)が対象
    git diff [<options>] --cached [<commit>] [--] [<path>…​]
    ⇒ git diff --cached

    ◆比較対象明示パターン
     (3種それぞれで、比較対象を2つ指定するパターン)
    git diff [<options>] <commit> <commit> [--] [<path>…​]
    ⇒ git diff HEAD^^ HEAD^
    ⇒ git diff master HEAD~1

    git diff [<options>] <blob> <blob>
    ⇒ git diff 16cba7..3c92ac
    ⇒ git diff c3ce23 a92c74d

    git diff [<options>] --no-index [--] <path> <path>
    ⇒ git diff --no-index -- abc/file.txt xyz/file.txt

    Git - git-diff Documentation
    https://git-scm.com/docs/git-diff

    関連リンク

    【Git】ざっくり理解編
    【VisualStudioCode】使えるコマンドや機能例ショートカットから拡張機能まで【大まとめメモ】

    コマンド実行例

    fileA.txtの中身を
    "apple" -> "banana" -> "cherry"
    と変更し、

    コミットの変化を見たもの。

    diffの結果から、比較対象がどう変化しているのか確認することに
    使ってみてください。

    空のプロジェクト状態から、fileを配置(ひとつ)
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ ls
    fileA.txt
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git add fileA.txt
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git status
    On branch master
    
    Initial commit
    
    Changes to be committed:
      (use "git rm --cached ..." to unstage)
    
            new file:   fileA.txt
    
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git commit
    [master (root-commit) bfd4661] apple
     1 file changed, 1 insertion(+)
     create mode 100644 fileA.txt
    
    banana に変更
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff
    diff --git a/fileA.txt b/fileA.txt
    index 4c479de..637a09b 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -apple
    +banana
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git checkout -- ..." to discard changes in working directory)
    
            modified:   fileA.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git add fileA.txt
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
            modified:   fileA.txt
    
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff --cached
    diff --git a/fileA.txt b/fileA.txt
    index 4c479de..637a09b 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -apple
    +banana
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff HEAD
    diff --git a/fileA.txt b/fileA.txt
    index 4c479de..637a09b 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -apple
    +banana
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff --cached HEAD
    diff --git a/fileA.txt b/fileA.txt
    index 4c479de..637a09b 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -apple
    +banana
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git commit
    [master 5cddb64] banana
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git status
    On branch master
    nothing to commit, working directory clean
    
    cherryに変更
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git checkout -- ..." to discard changes in working directory)
    
            modified:   fileA.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff
    diff --git a/fileA.txt b/fileA.txt
    index 637a09b..44a9105 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -banana
    +cherry
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff --cached
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff HEAD
    diff --git a/fileA.txt b/fileA.txt
    index 637a09b..44a9105 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -banana
    +cherry
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff HEAD^
    diff --git a/fileA.txt b/fileA.txt
    index 4c479de..44a9105 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -apple
    +cherry
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git log
    commit 5cddb647b2488bfd2f40878eaa3398913f55d1b0
    Author: XXX@YYY <happy@birthday.com>
    Date:   Wed Apr 24 03:52:17 2019 +0900
    
        banana
    
    commit bfd466157320ca2803cd23ec30245fada6c360d5
    Author: XXX@YYY <happy@birthday.com>
    Date:   Wed Apr 24 03:48:49 2019 +0900
    
        apple
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git reflog
    5cddb64 HEAD@{0}: commit: banana
    bfd4661 HEAD@{1}: commit (initial): apple
    
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git add fileA.txt
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD ..." to unstage)
    
            modified:   fileA.txt
    
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff --cached
    diff --git a/fileA.txt b/fileA.txt
    index 637a09b..44a9105 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -banana
    +cherry
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff HEAD
    diff --git a/fileA.txt b/fileA.txt
    index 637a09b..44a9105 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -banana
    +cherry
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff HEAD^
    diff --git a/fileA.txt b/fileA.txt
    index 4c479de..44a9105 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -apple
    +cherry
    
    XXX@YYY PEKEPON64 /usr/bin/PPP/program/gittest
    $ git diff --cached HEAD
    diff --git a/fileA.txt b/fileA.txt
    index 637a09b..44a9105 100644
    --- a/fileA.txt
    +++ b/fileA.txt
    @@ -1 +1 @@
    -banana
    +cherry
    

    Delicious にシェア
    Digg にシェア
    reddit にシェア
    LinkedIn にシェア
    LINEで送る
    email this
    Pocket

    46 views.



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です