你怎么能合并在git的两个分支,一个分支保留必要的文件?
当合并两个分支,如果一个文件是在一个分支删除而不是在另一个文件最终被删除。
例如:
- 一个文件在主存在,当你做一个新的分支
- 你从主删除文件,因为我们并不需要它(还)
- 您在分支的变化增加一个功能, 它依赖于现有的文件
- 你做出错误修复在师傅 (不能丢弃)
- 在合并有一天,该文件已经一去不复返了!
如何重现:
同一个文件中创建一个混帐回购协议。
git init echo "test" > test.txt git add . git commit -m "initial commit"
创建一个分支
git branch branchA
删除主文件
git rm test.txt git commit -m "removed file from master"
使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
这是一个有趣的问题。 因为你删除的文件后BranchA
被创建,然后被合并master
成BranchA
,我不知道混帐如何能够实现有冲突。
坏合并后,您可以撤消,然后重新合并,但是加回文件:
git checkout HEAD@{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit
在这种情况下,速战速决,“混帐复归”的承诺已删除的文件。
当这种情况在未来出现,更好的方式来处理它,以确保新文件的创建发生在树枝上。 然后它的主人时添加合并,但你没有躺在身边的高手在此期间该文件。
凯西的例子并没有对我的情况下工作-我不能签test.txt
从master
,因为它已不再是那支:
$ 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
您需要修改该文件中的分支,所以有一个与后备箱中删除合并冲突。
同样的事情会发生,如果你的,例如,在树干headerfile删除的东西的声明(因为没有什么需要的话),并在该声明中添加依赖于分支一些非头文件(S)。 当合并,因为分公司不接触(的一部分)的标题,它只会删除该声明,事情会打破。
只要你有在多个地方的东西,是相互依存的,需要保持同步,它很容易合并默默带来问题。 它只是你必须了解和合并时,检查的事情之一。 理想情况下,你用编译时断言或其他构建时检查,这将使任何故障立即显现出来。
我对这个解决方案是简单地修改我需要保持(添加这是无论如何需要评论)的文件,并承诺在目标分支这些变化,从而产生合并冲突,可以很容易地与解决git add
和正常提交。
我的历史就这样的事情。 分公司名称已被更改,以保护无辜。
- 创建和提交文件的一项新功能,以主
- 认识到这一点除了要更多地参与比原计划,因此,支到feature_branch
- 从主删除的文件,以免破坏与RBS与这种正常的工作流程
- 久而久之,在feature_branch在主更多的提交,无
- 在功能恢复工作,
git merge master
上feature_branch导致被删除(当然)原始文件, git reset --hard
合并前 - 施加上述溶液