为什么 'git checkout' 只适用于某些分支?

4

这里是两次检出的结果:为什么第二次失败了?'git status' 显示有些文件已被修改,但我确定我没有碰过那些文件。

praveensripati@MyMini:~/Hadoop/Git/hadoop-common$ git checkout branch-0.21  
Switched to branch 'branch-0.21'  

praveensripati@MyMini:~/Hadoop/Git/hadoop-common$ git checkout branch-0.20  
error: The following untracked working tree files would be overwritten by checkout:  
    CHANGES.txt  
    LICENSE.txt  
    README.txt  
    bin/hadoop  
    bin/hadoop-daemon.sh  
    bin/hadoop-daemons.sh  
Please move or remove them before you can switch branches.  
Aborting

praveensripati@MyMini:~/Hadoop/Git/hadoop-common$ git status
# On branch trunk
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   CHANGES.txt
#   LICENSE.txt
#   README.txt
#   bin/
#   build.xml
#   conf/
#   lib/
#   site/
#   src/
nothing added to commit but untracked files present (use "git add" to track)

git status 会显示什么?它是否报告了任何更改或未跟踪的文件? - Jan Hudec
看起来 Git 容易受到不稳定的网络连接的影响。即使网络连接正常,我也遇到了这个问题和其他问题。重新克隆代码库后,问题得到了解决。 - Praveen Sripati
这不可能是网络连接的问题。Git首先下载所有内容,验证校验和,然后开始检出。但是,在检出过程中可能会出现一些小问题。 - Jan Hudec
3个回答

5
这是因为你想切换到的分支正在跟踪当前分支未跟踪的某些或全部文件。例如,该分支可能包含CHANGES.txt文件。因为git不想覆盖你工作区中的文件,所以它会提示你备份本地文件以防万一。你可以选择以下两种方法之一:
1.将这些文件移到其他安全位置;
2.如果你确定不需要这些文件,可以执行checkout -f命令来切换到该分支(这将覆盖任何冲突的文件)。
对于当前分支未跟踪的文件,暂存是无效的。你可以使用git diff命令找出0.20上有但0.21上没有的文件,例如:
git diff --name-only branch-0.20

1
+1 这是正确的答案,我认为。只有一个希望有帮助的提示:如果你正在使用最新版本的Git(1.7.7),你可以通过执行 git stash --include-untracked 使存储区也包括未跟踪的文件。 - Mark Longair

3

如果有过滤器在使用,就可能发生这种情况,这些文件在检出时会自动更改内容。例如:

core.autocrlf=true

(请参见为什么在Git中要使用core.autocrlf=true?)

例如,如果换行符风格被自动更改,您的工作树中将会有已修改的文件。
这足以防止使用常见修改文件的另一个检出。

您可以像Kit 建议的那样将更改藏起来,但我建议首先了解为什么会出现这些更改。


@KitHo:如果 core.autocrlf 被设置为 false,它不会自动更改行尾样式...除非你有一个 gitattribute 设置(https://dev59.com/wEjSa4cB1Zd3GeqPHasC#1206441)。但是如果没有,尝试设置 core.autocrlf 并查看问题是否仍然存在。 - VonC
例如,如果自动更改了行尾样式,您的工作树中将有修改后的文件。这足以防止使用常见修改文件进行另一次检出。您能否详细解释一下?如果文件已被修改,为什么我可以检出branch-0.21而不能检出branch-0.20?如何查看修改后的文件与Git中的文件之间的差异(以查看行尾更改)? - Praveen Sripati
git stash - 没有本地更改需要保存;git stash apply - 找不到存储;git status - 显示文件列表。仍然无法检出branch-0.20 :) - Praveen Sripati
@VonC:我认为这与行尾无关——错误和状态表明这些文件未被跟踪而不是已修改。 - Mark Longair
@Mark:当时我没有git状态输出。我只是觉得有趣的是提到第一次检出可以工作(但更改文件),而第二次则不行的棘手情况。 - VonC
显示剩余2条评论

0
git stash 
git checkout branch-0.20
git stash apply

请尝试以上方法


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