git checkout 将未暂存的文件带到新分支

Posted

技术标签:

【中文标题】git checkout 将未暂存的文件带到新分支【英文标题】:git checkout carries unstaged files to the new branch 【发布时间】:2016-07-23 21:39:57 【问题描述】:

我一直在尝试使用 gitlab CE 设置存储库,作为设置的一部分创建了一个存储库并一直在使用它,当我遇到时,在我对文件进行一些修改并使用切换分支之后结帐时,即使我有未暂存的文件,我也可以切换,这与我之前的经验不同,即在我进行提交或存储之前我不允许结帐。

这种体验超越了无缝切换分支的目的,而不必担心意外潜入。

这些步骤在下面突出显示。

somasundaram.s@user  /d/projects/repositories/newrepo (master)
$ ls -ltr
total 1
-rw-r--r-- 1 somasundaram.s 1049089 13 Apr  4 16:28 README
-rw-r--r-- 1 somasundaram.s 1049089  0 Apr  4 16:31 hi

somasundaram.s@user  /d/projects/repositories/newrepo (master)
$ git branch new-branch

somasundaram.s@user  /d/projects/repositories/newrepo (master)
$ git checkout new-branch
Switched to branch 'new-branch'

somasundaram.s@user  /d/projects/repositories/newrepo (new-branch)
$ touch newfile

somasundaram.s@user  /d/projects/repositories/newrepo (new-branch)
$ ls -ltr
total 1
-rw-r--r-- 1 somasundaram.s 1049089 13 Apr  4 16:28 README
-rw-r--r-- 1 somasundaram.s 1049089  0 Apr  4 16:31 hi
-rw-r--r-- 1 somasundaram.s 1049089  0 Apr  4 16:37 newfile 
somasundaram.s@user  /d/projects/repositories/newrepo (new-branch)
$ git checkout master
Switched to branch 'master'

somasundaram.s@user  /d/projects/repositories/newrepo (master)
$ ls -ltr
total 1
-rw-r--r-- 1 somasundaram.s 1049089 13 Apr  4 16:28 README
-rw-r--r-- 1 somasundaram.s 1049089  0 Apr  4 16:31 hi
-rw-r--r-- 1 somasundaram.s 1049089  0 Apr  4 16:37 newfile

【问题讨论】:

【参考方案1】:

git checkout 将未暂存的文件带到新分支

这不是错误。

git 的行为方式


在下图中,您可以看到 3 states

Git has three main states that your files can reside in:

承诺 修改 上演

它们都在您的分支机构之间共享。但是当您签出分支时,您会更改HEAD,因此即使您签出分支,您的存储库也会共享staging area && working directory


How to checkout different branch with clean working directory and stage area?

如果您希望在您的工作目录和暂存目录中签出没有任何“剩余”的干净分支,您可以创建一个新的worktree,这将导致您的存储库的共享视图(所有内容是共享的)但具有不同的工作目录和暂存区。


来自 git v2.5

git worktree add <new_path>

现在在您的任何分支机构中做任何您想做的事情。它将创建 2 个相互独立的工作文件夹,同时指向同一个存储库。

使用 wortree,您无需执行任何 clearreset 即可删除所有暂存和未跟踪的内容。

这里是如何做到这一点的演示:


【讨论】:

谢谢,但让我震惊的是 youtube 链接中解释的这个流程(在解释时指出)youtu.be/ZDR433b0HJY?t=1414 我猜这不是未暂存的文件,而是未暂存的修改,正如我所观察到的那样。 是的。并再次阅读以更好地理解它。一旦您提交并签出不同的分支,您的 HEAD 就会更改,但所有其他更改(工作目录 + 阶段区域)都会与您一起移动。 ***.com/questions/34519665/…【参考方案2】:

据我所知,这是一项功能,而不是错误,从那以后一直如此。如果 git 认为它可以安全地进行您的本地修改,它就会这样做。

如果你想摆脱它们,git reset --hard

【讨论】:

上周试过了,直到我暂存文件或将它们藏起来才允许切换,这让我觉得我破坏了一些配置或可能需要做一些配置 是的。当我第一次注意到时让我感到惊讶,但绝对正确。 @SomasundaramSekar 仅当文件在两个版本之间没有更改时才会这样做。如果您在本地更改的任何文件在您签出的版本和您尝试签出的版本之间也发生了更改,您将获得您所描述的行为。 我认为这是错误的,因为 newfile 没有被 Git 跟踪。【参考方案3】:

Git 不会更改存储库中当前未跟踪的文件。 在您的示例中,您只创建了一个未跟踪的文件 (newfile)。

所以 Git 的行为是绝对正常的。

如果你 git add newfile 没有提交更改,Git 将不允许你切换到 master 分支。

例如,这将由 Git 处理:

$ git branch new-branch
$ git checkout new-branch
Switched to branch 'new-branch'
$ echo "test" > newfile
$ git add newfile
$ git checkout master
A       newfile
Switched to branch 'master'

深入解释: https://***.com/a/8526610/882697

【讨论】:

跟踪文件的变化也被结转了,我认为这是不正常的。 @SomasundaramSekar:更改了哪些文件? 这也有效 somasundaram.s@user /d/projects/repositories/newrepo (new-branch) $ echo "test" > newfile somasundaram.s@user /d/projects/repositories/newrepo ( new-branch) $ git add newfile 警告:LF 将被替换为 newfile 中的 CRLF。该文件将在您的工作目录中具有其原始行结尾。 somasundaram.s@user /d/projects/repositories/newrepo (new-branch) $ git checkout master M README 新文件切换到分支'master' somasundaram.s@user /d/projects/repositories/newrepo (master) $ vi新文件 你说得对,我认为 Git 会阻止分支更改。但实际上,它会更改分支并将新文件放入索引中。因此不会丢失任何修改。 @SomasundaramSekar:我在答案中添加了一个链接,应该会有所帮助。祝你考试顺利!

以上是关于git checkout 将未暂存的文件带到新分支的主要内容,如果未能解决你的问题,请参考以下文章

如何快速撤消 git 中的暂存和未暂存的更改?

本地分支在没有明显原因的情况下显示未暂存的更改和未跟踪的文件[重复]

Git stash uncached:如何存放所有未暂存的更改?

放弃Git中未暂存的更改

git常用操作合集

SourceThree的简单使用