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'
4

3 回答 3

16

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

于 2012-10-10T16:15:24.683 回答
0

您是否在 git checkout 命令中使用过任何选项?我问是因为您描述的行为看起来像是使用“git checkout -f”时的行为。

于 2012-10-10T15:43:04.163 回答
0

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

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

如果这些命令不会删除传入提交中不存在的本地文件,则也不会。

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

于 2012-10-10T16:06:55.197 回答