【问题标题】:Git does not apply deleted files when merging an old branch into the master. How can I tell Git to apply deleted files?将旧分支合并到主分支时,Git 不会应用已删除的文件。如何告诉 Git 应用已删除的文件?
【发布时间】:2016-05-09 17:41:45
【问题描述】:

我有一个 master 和一个 dev 分支。 我在这两个方面都做出了承诺。 我还删除了dev中的一些文件。 我在 master 中做了其他提交,所以这个 master 分支是更新的。

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

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

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

感谢您的帮助!

【问题讨论】:

  • 有趣,您是使用 git 应用程序还是仅使用命令行?
  • 我正在使用 cmd 行
  • 这不是我的工作方式。当分支中的更改没有冲突时,合并肯定会删除文件。您可能有一个特殊的默认 merge strategy 会产生这种行为。
  • 重申一下,这不是 git 所做的。如果文件在要合并的分支中被删除,git 不会在合并过程中保留文件。你有不同的问题。

标签: git git-merge


【解决方案1】:

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

如果文件在合并分支中被删除,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

切换到新分支'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"

[新 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] 更新master
1 个文件已更改,1 个插入(+)

tree

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

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

git checkout new

切换到“新”分支

tree

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

合并新到主

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

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

【讨论】:

  • 感谢您为说明我的问题付出了这么多努力。我同意这是默认行为。不幸的是,我确实有一个不考虑已删除文件的 git merge。
【解决方案2】:

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

即假设masterdev 分支已经存在。

  1. 创建并提交file.txtmaster
  2. 签出dev,然后再次创建并将file.txt提交给dev。现在,因为您创建了两个不同的文件,git 将它们视为两个独立的实体,尽管文件名相同,这违背了版本控制的全部目的。
  3. 稍后从dev 中删除file.txt
  4. dev 合并到master 中,然后file.txt 仍然存在于master 中,这是有道理的,因为正如我所说,git 将这两个文件视为完全独立的。

通知如果您没有dev 中删除file.txt 并尝试合并,那么您将遇到合并冲突,因为 git 不知道如何处理具有相同路径/文件名的两个不同实体。

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

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

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

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

    git checkout master -- file.txt
    

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

  3. 现在 git 识别出它们是同一个实体。因此您可以删除文件并在dev

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

【讨论】:

  • 非常感谢您提供这些详细信息。我将尝试检查已删除的文件并再次 git 合并。谢谢你的小费。
  • 这一直是我的问题。在不同时间在不同分支中创建的完全相同的文件,它们也不存在于分歧分支的基础上。我花了好几天才意识到......
【解决方案3】:

我遇到了同样的问题。就我而言,我认为问题在于,当我进行合并时,与远程分支相比,我的合并分支副本已经过时。 (删除的是同事,不是我)

无论如何,修复它的方法是删除整个工作副本并重新克隆它。

【讨论】:

    【解决方案4】:

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

    1. 执行合并

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

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

      git commit
      

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 1970-01-01
      • 2011-09-01
      • 2023-04-03
      • 1970-01-01
      • 2023-03-26
      • 2015-09-07
      • 1970-01-01
      相关资源
      最近更新 更多