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

Mat*_*set 7 git git-merge

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

我的问题是将dev合并到master中不要删除文件.

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

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

求你帮忙!

Jef*_*ett 11

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

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

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

创建一个新的存储库

mkdir test
cd test
git init
Run Code Online (Sandbox Code Playgroud)

/test/.git/中初始化的空Git存储库

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

echo one > 1.txt
echo two > 2.txt
git add .
git commit -m "init repo"
Run Code Online (Sandbox Code Playgroud)

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

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

git checkout -b new
Run Code Online (Sandbox Code Playgroud)

切换到新的分支'新'

echo three > 3.txt
rm 2.txt 
git add .
git status
Run Code Online (Sandbox Code Playgroud)

在分支上新
提交的更改:(
使用"git reset HEAD ..."取消暂停)

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

git commit -m "changes in new"
Run Code Online (Sandbox Code Playgroud)

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

在master中提交一些更改

git checkout master
Run Code Online (Sandbox Code Playgroud)

切换到分支'主'

echo update >> 1.txt 
git commit -am "update master"
Run Code Online (Sandbox Code Playgroud)

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

tree
Run Code Online (Sandbox Code Playgroud)

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

验证文件仍然以新的方式删除

git checkout new
Run Code Online (Sandbox Code Playgroud)

切换到分支'新'

tree
Run Code Online (Sandbox Code Playgroud)

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

将new合并为master

git checkout master
Run Code Online (Sandbox Code Playgroud)

切换到分支'主'

git merge new master
Run Code Online (Sandbox Code Playgroud)

删除2.txt
由'递归'策略进行合并.
2.txt | 1 -
3.txt | 1 +
2个文件已更改,1个插入(+),1个删除( - )
删除模式100644 2.txt
创建模式100644 3.txt

tree
Run Code Online (Sandbox Code Playgroud)

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

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

  • 感谢为说明我的问题付出了这么多努力。我同意这是默认行为。不幸的是,我确实有一个不考虑已删除文件的 git merge。 (4认同)

Jef*_*ett 6

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

即假设masterdev分支已经存在。

  1. 创建并提交file.txtmaster
  2. checkout dev,然后再次创建并提交 file.txtdev. 现在,因为您创建了两个不同的文件,git 将它们视为两个独立的实体,尽管文件名相同,这违背了版本控制的全部目的。
  3. 后来file.txtdev
  4. 合并dev到 中master,而 low 和 beholdfile.txt仍然存在于 中master,这是有道理的,因为就像我说的,git 将这两个文件视为完全独立的。

通知如果你有没有删除file.txtdev并试图合并,那么你会得到一个合并冲突,因为混帐不知道如何处理两个不同的实体具有相同路径/文件名。

如果这是您的情况,那么我将冒着傲慢的风险说您做错了 ;)

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

我在这种情况下改进工作流程的建议是从另一个分支检出特定文件:

  1. 创建并提交file.txtmaster
  2. checkout dev,然后只需从另一个分支中获取特定文件

    git checkout master -- file.txt
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 现在 git 认识到这些是同一个实体。所以你可以删除文件并提交删除dev

  4. 合并devmaster现在file.txt将从中删除master