git深入理解(十):git stash保存现场与恢复现场

当前分支做了一些修改(工作区与暂存区),如果此时你要切换到别的分支,那么你的修改要么会污染别的分支,要么会在切换的过程中丢失,所以如果有个功能能够允许我在切换之前保存现场,再切换回来的时候恢复现场,就很完美了,那么 git stash 就是干这个的。

当然,Git 会将现场保存在堆栈中,恢复的时候你可以将现场恢复进任何分支。

git stash 会保存工作区和暂存区的内容。

git stash 只会关注已经加入到版本控制的文件。

$ git stash -h
usage: git stash list [<options>]
   or: git stash show [<options>] [<stash>]
   or: git stash drop [-q|--quiet] [<stash>]
   or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
   or: git stash branch <branchname> [<stash>]
   or: git stash clear
   or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
          [-u|--include-untracked] [-a|--all] [-m|--message <message>]
          [--] [<pathspec>...]]
   or: git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
          [-u|--include-untracked] [-a|--all] [<message>]
存储
git stash 
git stash save message 
git stash push message

将工作区和暂存区内容隐藏起来,参数 message 为注释信息,方便查找,可以进行多次stash,每次的隐藏内容存储在一个栈中。

$ git branch
  b2
* master

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   t1.txt

Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   q/w/t4.txt
        
$ git stash save "cache master"
Saved working directory and index state On master: cache master      

$ git status
On branch master
nothing to commit, working tree clean

什么也不改动而再次入栈呢?
$ git stash save "cache master copy"
No local changes to save

显然Git会忽略掉这种愚蠢的操作
查看
列出栈中的所有内容
$ git stash list
stash@{0}: On master: cache master

显示某个隐藏的具体内容
$ git stash show stash@{0}
q/w/t4.txt | 1 +
t1.txt     | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
读取
调用任意一个隐藏内容,但是并没有删除栈中的记录
$ git stash apply stash@{0}

取出栈中的第一个内容(栈是先进后出),且删除栈中的记录
$ git stash pop

从最新的stash创建分支
$ git stash branch

应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。

删除某一个记录
$ git stash drop stash@{0}

清除全部记录
$ git stash clear

如果从stash中恢复的内容和当前目录中的内容发生了冲突,也就是说,恢复的内容和当前目录修改了同一行的数据,那么会提示报错,需要解决冲突,可以通过创建新的分支来解决冲突。

你可能感兴趣的:(杂项)