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:
2018-02-07 20:23:34