Git 合并两个分支A和B,其中A包含从B中删除的文件

Git 合并两个分支A和B,其中A包含从B中删除的文件,git,github,merge,Git,Github,Merge,好的,所以基本的想法是,有一些文件,我想确保得到恢复或“取消删除” 我不确定到底发生了什么,但我有git分支A和B,我99%认为B是从A分支出来的。在我创建B之后,我从B中删除了一些文件,然后做了很多更改。我现在想与A合并,但我担心当我合并分支时,从B删除的文件将被永久删除 以前有人处理过这种情况吗?我将尝试的第一件事是从a创建一个分支C,然后尝试将C与B合并,但我猜这并不能解决问题 我不确定到底发生了什么,但我有git分支A和B,我99%认为B是从A分支出来的 合并过程并不关心您如何到达现在的

好的,所以基本的想法是,有一些文件,我想确保得到恢复或“取消删除”

我不确定到底发生了什么,但我有git分支A和B,我99%认为B是从A分支出来的。在我创建B之后,我从B中删除了一些文件,然后做了很多更改。我现在想与A合并,但我担心当我合并分支时,从B删除的文件将被永久删除

以前有人处理过这种情况吗?我将尝试的第一件事是从a创建一个分支C,然后尝试将C与B合并,但我猜这并不能解决问题

我不确定到底发生了什么,但我有git分支A和B,我99%认为B是从A分支出来的

合并过程并不关心您如何到达现在的位置,1只关心您实际所在的位置。更具体地说,它需要三项:

  • 您当前的提交(
    ),在它所在的任何分支上(如果有的话)。让我们称之为“我们的”提交和/或“本地”提交。当我们需要它(soonish)时,Git有
    ——我们的

  • 您的“其他”提交,从参数到
    git merge
    :例如,
    git merge foo
    将解析名称
    foo
    ,以找到其特定的提交ID。git中给它命名的大多数部分称之为“他们的”提交(尽管有一部分称之为“远程”)commit,这尤其令人困惑,因为它与Git的fetch和push远程无关)。让我们称之为“其他”提交,但是当我们需要它时(soonish),Git使用
    ——他们的

    这个
    ——我们的
    ——他们的
    东西仍然有效,即使这两个提交都是由您进行的(我认为这是将它们称为“本地”和“其他”的另一个原因)

  • 合并基。2这是两个分支上最新的3提交,即两个分支发散的点

这是第三件事,合并基础,你有点含糊不清。您可以简单地指示Git使用命令
Git merge base
告诉您该提交哪个

创建B之后,我从B中删除了一些文件,然后做了很多更改。我现在想与A合并,但我担心当我合并分支时,从B删除的文件将被永久删除

他们可能会的,除了在Git中没有什么是永久的。或者我们可以说一切都是永恒的,这意味着没有什么是永恒的,这变得非常哲学化,但基本上就像说,如果一切都是100%关键的,那么没有什么是真正重要的,或者至少,没有什么比其他任何事更重要。:-)

这里有一些要考虑的事情,然后要考虑一些提供这些东西的工具:

  • Git通过将合并基与两个(本地和其他)提交进行比较来执行合并。这实际上告诉它,自从公共基提交以来,分支的每一个“边”都发生了什么

    合并是通过在每一侧进行的每项更改各复制一份来完成的。Git在无法执行时声明冲突

    因此,假设文件
    misc.txt
    在基本到本地更改集中被删除,并且在基本到其他更改集中添加了一行。如何将“删除整个文件”与“添加此行”结合起来?Git的回答是:“我没有,我只是在那个文件上声明了一个合并冲突。”

    另一方面,假设从base到local删除了文件
    samp.dat
    ,并且从base到other没有任何更改。我们如何结合这些?答案很清楚:删除该文件

    还有许多其他的冲突案例,但上面显示了你特别担心的那些,在这里

  • 您想将A合并到B中,还是将B合并到A中?确切地说,区别是什么

    例如,在上面,我们刚刚提到了如果base-to-local删除
    samp.dat
    ,而base-to-other不修改它会发生什么:Git在合并结果中删除
    samp.dat
    。如果base-to-other删除了该文件,而base-to-local未对其进行修改,Git也会删除该文件,因为更改仍然是“一边说删除,一边说什么都不做”。不管哪一方说了这句话,只不过这只是一个方面而已。(或者,如果双方都表示要删除该文件,也没有问题。)

    事实上,合并结果总是一样的:一组更改表示dox,另一组表示doy;如果Git可以将它们组合起来,结果就是这种组合,否则结果就是“冲突”,Git可以尽最大努力记录这两组更改。但在所有情况下,结果都是对称的:combine(X,Y)≡ 联合收割机(Y,X)。(如果没有在所有字体中显示,则在两个“合并”之间有一个三行“=”符号,相当于”符号。)

    那么,唯一的区别是,当您启动流程时,Git将在您所在的任何分支上进行新的合并提交,当然,无论您所在的分支是什么,您都需要在
    Git merge
    命令中命名另一个分支(或其提示提交)。相同的是工作树(合并结果),而不是提交本身

  • 最后,假设您有一些提交,可能是合并提交,也可能只是删除文件
    misc.txt
    的常规普通提交。现在,记住Git是一个版本控制系统,并且永远保存所有内容。4假设我们让Git在提交之前从提交中提取
    misc.txt
    ,并进行新的提交。作为其工作树内容,新提交中删除了
    misc.txt
    的所有内容,加上
    misc.txt
    的版本都是从早期提交中恢复的

    如果我指示您查看新的提交而不是旧的提交,您会关心
    misc.txt
    是如何恢复的吗?(有些情况是w
    git diff A...B
    git diff B...A
    
    Automatic merge went well; stopped before committing as requested
    
    git checkout --ours -- file.ext
    
    git checkout --theirs -- file.ext
    
    git checkout a012345 -- file.ext
    
    git checkout HEAD -- file.ext
    git checkout MERGE_HEAD -- restored1.py restored2.tex
    
    git checkout A -- restore.me restore.me.too