Git step by step 11 之 git stash

介绍:
        git stash 作用是备份当前“工作目录”的内容,将该备份保存到Git栈中,并从最近的一次提交中读取相关内容,让工作区保持和上次提交的内容一致。 man git stash将其解释为两步,第一步是保存当前工作目录中的内容到一个新的stash,第二步执行 git reset --hard。
        git stash pop:从Git栈中读取最近一次保存的内容,恢复工作目录中的相关内容。
        git stash list:显示Git栈内的所有备份,进一步利用 git stash pop XXX 读取Git栈内中某一指定的备份。
        git stash clear:清空Git栈。
        此外还有,git stash drop,git stash save等

适用场合:
        使用git的时候,我们往往使用branch解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码 commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实 如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用'git stash'就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用'git stash apply'将以前一半的工作应用回来。也许有的人会说,那我可不可以多次将未提交的代码压入到栈中?答案是可以的。当你多次使用'git stash'命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,'git stash list'命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用'git stash apply stash@{1}'就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用'git stash clear'来将栈清空。

        对当前工作目录进行git stash之后,在进行git stash pop的时候,也有可能会像 git merge一样出现冲突。
        例如:工作目录中有一test.txt,在master分支下,对test.txt的第一行进行了修改。此时,要先修复另一bug,所以要 git stash。由于修改该bug时,也需要修改test.txt的第一行,这就与git stash之前在test.txt上有了冲突。当进行git stash pop的时候,会提示有冲突,需要手动进行修改。

        看上去完全可以利用git branch来代替git stash,但正如前面“适用场合”中说的,利用 git stash 可以减少不必要的记录,使得查看log时,会更省心。
        git stash 主要处理未commit时的现场保存,如果已经commit的了,branch更适合一些。
        总的来说,git很灵活,正是由于它太灵活,以致于会有一些相互覆盖的功能,例如,若工作目录、暂存区以及本地数据目录中有一文件(其余都相同),在三个区域中内容各不相同,git reset --hard,会将三个区域中的这个文件都与本地数据目录中的这个文件相同,但用git checkout HEAD -- file,也会使三个区域中的文件保持一致。再如,git reset --hard <branch> 与 git checkout <branch> 的作用效果又是一样的。这正是导致一些命令看似相同,不容易让人区分的原因。


more:
Git Stash用法
git-stash vs. git-branch

猜你喜欢

转载自songkang666.iteye.com/blog/1848694
今日推荐