我有一个主人和一个开发分支。 我两个都做了提交。 我还删除了dev中的一些文件。 我在master中做了其他提交,所以这个master分支是最新的。
我的问题是将dev合并为master不要删除文件。
Git认为这些文件存在于master中,因此在合并期间保留它们。
如何合并这两个分支并强制Git应用在dev中创建的所有提交?包括已删除的文件。
求你帮忙!
答案 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
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
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)
我能理解这种可能情况的唯一方法是,如果您在独立分支中创建了两个不同的文件,每个文件具有相同的文件名。
即。假设master
和dev
分支已经存在。
file.txt
至master
dev
,然后再次创建 并提交 file.txt
到dev
。现在因为你已经创建了两个不同的文件,git将它们视为两个独立的实体,尽管文件名相同,这就破坏了版本控制的全部目的。file.txt
dev
dev
合并到master
,而file.txt
中仍然存在低master
,这是有道理的,因为就像我说的那样,git将这两个文件完全视为独立的。 通知如果您从file.txt
未删除了dev
并尝试合并,那么您可能会遇到合并冲突,因为git不会我不知道如何使用相同的路径/文件名处理两个不同的实体。
如果这是你的情景,那么我将冒险冒犯并说你做错了;)
版本控制系统的目的是让工具管理不同阶段的文件之间的差异,以及这些更改与存储库中其他文件的关系。
我在这种情况下改进工作流程的建议是检查来自其他分支的特定文件:
file.txt
至master
结帐dev
,然后从其他分支抓取特定文件
git checkout master -- file.txt
在这种情况下,您仍然会在dev
分支上,但现在已从file.txt
分支添加master
。
现在git认识到这些是同一个实体。因此,您可以删除该文件并在dev
dev
合并到master
现在将从file.txt
master
醇>
答案 2 :(得分:1)
您可以在不提交的情况下运行合并,确保拥有所有正确的文件,然后运行提交。
执行合并
git checkout master
git merge --no-commit dev
进行必要的更改,并修复合并冲突(如果有)。
git rm my-files-to-delete
提交合并,完成整个过程。
git commit
答案 3 :(得分:1)
我遇到了同样的问题。在我的情况下,我认为问题是,当我进行合并时,我的合并来自分支的副本与远程相比已经过时了。 (一位同事做了删除,而不是我)
无论如何,修正它的原因是删除整个工作副本并重新克隆它。