何时将更改与“git checkout”本地合并?

何时将更改与“git checkout”本地合并?,git,Git,假设我在主分支上。在我的工作目录中有一个名为“master.txt”的文件,其中包含一行文本“asdf” 假设我随后git签出f364f96d34fb2af20dbd8cccd91a83a1e277bcfe,这会使我在主分支上执行比HEAD更旧的提交 然后,我通过删除行“asdf”来编辑文件“master.txt”(此时仍然有行“asdf”) 然后,我git签出主机 我的master.txt似乎仍然是空的(即,没有“asdf” 问题:事情应该是这样的吗?读了一本关于git的教科书,我认为只有在没

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

  • 假设我随后
    git签出f364f96d34fb2af20dbd8cccd91a83a1e277bcfe
    ,这会使我在主分支上执行比HEAD更旧的提交

  • 然后,我通过删除行“asdf”来编辑文件“master.txt”(此时仍然有行“asdf”)

  • 然后,我
    git签出主机

  • 我的
    master.txt
    似乎仍然是空的(即,没有“asdf”


  • 问题:事情应该是这样的吗?读了一本关于git的教科书,我认为只有在没有冲突的情况下,
    git checkout
    才会局部合并更改。但是删除“asdf”创建冲突,否?

    您从未将所做的更改提交到
    master.txt
    文件。仅仅因为您将
    移动到另一个提交,然后移回
    分支指示符,并不意味着任何提交都会隐式发生

    长话短说,您从未将所做的更改提交给文本文件,因此您不会看到您期望的行为

    在步骤4中,当您转到checkout master时,您应该收到以下错误:

    $ 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
    
    您始终可以强制签出master以放弃这些更改:

    $ git checkout master -f
    
    但这让我觉得,当您删除该字符串时,您从未将更改保存到
    master.txt

    在这里,您可以采取两种方法:

    不要将更改提交到分离的头提交 在这种情况下,如果您强制签出回主控,您的更改将丢失

    将更改提交到分离的头提交 您本可以将更改提交到分离的头提交,并且在再次尝试非强制签出主控形状时会发出警告:

    $ 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个提交,未连接到
    您的任何分支机构:
    10038c2委员会4
    如果您想通过创建一个新分支来保留它,这可能是一个好时机
    为此:
    吉特分行10038c2
    切换到“主”分支
    

    Git告诉我们,属于它的提交哈希是“遗留的”(未绑定到任何分支)。

    当您签出提交而不指定路径时,工作树将更新以匹配该提交树的内容,但当前索引(缓存/暂存区域)保持不变

    您看到的是该行为的扩展:即使您没有将更改添加到索引中,git也会在新的工作树上重新应用它,这样您就不会丢失它

    然后,您可以使用文件路径签出
    HEAD
    ,以删除更改,或者将其添加到索引并提交

    其中提到,如果在
    HEAD
    和目标提交的树中对文件进行了不同的本地修改,则会发生“冲突”。在您的情况下,您的
    master.txt
    文件的两个版本都包含
    asdf
    ,只有您的工作树是空的。因此,没有冲突


    如果您要使用
    master.txt
    添加包含
    foo
    的提交,请使用
    master.txt
    使用
    asdf
    签出提交,并执行您描述的相同操作,git将阻止您随后再次签出第二次提交。

    注意:我编辑了答案,以纠正我的疏忽。从技术上讲,这是一个不同的答案。