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

Git在将旧分支合并到主分支时不应用已删除的文件。如何让Git应用已删除的文件?,git,git-merge,Git,Git Merge,我有一个硕士和一个开发分支。 我在这两方面都做出了承诺。 我还删除了dev中的一些文件。 我在master中进行了其他提交,所以这个master分支是最近的 我的问题是,将dev合并到master不会删除文件 Git认为这些文件存在于主机中,因此,在合并过程中保持它们。 我如何合并这两个分支并强制Git应用在dev中进行的所有提交?包括已删除的文件 谢谢你的帮助 您可以在不提交的情况下运行合并,确保拥有所有正确的文件,然后运行提交 执行合并 git checkout master git me

我有一个硕士和一个开发分支。 我在这两方面都做出了承诺。 我还删除了dev中的一些文件。 我在master中进行了其他提交,所以这个master分支是最近的

我的问题是,将dev合并到master不会删除文件

Git认为这些文件存在于主机中,因此,在合并过程中保持它们。

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


谢谢你的帮助

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

  • 执行合并

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

  • 提交合并,完成该过程

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

    如果文件在合并分支中被删除,git不会在合并期间保留这些文件。-无

    为了向自己证明这一点,我不得不尝试重现你的情景。查看此演示,希望您能看到您正在做的不同之处

    创建一个新的存储库 已在/test/.Git中初始化空Git存储库/

    创建一些文件并将其添加到主分支 [master(root提交)feaa910]init repo
    2个文件已更改,2个插入(+)
    创建模式100644 1.txt
    创建模式100644 2.txt

    创建新分支并添加/删除一些文件 切换到新分支“新建”

    在新的分支上
    要提交的更改:
    (使用“git重置磁头…”取消分级)

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

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

    在master中提交更多更改 切换到“主”分支

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

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

    验证文件是否仍在新文件中删除 切换到“新”分支

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

    将新文件合并到主文件中 切换到“主”分支

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

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


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

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

    i、 e.假设
    master
    dev
    分支已经存在

  • 创建并提交
    file.txt
    master
  • 签出
    dev
    ,然后再次创建并提交
    file.txt
    dev
    。现在,由于您已经创建了两个不同的文件,git将它们视为两个独立的实体,尽管文件名相同,这完全违背了版本控制的目的
  • 稍后从
    dev
  • dev
    合并到
    master
    ,low and seek
    file.txt
    仍然存在于
    master
    中,这很有意义,因为正如我所说,git认为这两个文件是完全独立的
  • 注意如果您没有从
    dev
    中删除
    file.txt
    并尝试合并,那么您可能会遇到合并冲突,因为git不知道如何处理具有相同路径/文件名的两个不同实体

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

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

    在这种情况下,我建议改进工作流,从其他分支签出特定文件:

  • 创建并提交
    file.txt
    master
  • 签出
    dev
    ,然后从另一个分支获取特定文件

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

  • 现在git认识到它们是同一个实体。因此,您可以在
    dev

  • dev
    合并到
    master
    中,现在将从
    master
    中删除
    file.txt

  • 我也有同样的问题。在我的例子中,我认为问题在于,当我进行合并时,与远程分支相比,我的合并自分支的副本已经过时。(删除的是同事,不是我)


    在任何情况下,修复它的是删除整个工作副本并重新克隆它。

    有趣的是,您使用的是git应用程序还是仅从命令行?我使用的是cmd行这不是我的工作方式。当与分支中的更改没有冲突时,合并肯定会删除文件。您可能有一个特殊的默认值来产生这种行为。如果文件在待合并分支中被删除,git在合并期间不会保留这些文件。你有一个不同的问题。非常感谢这些细节。我将尝试签出已删除的文件并再次合并git。谢谢你的提示。这一直是我的问题。在不同的时间在不同的分支中创建相同的精确文件,并且它们也不存在于分支的底部。我花了好几天的时间才意识到…这就是为什么
    mkdir test
    cd test
    git init
    
    echo one > 1.txt
    echo two > 2.txt
    git add .
    git commit -m "init repo"
    
    git checkout -b new
    
    echo three > 3.txt
    rm 2.txt 
    git add .
    git status
    
    git commit -m "changes in new"
    
    git checkout master
    
    echo update >> 1.txt 
    git commit -am "update master"
    
    tree
    
    git checkout new
    
    tree
    
    git checkout master
    
    git merge new master
    
    tree
    
    git checkout master -- file.txt