如何在git中合并两个分支,从分支中保留必要的文件?
合并两个分支时,如果某个分支中的文件被删除而另一个分支中没有,则该文件最终会被删除。
例如:
如何重现:
使用一个文件创建一个git repo。
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
Rebase 1
git checkout branchA
git rebase master
ls test.txt
答案 0 :(得分:27)
这是一个有趣的问题。因为您在创建BranchA
后删除了文件,然后将master
合并到BranchA
,我不确定Git如何能够意识到存在冲突。
错误合并后,您可以撤消,然后重新合并,但添加回文件:
git checkout HEAD@{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit
答案 1 :(得分:6)
对于这种情况下的快速修复,“git revert”删除文件的提交。
当这种情况在未来出现时,处理它的更好方法是确保在分支上发生新文件的创建。然后在合并时将其添加到master上,但在此期间您没有在master中放置该文件。
答案 2 :(得分:4)
凯西的示例不适用于我的案例 - 我无法从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
答案 3 :(得分:2)
您需要修改分支中的文件,以便与主干中的删除发生合并冲突。
如果您在例如删除仲裁中头文件中的某些内容的声明(因为没有必要),并且将该声明的依赖性添加到某些非头文件中,则会发生完全相同的事情。分支。当你合并时,由于分支没有触及(那部分)标题,它只会删除声明,事情就会中断。
每当你在多个地方拥有相互依赖且需要保持同步的东西时,合并就很容易无声地引入问题。它只是您必须了解的事情之一,并在合并时检查。理想情况下,您使用编译时断言或其他构建时间检查,这将使任何失败立即显现。
答案 4 :(得分:1)
我的解决方案是简单地修改我需要保留的文件(添加了一条需要的注释)并在目标分支上提交这些更改,从而生成合并冲突,可以使用{{1和正常的提交。
我的历史就是这样的。分支名称已被更改以保护无辜者。
git add
导致原始文件被删除(当然),git merge master
到合并之前答案 5 :(得分:0)
与 git 相同的问题。正在一个分支中开发一个功能,然后我的工作决定将这个功能搁置一旁。因此,从 master 分支中删除了相关的功能文件,以允许应用程序部署而没有不必要的文件......暂时。现在我的工作需要我完成旧功能,当我尝试将旧分支合并或变基到当前主分支时,它会删除我需要的文件。
快速的解决方法是:修改你需要保留在你的特性分支中的文件,添加并提交,然后与你的master合并。现在这将导致合并冲突,而不是合并时的删除模式。现在您可以保留对文件的“我们的”更改。
问题是 git 将 HEAD 中的文件删除视为未更改,并将默认为删除模式。具体:deleted in master and modified in HEAD
是你修改你需要的文件后输出的。
重现解决方案:
git reset --hard origin/old_branch
git merge master
自动合并失败;修复冲突,然后提交结果。
git add .
和 git commit -m "fix deleted HEAD"
git merge master