将旧分支合并到主分支时,Git不应用已删除的文件。如何告诉Git应用已删除的文件?

时间:2016-05-09 17:41:45

标签: git git-merge

我有一个主人和一个开发分支。 我两个都做了提交。 我还删除了dev中的一些文件。 我在master中做了其他提交,所以这个master分支是最新的。

我的问题是将dev合并为master不要删除文件。

Git认为这些文件存在于master中,因此在合并期间保留它们。

如何合并这两个分支并强制Git应用在dev中创建的所有提交?包括已删除的文件。

求你帮忙!

4 个答案:

答案 0 :(得分:9)

当与分支中的更改没有冲突时,合并肯定会删除文件。

  如果在合并分支中删除文件,则git不会在合并期间保留文件。 - Nils_M

为了证明这一点,我不得不尝试重现你的场景。看到这个演示,希望你能看到你在做什么不同。

创建一个新的存储库

mkdir test
cd test
git init
  

/test/.git /

中初始化的空Git存储库

创建并添加一些文件到主分支

echo one > 1.txt
echo two > 2.txt
git add .
git commit -m "init repo"
  

[master(root-commit)feaa910] init repo
   2个文件已更改,2个插入(+)
   创建模式100644 1.txt
   创建模式100644 2.txt

创建新分支并添加/删除一些文件

git checkout -b new
  

切换到新分支'新'

echo three > 3.txt
rm 2.txt 
git add .
git status
  

分支新   要承诺的变更:
    (使用“git reset HEAD ...”来取消演出)

     

已删除:2.txt
    新文件:3.txt

git commit -m "changes in new"
  

[new db6b1a0]新的变化    更改了2个文件,1个插入(+),1个删除( - )
   删除模式100644 2.txt
   创建模式100644 3.txt

在master

中提交更多更改
git checkout master
  

切换到分支'master'

echo update >> 1.txt 
git commit -am "update master"
  

[master 912a520]更新主人
   1个文件已更改,1个插入(+)

tree
  


  ├──1.txt
  └──2.txt

验证新文件中仍然删除的文件

git checkout new
  

切换到分支'新'

tree
  


  ├──1.txt
  └──3.txt

将new合并为主

git checkout master
  

切换到分支'master'

git merge new master
  

删除2.txt
  通过“递归”策略进行合并。
   2.txt | 1 -
   3.txt | 1 +
   更改了2个文件,1个插入(+),1个删除( - )
   删除模式100644 2.txt
   创建模式100644 3.txt

tree
  


  ├──1.txt
  └──3.txt

正如您所看到的,2.txt分支中删除的文件new现在在合并后的master中已被删除。

答案 1 :(得分:2)

我能理解这种可能情况的唯一方法是,如果您在独立分支中创建了两个不同的文件,每个文件具有相同的文件名。

即。假设masterdev分支已经存在。

  1. 创建并提交file.txtmaster
  2. 结帐dev,然后再次创建 并提交 file.txtdev。现在因为你已经创建了两个不同的文件,git将它们视为两个独立的实体,尽管文件名相同,这就破坏了版本控制的全部目的。
  3. 稍后从file.txt
  4. 删除dev
  5. dev合并到master,而file.txt中仍然存在低master,这是有道理的,因为就像我说的那样,git将这两个文件完全视为独立的。
  6. 通知如果您从file.txt 删除了dev并尝试合并,那么您可能会遇到合并冲突,因为git不会我不知道如何使用相同的路径/文件名处理两个不同的实体。

    如果这是你的情景,那么我将冒险冒犯并说你做错了;)

    版本控制系统的目的是让工具管理不同阶段的文件之间的差异,以及这些更改与存储库中其他文件的关系。

    我在这种情况下改进工作流程的建议是检查来自其他分支的特定文件:

    1. 创建并提交file.txtmaster
    2. 结帐dev,然后从其他分支抓取特定文件

      git checkout master -- file.txt
      

      在这种情况下,您仍然会在dev分支上,但现在已从file.txt分支添加master

    3. 现在git认识到这些是同一个实体。因此,您可以删除该文件并在dev

    4. 中提交删除
    5. dev合并到master现在将从file.txt
    6. 删除master

答案 2 :(得分:1)

您可以在不提交的情况下运行合并,确保拥有所有正确的文件,然后运行提交。

  1. 执行合并

    git checkout master
    git merge --no-commit dev
    
  2. 进行必要的更改,并修复合并冲突(如果有)。

    git rm my-files-to-delete
    
  3. 提交合并,完成整个过程。

    git commit
    

答案 3 :(得分:1)

我遇到了同样的问题。在我的情况下,我认为问题是,当我进行合并时,我的合并来自分支的副本与远程相比已经过时了。 (一位同事做了删除,而不是我)

无论如何,修正它的原因是删除整个工作副本并重新克隆它。