likes
comments
collection
share

git版本控制(三):存储、后悔药、游离分支

作者站长头像
站长
· 阅读数 1

git存储

有时,在当我们在某个分支上上工作一段时间后,这是突然发现前面的版本有问题,需要修复,这是你需要切换到另一个分支。问题是我不想仅仅因为这一个bug而提交我做了一半的工作,而git stash恰好解决了这个问题,让我们在不提交的情况下就可以切换分支。如下图所示:

git版本控制(三):存储、后悔药、游离分支

这时我要切换到master分支上,但是因为wang这个分支上还有未完成的任务,不允许切换分支,如下图所示:

git版本控制(三):存储、后悔药、游离分支

但是我又不想提交,因为整个功能还没有完成,这是执行git stash,如下图所示:

git版本控制(三):存储、后悔药、游离分支

完美切换,现在假装我已经在master分支上修复了bug,需要回到原来工作分支的状态,执行以下命令即可:

git checkout wang  // 回到之前的分支

git stash apply // 应用之前的存储

git版本控制(三):存储、后悔药、游离分支

在应用了之前的存储之后,我们要记得删除这条存储记录,执行下面的命名:

git stash drop 存储id

git版本控制(三):存储、后悔药、游离分支

然后就可以之前的工作了,完美!

git后悔药

git工作区后悔药

当我们修改了已经被git管理的文件,如下图所示:

git版本控制(三):存储、后悔药、游离分支

如果这时想通过命令撤回修改的话,执行以下命令(上图中有提示):

git restore <file文件名>

git版本控制(三):存储、后悔药、游离分支

git缓存区后悔药

当我们执行git add之后,如下图所以:

git版本控制(三):存储、后悔药、游离分支

如果这是想撤销缓存区的内容,执行以下命令(上图有提示):

git restore --staged ameng.txt

git版本控制(三):存储、后悔药、游离分支

git版本库后悔药

我们的提交记录是不能被删除的(但是可以使之处在游离状态),如下图所示:

git版本控制(三):存储、后悔药、游离分支

显然,上面的注释不符合要求,执行命令如下:

git commit --amend

出现下面的界面,在这个界面编辑注释即可。

git版本控制(三):存储、后悔药、游离分支

git版本控制(三):存储、后悔药、游离分支

这个命令本质上是先执行了git reset --soft HEAD~,然后重新提交了一次,移动HEAD并且带着分支一起移动,使错误的提交对象处在游离分支,如下图所示:

git版本控制(三):存储、后悔药、游离分支

更加详细的git reset可参考 git官网

游离分支

当我们切换到指定的某一次提交,HEAD 就会处于「detached」状态,也就是游离状态。

git版本控制(三):存储、后悔药、游离分支

HEAD 游离状态的利弊

好处:HEAD 处于游离状态时,开发者可以很方便地在历史版本之间互相切换,比如要回到某次提交,只需要 对应的 或者 名即可。

弊端:若在该基础上进行了提交,则会新开一个「匿名分支」;也就是说我们的提交是无法可见保存的,一旦切换到别的分支,原游离状态以后的提交就不可追溯了。

比如,现在我有一条master分支,如下图:

git版本控制(三):存储、后悔药、游离分支

然后我checkout 56c9266切换到增加wang.txt文件时的状态,如下图:

git版本控制(三):存储、后悔药、游离分支

此时,HEAD就处在一个游离的状态,且有一个游离分支存在,可以通过git branch 查看分支情况,这时当我们修改文件内容并且提交,如下图:

git版本控制(三):存储、后悔药、游离分支

git版本控制(三):存储、后悔药、游离分支

如果现在我们把分支切换到master分支时,如下图:

git版本控制(三):存储、后悔药、游离分支

git版本控制(三):存储、后悔药、游离分支

从上图可知,在游离分支上的提交以后不可回溯。

如何解决,其实很简单, 在切换到游离状态的时候应该新建一个分支,然后我们所有的操作修改和提交都会保存到该分支,HEAD 也就指向了该分支最新提交的 commit id 处,而不会再处于游离状态。

具体可参考这篇文章,对游离分支有详细的解释。