2012-10-10 78 views
6

我尝试下面的命令外壳上git的结帐自动合并本地修改

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 

结账后分支从master获得合并test所有本地修改。

为什么?

我预计git拒绝结帐到test由于本地的变化。我希望git要求提交或本地更改。

编辑: 我用一个bash脚本来执行这个命令。我得到以下输出:

[email protected]:/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' 
+0

我有同样的问题,奇怪的是,对于一些存储库,我无法签出没有提交,其他合并。我查看了配置,看不到任何区别。 – jdborg

回答

14

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

+1

我不想丢弃任何东西。但我不希望那些无法实现的更改会自动合并。如果我在'test'中提交了某些内容,然后进行一些无法完成的更改并尝试再次切换,git说它不能执行,因为实际上存在无法实现的更改。但是,如果在这个新分支中没有任何提交,为什么git不这样做?因为'master'分支和'test'具有相同的'HEAD'? – Razer

+0

如果你在'test'中提交了一些东西,那么在这个新分支上有提交,所以我想我没有按照你的问题......如果按照上面的例子,你在'test'测试“分支,然后对”测试“进行更多修改。txt'并试图在没有首先提交的情况下切换回'master',很可能未提交的更改无法被完整地复制,所以'checkout'将会失败,直到您放弃更改或使用'git stash'。 – twalberg

+0

这里的困惑在于,OP认为在他签出测试分支时在文件中具有test2行意味着它们被合并。这是不正确的:这些更改没有合并到测试分支中,而是保存在工作目录中。试着在两个分支中做git diff和git status,你会看到我在说什么。 –

0

你使用任何选项与git checkout命令?我问,因为你所描述的行为似乎是使用“git checkout -f”的时候。

+0

不,我将这个命令从bash脚本中拷贝出来进行测试。 – Razer

0

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

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

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

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

+0

我知道。但为什么'git checkout'将'master'分支的本地更改合并到'test'分支中,尽管我没有提交任何内容? – Razer

+0

你是什么意思“合并本地变更”?它实际上并没有执行“合并”。 – Mars