Git コマンドメモ5 (reset, reflog, svn)

HEADの位置を変更するgit resetに関しての備忘録。
オプションによっては、インデックス、ワーキングディレクトリも移動できる。

オプション 内容
--soft HEADのみ移動
なし、--mixed HEADとインデックスを移動
--hard HEAD、インデックス、ワークを移動

git reset

  • 現在の状態

    ローカルリポジトリのHEAD、インデックス、ワークがそれぞれ違う位置ある状態だったとする。

Img1

  • ステージされた変更をリセットする

    インデックスにaddされた変更が取り消しされる。

> git reset HEAD

Img2

  • HEADとインデックスを1つ前の履歴に移動する

    インデックスとHEADが現在の位置から1つ前の履歴に移動する。

> git reset HEAD^

Img3

  • HEADだけ移動

    HEADだけ1つ前の履歴に移動する。

> git reset --soft HEAD^

Img5

  • HEAD、インデックス、ワークすべて1つ移動
> git reset --hard HEAD^

Img4

git log

履歴の個々の変更をログに残して記憶している。このログをレフログと呼ぶ。操作のUndoヒストリーといった感じ。

下記例だと、HEAD@{0}HEAD@{1}というコミット履歴がある。

> git log -g
    commit 7be9882f771f32848a68f0959841e9cc84ccc45f
    Reflog: HEAD@{0} (hoge <hoge@sample.com>)
    Reflog message: checkout: moving from master to b03
    Author: hoge <hoge@sample.com>
    Date:   Thu Aug 30 14:18:38 2012 +0900
 
        aaa
 
    commit 1514be563a90c6628d41b6e4a12ce6d8375c5cc8
    Reflog: HEAD@{1} (hoge <hoge@sample.com>)
    Reflog message: checkout: moving from b02 to master
    Author: hoge <hoge@sample.com>
    Date:   Fri Jul 6 18:39:46 2012 +0900
 
        a4
</hoge@sample.com></hoge@sample.com></hoge@sample.com></hoge@sample.com>

なんらかの操作を取り消したいときなどに、復元ポイントとしてレフログを指定してgit resetする。

> git reset --hard HEAD@{1}

svnとの連携

svnのリポジトリからgitリポジトリへ移行したり、svnリポジトリへgitコマンドでコミットしたりできる。

  • svnリポジトリからクローンを作成する
> git svn clone [repository url]
  • svnリポジトリへ変更をプッシュする

    svn commitのようなもの

> git svn dcommit
  • svnのログを表示する
> git svn log