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

git checkout carries unstaged files to the new branch

我一直在尝试使用 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

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

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

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'

深入解释:

git checkout carries unstaged files to the new branch

这不是错误。

这就是 git 的行为方式


在下图中你可以看到3 states.

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

  • 承诺
  • 已修改
  • 上演

它们都在您的分支机构之间共享。但是当你结帐分支时,你更改了 所以你最终会在你的存储库之间共享 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 即可删除所有暂存和未跟踪的内容。

这是如何操作的演示: