git resetの3つのモード

6532 ワード

新学gitは、gitのreset操作に対していつも狼を恐れて虎を恐れている.これは間違っている.どんな新鮮なものに対しても大胆にやってみなければならない.いくつかのブログを見て、何ページかの図書を見て概念を暗記して、永遠にその道理を完全に理解することはできません.くだらないことはあまり言わないで,直接品物を届けます.
まず実例を見る
mkdir git-reset
cd git-reset
git init

1
2
3
何度か提出を始める
echo "Hello, git rest" > readme.txt
git add .
git commit -m 'first commit'
echo "new line" >> readme.txt
git add .
git commit -m 'second commit'
echo "third line" >> readme.txt
git add .
git commit -m 'third commit'

1
2
3
4
5
6
7
8
9
提出ロゴを見て
git log --graph --oneline
 1. 33be59b third commit
 2. ab56d39 second commit
 3. c773001 first commit

1
2
3
4
現在コミットされているreadme
cat readme.txt 
Hello, git reset
a new line
the third line

1
2
3
4
まず、最初のresetモード、mixed、すなわちデフォルトのモードを見てみましょう.結果は以下の通りです.
git reset HEAD^
Unstaged changes after reset:
M   readme.txt

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:   readme.txt
no changes added to commit (use "git add" and/or "git commit -a")

git log --graph --oneline 
* ab56d39 second commit
* c773001 first commit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
何かわかりましたか.gitはコミットをsecond commitにロールバックし、一時保存領域(stageまたはindexとも呼ばれ、以下、一時保存領域の代わりにstageを使用)を空にしますが、作業領域は保持されます.git statusの場合、表示時に現在の作業領域のsecond commitに対する変動が表示されます.このモードを使うのは怖くないでしょう.彼はあなたのワークスペースをクリアすることはありません.third commitで行った操作は消えません.  2. 別の方法でソフトモード
git reset --soft HEAD^

git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

    modified:   readme.txt

1
2
3
4
5
6
7
8
見たでしょう.このモードではgitはステージ領域をクリアしません.そのため、git statusではsecond commitに対するステージ領域の変化が表示されます.この場合、ワークスペースはcleanであり、stageエリアは変化します.  3. 第3の方法hard
git reset --hard HEAD^
HEAD is now at ab56d39 second commit

git st
On branch master
nothing to commit, working directory clean

cat readme.txt 
Hello, git reset
a new line

1
2
3
4
5
6
7
8
9
10
この場合、ワークスペース、ステージエリアはすべてきれいですが、readme.txtは2回目の提出はいの状態に残忍に戻った.これは何を説明して、このモードを採用して、gitはsecond commitの内容でstage区と作業区をカバーして、そのためすべての内容はsecond commitの状態に戻りました.
インスタンスが完了したら、git reset–softはステージ領域を変更せず、指定されたコミットgit reset–mixedにcommitをロールバックするだけでワーク領域は変更されませんが、指定されたcommitでステージ領域を上書きし、これまですべての一時保存されたコンテンツが一時保存された状態git reset–hardになり、指定されたcommitのコンテンツでステージ領域とワーク領域を上書きします.
いつも後悔薬があって、git resetはgitが私たちにくれたcommitレベルのロールバック方式です.