美文网首页
7.3 Git Tools - Stashing and Cle

7.3 Git Tools - Stashing and Cle

作者: 老沈Rosen | 来源:发表于2017-05-06 15:32 被阅读0次

    下载初始化仓库

    $ git status
    
    当前位于test分支,并且修改啦两个文件,一个已经staged,还有一个没有
    $ git stash
    
    stash命令把当前`working directory`和`index`的内容都存储起来
    $ git status
    
    现在status命令查看,`working directory`已经没有修改啦,是干净的。
    $ git stash list
    
    `stash list`命令就是列出已经stash的内容,输出结果还包括啦stash时的分支和当时所在commit的SHA-1值 如果有新的stash时,会在老的列表上面新建,把现在的这个stash@{0}压下去,变成stash@{1}
    $ git log --oneline --graph --decorate
    
    分支结构图可知,`stash list`输出结果中的确实是stash时所在分支所指向的commit的SHA-1值
    $ git checkout master
    
    切换到`master`分支
    打开hello.txt,作如上的修改
    $ git stash apply
    $ git stash apply stash@{0}
    
    恢复stash的内容,用上面的命令就行,可以在apply后面声明是哪一个stash, 不声明,Git会默认选择最新的那个。 恢复stash并不一定要保持`working directory`干净, 也不一定要在同一个branch上(在test的stash可以恢复到master分支), 如果恢复时出现冲突,git停止恢复,提示冲突。 因为stash存储啦对hello的修改,所以恢复时提示冲突,停止恢复, 提示我们要先commit或者stash才可以继续恢复 但是,如果修改的是afternoon.txt文件(stash存储中没有对这个文件的修改), 那么可以直接`git stash apply`完成恢复,不会产生冲突
    $ git add hello.txt
    $ git stash apply
    
    因为stash apply命令是把原来存储的修改都恢复到`working dirctory`, 所以可以先把当前对hello.txt的修改添加到`Index`, 然后在stash apply恢复
    $ git checkout -- hello.txt morning.txt
    $ git status
    
    用checkout命令,把`working dirctory`中刚刚恢复的修改撤销掉,然后再查看status,只有index里面还有hello的修改
    $ git stash apply --index
    
    这个命令恢复stash的内容时, 会把原来已经staged的文件(就是在index中的文件)也恢复, 不加`--index`时,会把所有存储的操作都恢复到`working directory`, 因为index中有对hello的修改存在,所以恢复依然终止
    $ git status
    
    查看status,stash没有恢复,原来index中的修改也清楚啦,`working directory`的修改保留
    $ git checkout -- hello.txt
    $ git stash apply stash@{0} --index
    
    撤销`working directory`的hello.txt修改,然后用加上`--index`的命令恢复stash,此时输出结果可以看到,跟刚开始在test分支时的状态是一样的,修改的hello.txt添加到index,morning.txt的修改没有添加
    $ git stash list
    $ git stash drop stash@{0}
    
    用drop stash命令丢弃无用的stash
    $ git status
    $ git stash
    
    此时master分支仍然保留着恢复时的状态,再次用git stash存储状态
    $ git stash list
    $ git stash pop stash@{0}
    $ git stash list
    
    用`git stash pop`命令恢复stash后会立即从栈中删除对应的stash `git stash list`没有输出结果

    Stash命令的一些其他参数的使用

    $ git add hello.txt
    $ git status -s
    
    把hello.txt添加到index,然后再复制一份hello.txt,名字是`hello (2).txt` 用git status -s查看状态,如上图
    $ git stash --keep-index --include-untracked
    $ git stash --keep-index -u  //-u == --include-untracked
    $ git status -s
    
    参数`--keep-index`表示保留index里面的状态 `--include-untracked`表示包括没有追踪的文件(就是上面复制的hello (2).txt) 然后在用`status -s`查看,只剩下index中的状态啦
    $ git checkout --f master
    $ git status -s
    
    `checkout --f master`撤销掉所有更改,打开hello.txt文件,前面两行添加(master1)(master2)最后两行加上(master19)和(master20)
    $ git stash --patch
    y
    n
    
    `--patch`参数用于存储部分的修改,如图,对前面两个修改进行存储,不存储后面两个修改
    打开hello.txt,可以看到,上面两行的修改已经存储起来了,下面的两行依然保留

    如果stash已经无法在当前分支上恢复,可以尝试从stash新建一个branch测试代码

    $ git checkout -f HEAD  //撤销掉上面剩下的所有修改
    $ git stash branch testchanges stash@{0}
    
    `stash branch testchanges`命令将新建testchanges分支,checkout执行stash存储命令时所在的那个commit,然后把存储的修改重新引用到那个commit上,testchanges分支指向那个commit

    清除working dirctory里面的文件

    相关文章

      网友评论

          本文标题:7.3 Git Tools - Stashing and Cle

          本文链接:https://www.haomeiwen.com/subject/fiustxtx.html