git merge:删除我要保留的文件!

时间:2009-09-10 20:47:55

标签: git merge branch

如何在git中合并两个分支,从分支中保留必要的文件?

合并两个分支时,如果某个分支中的文件被删除而另一个分支中没有,则该文件最终会被删除。

例如:

  • 创建新分支时,master中存在一个文件
  • 您从master中删除该文件,因为我们不需要它(尚未)
  • 您在分支中进行更改以添加功能,依赖于现有文件
  • 您在主中修复错误(不能丢弃)
  • 你有一天合并,文件就不见了!

如何重现:

  1. 使用一个文件创建一个git repo。

    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"
    
  5. 从这里,我发现合并这两个分支的任何方式都会删除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
    

6 个答案:

答案 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和正常的提交。

我的历史就是这样的。分支名称已被更改以保护无辜者。

  1. 为要掌握的新功能创建和提交文件
  2. 意识到这种添加将比原计划更加复杂,因此,分支到feature_branch
  3. 从master中删除文件,以免破坏RB等正常工作流程
  4. 时间过去了,master上有更多提交,feature_branch上没有提交
  5. 继续处理该功能,feature_branch上的git add导致原始文件被删除(当然),git merge master到合并之前
  6. 应用上述解决方案

答案 5 :(得分:0)

与 git 相同的问题。正在一个分支中开发一个功能,然后我的工作决定将这个功能搁置一旁。因此,从 master 分支中删除了相关的功能文件,以允许应用程序部署而没有不必要的文件......暂时。现在我的工作需要我完成旧功能,当我尝试将旧分支合并或变基到当前主分支时,它会删除我需要的文件。

快速的解决方法是:修改你需要保留在你的特性分支中的文件,添加并提交,然后与你的master合并。现在这将导致合并冲突,而不是合并时的删除模式。现在您可以保留对文件的“我们的”更改。

问题是 git 将 HEAD 中的文件删除视为未更改,并将默认为删除模式。具体:deleted in master and modified in HEAD是你修改你需要的文件后输出的。

重现解决方案:

  1. 将分支重置为已删除文件的旧版本:git reset --hard origin/old_branch
  2. 修改您需要保留的文件。不要让它们保持不变。
  3. 将您当前的 master 合并到功能分支:git merge master
<块引用>

自动合并失败;修复冲突,然后提交结果。

  1. 在解决冲突时保留“我们的”更改。
  2. git add .git commit -m "fix deleted HEAD"
  3. 完成合并:git merge master