git的合并:删除文件,我想保留!(git merge: Removing files I want

2019-07-17 15:45发布

你怎么能合并在git的两个分支,一个分支保留必要的文件?

当合并两个分支,如果一个文件是在一个分支删除而不是在另一个文件最终被删除。

例如:

  • 一个文件在主存在,当你做一个新的分支
  • 你从主删除文件,因为我们并不需要它(还)
  • 您在分支的变化增加一个功能, 它依赖于现有的文件
  • 你做出错误修复在师傅 (不能丢弃)
  • 在合并有一天,该文件已经一去不复返了!

如何重现:

  1. 同一个文件中创建一个混帐回购协议。

     git init echo "test" > test.txt git add . git commit -m "initial commit" 
  2. 创建一个分支

     git branch branchA 
  3. 删除主文件

     git rm test.txt git commit -m "removed file from master" 
  4. 使branchA不碰删除的文件进行任何更改(它必须保持不变,以避免冲突)

     git checkout branchA touch something.txt git add . git commit -m "some branch changes" 

从这里,任何方式我发现这两个分支合并,test.txt文件被删除。 假设我们是依赖于该文件 branchA ,这是一个很大的问题。


失败的例子:

合并1

git checkout branchA
git merge master
ls test.txt

合并2

git checkout master
git merge branchA
ls test.txt

福克斯1

git checkout branchA
git rebase master
ls test.txt

Answer 1:

这是一个有趣的问题。 因为你删除的文件后BranchA被创建,然后被合并masterBranchA ,我不知道混帐如何能够实现有冲突。

坏合并后,您可以撤消,然后重新合并,但是加回文件:

git checkout HEAD@{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit


Answer 2:

在这种情况下,速战速决,“混帐复归”的承诺已删除的文件。

当这种情况在未来出现,更好的方式来处理它,以确保新文件的创建发生在树枝上。 然后它的主人时添加合并,但你没有躺在身边的高手在此期间该文件。



Answer 3:

凯西的例子并没有对我的情况下工作-我不能签test.txtmaster ,因为它已不再是那支:

$ git checkout master test.txt
error: pathspec 'test.txt' did not match any file(s) known to git.

令人高兴的是我可以拉出该文件的branchA自己的HEAD

$ git checkout branchA
$ git merge --no-commit master
$ git checkout HEAD test.txt
$ git add test.txt
$ git commit


Answer 4:

您需要修改该文件中的分支,所以有一个与后备箱中删除合并冲突。

同样的事情会发生,如果你的,例如,在树干headerfile删除的东西的声明(因为没有什么需要的话),并在该声明中添加依赖于分支一些非头文件(S)。 当合并,因为分公司不接触(的一部分)的标题,它只会删除该声明,事情会打破。

只要你有在多个地方的东西,是相互依存的,需要保持同步,它很容易合并默默带来问题。 它只是你必须了解和合并时,检查的事情之一。 理想情况下,你用编译时断言或其他构建时检查,这将使任何故障立即显现出来。



Answer 5:

我对这个解决方案是简单地修改我需要保持(添加这是无论如何需要评论)的文件,并承诺在目标分支这些变化,从而产生合并冲突,可以很容易地与解决git add和正常提交。

我的历史就这样的事情。 分公司名称已被更改,以保护无辜。

  1. 创建和提交文件的一项新功能,以主
  2. 认识到这一点除了要更多地参与比原计划,因此,支到feature_branch
  3. 从主删除的文件,以免破坏与RBS与这种正常的工作流程
  4. 久而久之,在feature_branch在主更多的提交,无
  5. 在功能恢复工作, git merge master上feature_branch导致被删除(当然)原始文件, git reset --hard合并前
  6. 施加上述溶液


文章来源: git merge: Removing files I want to keep!
标签: git merge branch