假设我在主分支上。我的工作目录中有一个名为" master.txt"的文件。包含单个文本行" asdf"。
假设我然后git checkout master
,它使我在主分支上的提交比HEAD更早。
然后我编辑文件" master.txt" (此时,仍然有一行" asdf")删除行" asdf"。
然后我master.txt
。
我的git checkout
似乎仍然是空的(即没有" asdf)!
问题:这是事情本应该起作用的方式吗?阅读关于git的教科书,如果没有发生冲突,我认为只有在{{1}}上进行了本地合并。但删除" asdf"造成冲突,不是吗?
答案 0 :(得分:1)
您从未提交对master.txt
文件所做的更改。仅仅因为您将HEAD
移动到另一个提交,然后移回master
分支指示符并不意味着任何提交都将隐式发生。
长话短说,您从未提交对文本文件所做的更改,因此您不会看到您期望的行为。
你的第4步,当你去结账大师时,你应该收到以下错误:
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
master.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
您可以随时强制结帐,以放弃这些更改:
$ git checkout master -f
但这让我觉得你删除那个字符串时从未将你的更改保存到master.txt
。
你可以采取两种方法:
在这种情况下,如果您强制结帐,那么您的更改将会丢失。
您可以将更改提交给分离的HEAD提交,并且在尝试非强制性地结帐主数据时会给您一个警告:
$ git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
10038c2 commit4
If you want to keep it by creating a new branch, this may be a good time
to do so with:
git branch <new-branch-name> 10038c2
Switched to branch 'master'
Git告诉我们属于它的提交哈希是“留下”(没有绑定到任何分支)。
答案 1 :(得分:1)
当您在未指定路径的情况下签出提交时,工作树将更新以匹配该提交的树的内容,但当前索引(缓存/暂存)区域)保持不变。
您看到的是该行为的扩展:即使您没有将更改添加到索引中,git也会在新工作树的顶部重新应用它,这样您就不会丢失它。
然后,您可以使用文件路径签出HEAD
以删除更改,或将其添加到索引并提交。
reference documentation提及&#34;冲突&#34;如果您对HEAD
的树和目标提交的树中的文件进行了本地修改,则会发生。在您的情况下,master.txt
文件的两个版本都包含asdf
,只有您的工作树将其清空。因此,没有冲突。
如果要添加包含master.txt
foo
的提交,请检查master.txt
asdf
提交{{1}}并执行您描述的相同操作,git会阻止您从随后再次检查第二次提交。