• 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

  • 相关阅读:
    Apache Druid 的集群设计与工作流程
    跨越算法开篇
    十分钟了解Apache Druid(集数据仓库、时间序列、全文检索于一体的存储方案)
    时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)
    C#多线程(6):线程通知
    C#多线程(5):资源池限制
    C#多线程(4):进程同步Mutex类
    C#多线程系列(3):原子操作
    C#多线程系列(2):多线程锁lock和Monitor
    C#多线程系列(1):Thread
  • 原文地址:https://www.cnblogs.com/morikokyuro/p/13256818.html
Copyright © 2020-2023  润新知