何时更改本地与`git checkout`合并?

时间:2015-08-19 15:21:04

标签: git

  1. 假设我在主分支上。我的工作目录中有一个名为" master.txt"的文件。包含单个文本行" asdf"。

  2. 假设我然后git checkout master,它使我在主分支上的提交比HEAD更早。

  3. 然后我编辑文件" master.txt" (此时,仍然有一行" asdf")删除行" asdf"。

  4. 然后我master.txt

  5. 我的git checkout似乎仍然是空的(即没有" asdf)!

  6. 问题:这是事情本应该起作用的方式吗?阅读关于git的教科书,如果没有发生冲突,我认为只有在{{1}}上进行了本地合并。但删除" asdf"造成冲突,不是吗?

2 个答案:

答案 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提交

在这种情况下,如果您强制结帐,那么您的更改将会丢失。

将您的更改提交给分离的HEAD提交

您可以将更改提交给分离的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会阻止您从随后再次检查第二次提交。