zoukankan      html  css  js  c++  java
  • git stash 用法

    git stash用于将当前工作区的修改暂存起来,就像堆栈一样,可以随时将某一次缓存的修改再重新应用到当前工作区。

    一旦用好了这个命令,会极大提高工作效率。
     
    直接举例说明:
    1、准备工作,首先初始化一个git仓
        随便建立一个目录,进去,然后使用 :
        $: git init .
        添加一个文件:
        $: touch hello
        $: git add .
        $: git commit -m "first add"
     
    2、暂存当前修改内容(git stash)
        假设我们在写一个C函数,如下:
    yang@Ubuntu64:~/code/linux/git$ vim hello.c 
    yang@Ubuntu64:~/code/linux/git$ git diff
    diff --git a/hello.c b/hello.c
    index e69de29..bdc92a5 100644
    --- a/hello.c
    +++ b/hello.c
    @@ -0,0 +1,2 @@
    +void func1(void) {printf("this is func1");}
    +void main(void) {return func1();}
     调试OK,发现func1功能OK,但是应该优化一下,可能效率更高,这个时候怎么办?
     直接改func1的话,如果发现修改不合适,想回退的话很麻烦,这个时候可以用git stash将将修改暂存起来。
    yang@Ubuntu64:~/code/linux/git$ git stash
    Saved working directory and index state WIP on master: 452b08d rename hello as hello.c
    HEAD is now at 452b08d rename hello as hello.c
    yang@Ubuntu64:~/code/linux/git$ git status
    On branch master
    nothing to commit, working directory clean
     
    3、弹出修改内容(git stash pop)
      这个时候你重新编写func1, 发现效果不好,后悔了,于是可以用git stash pop命令,弹出刚才的内容(注意先用git checkout . 清空工作区)
     
    yang@Ubuntu64:~/code/linux/git$ vim hello.c 
    yang@Ubuntu64:~/code/linux/git$ git diff
    diff --git a/hello.c b/hello.c
    index e69de29..9c5bff3 100644
    --- a/hello.c
    +++ b/hello.c
    @@ -0,0 +1 @@
    +some bad chenges....
    yang@Ubuntu64:~/code/linux/git$ git checkout .
    yang@Ubuntu64:~/code/linux/git$ git stash pop
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   hello.c
    
    no changes added to commit (use "git add" and/or "git commit -a")
    Dropped refs/stash@{0} (208ca2e2c0c455da554986a6770a74ad0de5b1e0)
    yang@Ubuntu64:~/code/linux/git$ git diff
    diff --git a/hello.c b/hello.c
    index e69de29..bdc92a5 100644
    --- a/hello.c
    +++ b/hello.c
    @@ -0,0 +1,2 @@
    +void func1(void) {printf("this is func1");}
    +void main(void) {return func1();}

    注意,git stash pop 弹出成功后,暂存列表里面就没有了,如果当前工作区不干净,弹出时有冲突,则暂存列表会继续保留修改。

    4、可以保存多个修改
      假设你在实现一个功能,有好几种算法可以实现,你想逐个尝试看效果。
      现在你在func1中实现了一种方法,准备尝试写func2,用另一种方法。
      那么可以将func1的修改入栈,去写fun2,等fun2写好后,你又想试试func3,那么没关系,可以用同样的方法保存func2的修改:
      
    yang@Ubuntu64:~/code/linux/git$ git diff
    diff --git a/hello.c b/hello.c
    index e69de29..bdc92a5 100644
    --- a/hello.c
    +++ b/hello.c
    @@ -0,0 +1,2 @@
    +void func1(void) {printf("this is func1");}
    +void main(void) {return func1();}
    yang@Ubuntu64:~/code/linux/git$ git stash
    Saved working directory and index state WIP on master: 452b08d rename hello as hello.c
    HEAD is now at 452b08d rename hello as hello.c
    yang@Ubuntu64:~/code/linux/git$ git status
    On branch master
    nothing to commit, working directory clean
    yang@Ubuntu64:~/code/linux/git$ vim hello.c 
    yang@Ubuntu64:~/code/linux/git$ git diff
    diff --git a/hello.c b/hello.c
    index e69de29..7fd0a13 100644
    --- a/hello.c
    +++ b/hello.c
    @@ -0,0 +1,2 @@
    +void func2(void) {printf("this is func2");}
    +void main(void) {return func2();}
    yang@Ubuntu64:~/code/linux/git$ git stash
    Saved working directory and index state WIP on master: 452b08d rename hello as hello.c
    HEAD is now at 452b08d rename hello as hello.c
    yang@Ubuntu64:~/code/linux/git$ git status
    On branch master
    nothing to commit, working directory clean
    5、查看保存的内容列表(git stash list)
      现在我们保存了两个修改,一个func1,一个func2,可以通过git stash list去查看保存内容列表:
      
    yang@Ubuntu64:~/code/linux/git$ git stash list
    stash@{0}: WIP on master: 452b08d rename hello as hello.c
    stash@{1}: WIP on master: 452b08d rename hello as hello.c
      可以清楚的看到这两次修改,stash@{0}和stash@{1}, 那么哪个对应func1,哪个对应func2的修改呢?
      这时我们需要使用git stash show stash@{X}命令来查看,其中‘X’表示列表号。
    yang@Ubuntu64:~/code/linux/git$ git show stash@{0}
    commit 72e6a391bcad186ab24676aa1db8d5831c99cec9
    Merge: 452b08d 6c95c30
    Author: NickYang <yang@Ubuntu64>
    Date:   Sat Mar 12 19:56:18 2016 +0800
    
        WIP on master: 452b08d rename hello as hello.c
    
    diff --cc hello.c
    index e69de29,e69de29..7fd0a13
    --- a/hello.c
    +++ b/hello.c
    @@@ -1,0 -1,0 +1,2 @@@
    ++void func2(void) {printf("this is func2");}
    ++void main(void) {return func2();}
    yang@Ubuntu64:~/code/linux/git$ git show stash@{1}
    commit 7fcca4b66640c51ca76e637df03264b7c41885be
    Merge: 452b08d 1c37881
    Author: NickYang <yang@Ubuntu64>
    Date:   Sat Mar 12 19:54:35 2016 +0800
    
        WIP on master: 452b08d rename hello as hello.c
    
    diff --cc hello.c
    index e69de29,e69de29..bdc92a5
    --- a/hello.c
    +++ b/hello.c
    @@@ -1,0 -1,0 +1,2 @@@
    ++void func1(void) {printf("this is func1");}
    ++void main(void) {return func1();}

     发现stash@{0}对应func2的修改, stash@{1}对应func1的修改,原来新入栈的修改,其代号为0,循环命名。

    6、应用任意一次修改到当前目录(git apply stash@{x})
     如果现在又想回到func1的修改,怎么办呢?在工作区干净的情况下,要使用git stash apply stash@{1}。
     注意这时不能使用git stash pop, 它将最栈顶,即stash@{0}的修改弹出来,而func1现在已经是stash@{1}了。
     
    yang@Ubuntu64:~/code/linux/git$ git stash apply stash@{1}
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   hello.c
    
    no changes added to commit (use "git add" and/or "git commit -a")
    yang@Ubuntu64:~/code/linux/git$ git diff
    diff --git a/hello.c b/hello.c
    index e69de29..bdc92a5 100644
    --- a/hello.c
    +++ b/hello.c
    @@ -0,0 +1,2 @@
    +void func1(void) {printf("this is func1");}
    +void main(void) {return func1();}

      可见git stash apply可以将列表中任何一次修改应用到当前工作区,我们再次git stash list一把:

       
    yang@Ubuntu64:~/code/linux/git$ git stash list
    stash@{0}: WIP on master: 452b08d rename hello as hello.c
    stash@{1}: WIP on master: 452b08d rename hello as hello.c
      我们发现,虽然func1的修改已经被弹出应用到当前工作区,其修改内容还继续保留在暂存列表,并未丢弃。
      当然,我们可以使用git stash drop stash@{1}来丢掉stash@{1}
     
    7、保存时打标记(git stash save)
      假设现在我们又开始尝试写func3, 这样越来越多,这样列表会越来越大,你要想搞清楚某次修改对应哪个函数,就要挨个用git stash show看一遍,很麻烦。
      那么,这个时候git stash 的save参数就有用了,它可以为这次暂存做个标记,使得你用git stash list的时候显示这些标记,方便你回忆是修改的什么:
    yang@Ubuntu64:~/code/linux/git$ vim hello.c 
    yang@Ubuntu64:~/code/linux/git$ git diff
    diff --git a/hello.c b/hello.c
    index e69de29..786c214 100644
    --- a/hello.c
    +++ b/hello.c
    @@ -0,0 +1,2 @@
    +void func3(void) {printf("this is func3");}
    +void main(void) {return func3();}
    yang@Ubuntu64:~/code/linux/git$ git stash save "this is func3"
    Saved working directory and index state On master: this is func3
    HEAD is now at 452b08d rename hello as hello.c
    yang@Ubuntu64:~/code/linux/git$ git stash list
    stash@{0}: On master: this is func3
    stash@{1}: WIP on master: 452b08d rename hello as hello.c
    stash@{2}: WIP on master: 452b08d rename hello as hello.c

      我们在save后面指定一个字符串,作为提醒,这样在git stash list查看时就能知道每一个代号对应的修改了。

  • 相关阅读:
    ./configure时候遇到的问题 Cannot find install-sh, install.sh, or shtool in ac-aux
    携程ELK
    操作系统日志分析中常见的搜索条目 20160715
    日志分析方法
    通过UUID方式在fstab中挂载分区
    Linux上查看造成IO高负载的进程
    Logstash 最佳实践
    使用sqlplus执行sql时,发现有中文有乱码解决方法
    Nginx模块GeoIP匹配处理IP所在国家、城市
    《iOS Human Interface Guidelines》——Segmented Control
  • 原文地址:https://www.cnblogs.com/yanghaizhou/p/5269899.html
Copyright © 2011-2022 走看看