Git 合并两个分支A和B,其中A包含从B中删除的文件
好的,所以基本的想法是,有一些文件,我想确保得到恢复或“取消删除” 我不确定到底发生了什么,但我有git分支A和B,我99%认为B是从A分支出来的。在我创建B之后,我从B中删除了一些文件,然后做了很多更改。我现在想与A合并,但我担心当我合并分支时,从B删除的文件将被永久删除 以前有人处理过这种情况吗?我将尝试的第一件事是从a创建一个分支C,然后尝试将C与B合并,但我猜这并不能解决问题 我不确定到底发生了什么,但我有git分支A和B,我99%认为B是从A分支出来的 合并过程并不关心您如何到达现在的位置,1只关心您实际所在的位置。更具体地说,它需要三项: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分支出来的 合并过程并不关心您如何到达现在的
- 您当前的提交(
),在它所在的任何分支上(如果有的话)。让我们称之为“我们的”提交和/或“本地”提交。当我们需要它(soonish)时,Git有头
——我们的
- 您的“其他”提交,从参数到
:例如,git merge
将解析名称git merge foo
,以找到其特定的提交ID。git中给它命名的大多数部分称之为“他们的”提交(尽管有一部分称之为“远程”)commit,这尤其令人困惑,因为它与Git的fetch和push远程无关)。让我们称之为“其他”提交,但是当我们需要它时(soonish),Git使用foo
——他们的
这个
——我们的
和
——他们的
东西仍然有效,即使这两个提交都是由您进行的(我认为这是将它们称为“本地”和“其他”的另一个原因)
- 合并基。2这是两个分支上最新的3提交,即两个分支发散的点
Git merge base
告诉您该提交哪个
创建B之后,我从B中删除了一些文件,然后做了很多更改。我现在想与A合并,但我担心当我合并分支时,从B删除的文件将被永久删除
他们可能会的,除了在Git中没有什么是永久的。或者我们可以说一切都是永恒的,这意味着没有什么是永恒的,这变得非常哲学化,但基本上就像说,如果一切都是100%关键的,那么没有什么是真正重要的,或者至少,没有什么比其他任何事更重要。:-)
这里有一些要考虑的事情,然后要考虑一些提供这些东西的工具:
- Git通过将合并基与两个(本地和其他)提交进行比较来执行合并。这实际上告诉它,自从公共基提交以来,分支的每一个“边”都发生了什么
合并是通过在每一侧进行的每项更改各复制一份来完成的。Git在无法执行时声明冲突
因此,假设文件
在基本到本地更改集中被删除,并且在基本到其他更改集中添加了一行。如何将“删除整个文件”与“添加此行”结合起来?Git的回答是:“我没有,我只是在那个文件上声明了一个合并冲突。” 另一方面,假设从base到local删除了文件misc.txt
,并且从base到other没有任何更改。我们如何结合这些?答案很清楚:删除该文件 还有许多其他的冲突案例,但上面显示了你特别担心的那些,在这里samp.dat
- 您想将A合并到B中,还是将B合并到A中?确切地说,区别是什么
例如,在上面,我们刚刚提到了如果base-to-local删除
,而base-to-other不修改它会发生什么:Git在合并结果中删除samp.dat
。如果base-to-other删除了该文件,而base-to-local未对其进行修改,Git也会删除该文件,因为更改仍然是“一边说删除,一边说什么都不做”。不管哪一方说了这句话,只不过这只是一个方面而已。(或者,如果双方都表示要删除该文件,也没有问题。) 事实上,合并结果总是一样的:一组更改表示dox,另一组表示doy;如果Git可以将它们组合起来,结果就是这种组合,否则结果就是“冲突”,Git可以尽最大努力记录这两组更改。但在所有情况下,结果都是对称的:combine(X,Y)≡ 联合收割机(Y,X)。(如果没有在所有字体中显示,则在两个“合并”之间有一个三行“=”符号,相当于”符号。) 那么,唯一的区别是,当您启动流程时,Git将在您所在的任何分支上进行新的合并提交,当然,无论您所在的分支是什么,您都需要在samp.dat
命令中命名另一个分支(或其提示提交)。相同的是工作树(合并结果),而不是提交本身Git merge
- 最后,假设您有一些提交,可能是合并提交,也可能只是删除文件
的常规普通提交。现在,记住Git是一个版本控制系统,并且永远保存所有内容。4假设我们让Git在提交之前从提交中提取misc.txt
,并进行新的提交。作为其工作树内容,新提交中删除了misc.txt
的所有内容,加上misc.txt
的版本都是从早期提交中恢复的 如果我指示您查看新的提交而不是旧的提交,您会关心misc.txt
是如何恢复的吗?(有些情况是wmisc.txt
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