Git checkout自动合并本地修改

8

我尝试在shell中执行以下命令:

git init

echo "test1" > test1.txt
git add test1.txt
git commit -a -m "test1"

echo "test2" >> test1.txt

git branch test
git checkout test

text.txt现在包含以下内容:

test1
test2

在切换到分支test后,所有本地修改都会被合并到master中。
为什么?
我原本以为git会因为有本地更改而拒绝切换到test分支。我原本以为git会要求提交或者将本地更改stash起来。
编辑: 我使用一个bash脚本来执行这些命令,我得到了以下输出:
r@r:/tmp/test$ ./createrepo 
Initialized empty Git repository in /tmp/test/.git/
[master (root-commit) 0407f5b] test1
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
M       test1.txt
Switched to branch 'test'

我遇到了相同的问题,奇怪的是,对于一些存储库,我无法在提交之前签出,而其他存储库则可以合并。我查看了配置文件,但没有发现任何不同之处。 - joedborg
3个回答

18

git 努力避免丢失可能有价值的数据。在这种情况下,它实际上并未合并分支,因为涉及到的更改尚未提交。相反,当您执行 git checkout 时,它会尝试保留新创建但尚未提交的修改,因此它检出您请求的提交,并添加您未提交的更改。如果您真的想放弃未提交的更改,请使用 git checkout -fgit checkout 后跟 git reset --hard HEAD。有时,如果尚未提交的更改无法干净地合并到您要检出的内容中,则会收到错误消息并且检出将失败。


3
我不想丢弃任何东西。但我不希望未提交的更改自动合并。如果我在test分支中提交了一些内容,然后进行了一些未提交的更改并尝试切换回其他分支,Git会提示无法切换,因为实际上有未提交的更改。但是,如果这个新分支上没有提交记录,为什么Git不执行此操作呢?因为master分支和test分支具有相同的HEAD吗? - Razer
如果您在“test”中提交了某些内容,则此新分支上有提交,因此我猜我没有理解您的问题... 如果按照上面的示例,在“test”分支上提交了“test2”更改,然后对“test.txt”进行了更多修改,并尝试在未首先提交的情况下切换回“master”,则很可能无法清晰地复制未提交的更改,因此“checkout”将失败,直到您放弃更改或使用“git stash”。 - twalberg
1
混淆的原因在于 OP 认为在检出到测试分支时将 test2 行放入文件中意味着它们已经合并。这是不正确的:这些更改没有合并到测试分支中,而是保留在工作目录中。尝试在两个分支中执行 git diff 和 git status 命令,你就会明白我在说什么了。 - Eugene Sajine
@EugeneSajine 正确,但似乎 OP 假设在工作目录中进行的更改在提交之前属于特定分支,这也是错误的。因此,在实际情况下,根本没有什么需要合并(在 git 使用该术语时)。正如您所说,本地未提交的修改只是由 git 保留,除非您告诉它不要这样做。 - twalberg
现在我明白了 :) 我之前很困惑,当切换到新分支时,git输出M test1.txt。因此我以为git进行了合并 - 但事实并非如此。Git只是将本地更改应用到新分支上 - 这些更改也是本地更改。 - Razer
@Razer 啊 - 我想我能理解那个。但是,以后参考一下,那个 M 代表的是 Modified,而不是 Merged... - twalberg

0

你在使用 git checkout 命令时有使用过任何选项吗?我问这个是因为你所描述的行为看起来像是使用了 "git checkout -f" 命令。


0

git checkout 替换 本地更改的文件。

git merge 合并 本地和传入的更改,并警告任何冲突。

这些命令都不会删除在传入提交中不存在的本地文件。

只有git reset --hard会完全清除本地更改。


我知道这一点。但是为什么git checkout会将master分支中的本地更改合并到test分支中,尽管我没有提交任何内容? - Razer
你所说的“从主分支合并本地更改”是什么意思?实际上它并没有执行合并操作。 - Mars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接