【学了就忘】Git分支 — 44.分支切换的几种情况

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【学了就忘】Git分支 — 44.分支切换的几种情况相关的知识,希望对你有一定的参考价值。

参考技术A

这个案例我们要对切换分支命令进行详细说明。

在我们切换分支,执行 git checkout master 这条命令的时候,

Git做了如下两件事情:

也就是说: 分支切换会改变你工作目录中的文件

说明: 在切换分支时,一定要注意你工作目录里的文件会被改变。如果是切换到一个较旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。如果Git不能干净利落地完成这个任务,它将禁止切换分支。

下面我们就来详细的进行说明。

1)查看工作目录中的状态

2)新建一个testing分支,并提交一个a.txt文件到版本库

3)查看 testing 分支的文件

4)切换到master分支

如上就可以证明了,切换分支时,工作目录中的文件会发生改变。

如果切换分支的时候,该分支的工作目录不是已提交状态,那么会出现如下两种情况。

也就是有以修改或新增,未被追踪的文件。

1)切换到 testing 分支

2)在 testing 分支新增一个文件 b.txt ,但不添加到暂存区

显示 b.txt 文件未被追踪。

3)此时切换到 master 分支上

我们从上面可以看到,在 testing 分支上创建的,新增未被追踪的 b.txt 文件,被同步到了 master 分支上。

因为 git checkout 命令执行时,会将工作目录里的文件改变到指定的提交状态。

又因为你在 testing 分支上创建的 b.txt 文件,既没有被提交也没有被暂存,说明 b.txt 文件还未被Git管理。在这种情况下,你进行切换分支操作,你将丢失在 testing 分支对 b.txt 文件编写。Git认为这样是非常不安全的操作,会默认的把该状态的文件,一起带入所切换到的分支中。

所以 git checkout 命令还是很智能的,可以我们一般不会用该功能,这个功能用来会非常的混乱,可能会污染到其他分支,尽管Git是好意。

也就是暂存区有新增的文件时,但还未提交到本地版本库。

(接上面示例,继续演示)

1)切换到 testing 分支上,把b.txt文件添加到暂存区

2)此时切换到 master 分支上

发现暂存区中存储的文件,只要未被提交,也会随着分支的切换,加入到其他分支中。

(接上面示例,继续演示)

1)切换到 testing 分支上,把 b.txt 文件提交到版本库

2)继续修改 b.txt 文件,不提交到版本库中,然后切换到master分支

说明:

error: Your local changes to the following files would be overwritten by checkout:b.txt

错误提示: b.txt 文件在本地的更改,将随着切换分支的操作,被版本库所覆盖(也就是文件被还原)

Please commit your changes or stash them before you switch branches.

提示你,在切换分支之前,请先提交更改。(不提交不让你切换分支)

这是什么原因?

因为 b.txt 文件已经被Git管理过了,如果 b.txt 文件还处于修改未追踪状态,你就必须 b.txt 文件修改完成并提交后,再去其他分支工作。

使用 git checkout 命令进行分支的切换,实际上有三个地方更改了

而切换分支的最佳实践:每次切换分支前,确保当前分支一定得是干净的(已提交状态)。

因为要避免一下情况:

在切换分支时,如果当前分支上有新增且未暂存的修改(第一次),或者有新增,暂存,但未提交的修改(第一次)时,分支可以切换成功,但是这种操作可能会污染其地分叉。

以上是关于【学了就忘】Git分支 — 44.分支切换的几种情况的主要内容,如果未能解决你的问题,请参考以下文章

【学了就忘】Git后悔药 — 33.版本回退操作(二)

【学了就忘】Git后悔药 — 34.版本回退操作(三)

【学了就忘】Git操作 — 51.git reflog命令

【学了就忘】Git操作 — 56.忽略文件补充

【学了就忘】Git操作 — 14.Git基本操作(一)

【学了就忘】Git操作 — 55.忽略文件的三种方式