Git 学习札记(四)撤销修改内容的方法

Git 学习札记(四)

直接丢弃修改的方法

git checkout – filename

对于修改了的工作区内容,如果直接丢弃,命令为 checkout,如下:

chia@edogawachia-sphinx:~/mygit$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

    修改:     readme.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
chia@edogawachia-sphinx:~/mygit$ git diff
diff --git a/readme.txt b/readme.txt
index d995350..e24b3e0 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,5 @@
 This is a readme file
 created by E.Chia 2018/02/06
 modified by E.Chia 1st time
+add this to show staged version
+add this to show working directory version
chia@edogawachia-sphinx:~/mygit$ git diff --cached
chia@edogawachia-sphinx:~/mygit$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index d995350..e24b3e0 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,5 @@
 This is a readme file
 created by E.Chia 2018/02/06
 modified by E.Chia 1st time
+add this to show staged version
+add this to show working directory version
chia@edogawachia-sphinx:~/mygit$ sudo git checkout -- readme.txt
chia@edogawachia-sphinx:~/mygit$ git diff
chia@edogawachia-sphinx:~/mygit$ git diff --cached
chia@edogawachia-sphinx:~/mygit$ git diff HEAD -- readme.txt
chia@edogawachia-sphinx:~/mygit$ cat readme.txt 
This is a readme file
created by E.Chia 2018/02/06
modified by E.Chia 1st time

通过 git diff 可以看到,stage中的和git仓库中的一样,且和工作目录中的不一样。那么我们应用 git checkout – filename 即将工作区中的修改丢弃了,工作区中的文件退到上一版本。下面我们看看这个回退是从仓库还是从暂存区退到的工作区域(因为上面的栗子stage和branch中的一样,所以看不出,我们先将三个的文件都改成不同的,再进行checkout)

chia@edogawachia-sphinx:~/mygit$ git diff
chia@edogawachia-sphinx:~/mygit$ git diff --cached
chia@edogawachia-sphinx:~/mygit$ git diff HEAD -- readme.txt
chia@edogawachia-sphinx:~/mygit$ git status
位于分支 master
无文件要提交,干净的工作区
chia@edogawachia-sphinx:~/mygit$ sudo vim readme.txt 
chia@edogawachia-sphinx:~/mygit$ cat readme.txt 
This is a readme file
created by E.Chia 2018/02/06
modified by E.Chia 1st time
staged flag hahaha
chia@edogawachia-sphinx:~/mygit$ sudo git add readme.txt 
chia@edogawachia-sphinx:~/mygit$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     readme.txt

chia@edogawachia-sphinx:~/mygit$ sudo vim readme.txt 
chia@edogawachia-sphinx:~/mygit$ cat readme.txt 
This is a readme file
created by E.Chia 2018/02/06
modified by E.Chia 1st time
staged flag hahaha
working dir flag hahaha
chia@edogawachia-sphinx:~/mygit$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     readme.txt

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

    修改:     readme.txt

chia@edogawachia-sphinx:~/mygit$ git diff
diff --git a/readme.txt b/readme.txt
index 1836987..3b5ce77 100644
--- a/readme.txt
+++ b/readme.txt
@@ -2,3 +2,4 @@ This is a readme file
 created by E.Chia 2018/02/06
 modified by E.Chia 1st time
 staged flag hahaha
+working dir flag hahaha
chia@edogawachia-sphinx:~/mygit$ git diff --cached
diff --git a/readme.txt b/readme.txt
index d995350..1836987 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
 This is a readme file
 created by E.Chia 2018/02/06
 modified by E.Chia 1st time
+staged flag hahaha
chia@edogawachia-sphinx:~/mygit$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index d995350..3b5ce77 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,5 @@
 This is a readme file
 created by E.Chia 2018/02/06
 modified by E.Chia 1st time
+staged flag hahaha
+working dir flag hahaha

可以看到,准备工作已经做好,实验checkout:

chia@edogawachia-sphinx:~/mygit$ sudo git checkout -- readme.txt
chia@edogawachia-sphinx:~/mygit$ git diff
chia@edogawachia-sphinx:~/mygit$ git diff --cached 
diff --git a/readme.txt b/readme.txt
index d995350..1836987 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
 This is a readme file
 created by E.Chia 2018/02/06
 modified by E.Chia 1st time
+staged flag hahaha
chia@edogawachia-sphinx:~/mygit$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index d995350..1836987 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
 This is a readme file
 created by E.Chia 2018/02/06
 modified by E.Chia 1st time
+staged flag hahaha
chia@edogawachia-sphinx:~/mygit$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

    修改:     readme.txt

可以看到,以上结果说明 checkout – filename 是将暂存区的结果给了工作区,从而消掉了工作区的修改,而git仓库的内容并没有改变。

git reset HEAD filename

前面已经讲过reset的相关用法,由于我们知道 git reset [ –soft / –mixed / –hard ] HEAD~ 可以完成版本的回退,其中HEAD~的作用是指示要退到的版本,mixed是默认值,所以如果我们输入:

sudo git reset 文件名

其等价于

sudo git reset --mixed HEAD 文件名

mixed 是默认参数,因此退回到stage区域,然后由于没有制定要退到的commit id 版本号,所以保持不变,用现在的位置指针HEAD表示这个参数,文件名指定,则只对这个文件操作。如图所示:


这里写图片描述

还有一种,这是从Git仓库的branch的各个版本中提取出某个版本然后置入暂存区的方法,命令为:

sudo git reset [commit id] -- 文件名

– 不指定,就是mixed,所以退回到缓存区,指定了commit id和文件名,因此将这个版本的这个文件退回到暂存区,但是HEAD不变。


这里写图片描述

常见场景应用

比较常见的应用就是如果改了工作区的东西,想直接丢弃(用现在的stage区域的内容覆盖),那么就用

git checkout -- 文件名

然后如果改了工作区并且add到了stage中,却想要扔掉(用git仓库中的当前版本覆盖),则有:

git reset HEAD 文件名
git checkout -- 文件名

第一步先将仓库中的HEAD所指的拿到stage中来,涂抹掉stage中不想要的改动,然后用checkout把工作区的改动涂抹掉。

也可以用:

git reset --hard HEAD 

不过这样的话似乎不能带路径硬性重置。

reference:

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374831943254ee90db11b13d4ba9a73b9047f4fb968d000

https://git-scm.com/blog

2018-02-07 20:23:34

posted @ 2018-02-07 20:25  毛利小九郎  阅读(148)  评论(0编辑  收藏  举报