Git基礎のメモ2 (add, commit, checkout, diff, rm)

Gitリポジトリへの登録

  • ステージング ( git add )

    CVS、SVNにない概念。Gitのリポジトリには、コミット領域とは別にインデックスと呼ばれる領域がある。 修正ソースとコミットされるリポジトリ領域の間に存在する。 インデックスにステージングされていないファイルや変更は、コミットされない。 作成したファイルをリポジトリへ新規登録するときに行う処理。

    オプションを省略すると、新規更新すべてが対象になる。
    -uをつけると、更新されたファイルのみが対象。
    -Aをつけると、新規更新削除されたファイルのみが対象。

    $ git add .
    $ git add -u
    $ git add -A
    

    ちなみにgit addした後、そのファイルをさらに編集すると、git statusで状況を 確認すると、以下のようになる。

    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   test.txt
    

    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   test.txt
    

    同一ファイルが、ステージ済みとそうでないものに分かれて表示される。 これは、git addした時点の内容がステージに存在し、==その後の修正分がまだステージに載ってない 状況==になる。この状態でgit commitすると、ステージ上の修正のみがコミットされる。

  • ローカルのリポジトリに登録する ( git commit )

    git commitコマンドで、ステージされているすべてのファイルをローカルのgitリポジトリに登録する。 CVS、SVNのコミットとほぼ同じ。git commitを実行するとviエディタ画面が表示されてコメントを入力し、 保存終了するとコミットされる。コメント未記入で終了するとコミットがキャンセルされる。 -amは、git add -ucommitを同時に行う。

    $ git commit                コメント入力画面へ遷移。入力後コミットされる
    $ git commit -m "message"   コメント入力画面遷移を省略して、オプションでコメントを追加 
    $ git commit -am "message"  git add -u とgit commitを同時に行う
    

    -vオプションをつけると、コミットメッセージを記入するエディタ内にdiffの結果も表示される

      > git commit -v
    
    ( 以下はエディタの内容)
    

    Please enter the commit message for your changes. Lines starting

    with '#' will be ignored, and an empty message aborts the commit.

    On branch master

    Changes to be committed:

    modified: test.txt

    ------------------------ >8 ------------------------

    Do not touch the line above.

    Everything below will be removed.

    diff --git a/test.txt b/test.txt
    index 72943a1..bca1092 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -1 +1,2 @@
    aaa
    +bbbb

  • 前回のコミットに関する修正 ( git commit --amend )

    git commitでリポジトリへの登録後、ちょっとしたミスやプチ修正が発生したとする。 直前のコミットとして登録し直したい場合には、commit時に–-amendオプションを 追加して実行すると、ミスした履歴を上書きできる。

    またコメントだけ修正する場合も–amendオプションでコミットすれば最後のリビジョンのコメントが入れ替わる。 リビジョンアップせずに上書きするイメージである。

    $ vi sample.txt   修正
    $ git add sample.txt ステージに追加
    $ git commit --amend -m "message1" "message1"でコミット
    $ git commit --amend -m "message2" コメントだけ"message2"に修正
    

Gitリポジトリからのチェックアウト

Gitにおけるcheckoutの役割は、

  1. 指定したリビジョンの内容をリポジトリから取得して、ワーキングディレクトリを書き換える
  2. ブランチを切り替える

の2つになる。が、ブランチの切り替えも結局は指定したリビジョンの内容でワーキングディレクトリ を書き換えることと大差がない。

git checkoutで良く使う構文としては、以下になる。

  • ブランチの切り替え。-bオプションを追加すると、ブランチの新規作成と切り替えを同時に行う。

    > git checkout [<branch>]
    > git checkout -b [<branch>]
    
  • 指定したリポジトリの内容で、ワーキングディレクトリを書き換える
    ==path==だけを指定した場合、ステージ(インデックスツリー)の 内容から、ワーキングディレクトリの内容を書き換える。

    > git checkout [<path>]
    

    ==point==と==path==を指定した場合、コミット済みのリポジトリの内容から、 ステージとワーキングディレクトリの両方の内容を書き換える。

    > git checkout [<point>][<path>]
    
  • 変更箇所の確認 ( git diff )

    git diffコマンドで確認できる。
    ==ステージされてない変更箇所==を確認する場合は、引数なしで実行する。 ステージ済みの内容とステージされてない内容の差分が抽出される。

     > git diff test.txt
     -  (press RETURN)diff --git a/test.txt b/test.txt
      index d9c3d2e..660b155 100644
      --- a/test.txt
      +++ b/test.txt
      @@ -1,3 +1,4 @@
      hello
      xxx
      bbbb
      +aaa
    

    ==ステージされた変更箇所==を確認する場合は、引数に--staged(または--cached)を追加する。 これにより、コミット済みの内容とステージされた内容の差分が抽出される。

      > git diff --staged test.txt 
      -  (press RETURN)diff --git a/test.txt b/test.txt
      index ce01362..d9c3d2e 100644
      --- a/test.txt
      +++ b/test.txt
      @@ -1 +1,3 @@
      hello
      +xxx
      +bbbb
    

リポジトリからファイルを削除

  • ファイルの削除 ( git rm )

    管理されているファイルを管理対象から外してファイルも削除する場合は、git rmを使う。 ワーキングディレクトリ上で実行すると、実際にファイルが削除されて、==削除した== という内容がステージされる。その後コミットすることによってリポジトリからも削除される。

     > git rm test.txt
     > git status
     On branch master
     Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        deleted:    test.txt
    

    > git commit -m "delete file"

    間違えてコミットしてしまった。ファイルは削除せずにGitの管理対象外としたい。

    この場合、まずステージにあるファイルを削除し、削除内容をコミットする。 ワーキングディレクトリのファイルは、管理対象外ファイルとして残る。

    > git rm --cached <file>
    > git rm -r --cached <directory>
    > git commit -m "xxx"
    

    間違えてgit rmしてしまった。ファイルを復活したい。

    コミットしてないのであれば、リポジトリのHEADからチェックアウトすればよい。

    > git rm test.txt
    rm test.txt
    > git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        deleted:    test.txt
    

    > git checkout HEAD .
    > git status
    On branch master
    nothing to commit, working directory clean
    > ls
    test.txt