我有一个主人和一个开发分支.我两个都做了提交.我还删除了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存储库
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
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
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在合并后肯定会被删除.
我能理解这种可能情况的唯一方法是,如果您在独立的分支中创建了两个不同的文件,每个文件都具有相同的文件名。
即假设master和dev分支已经存在。
file.txt到masterdev,然后再次创建并提交 file.txt到dev. 现在,因为您创建了两个不同的文件,git 将它们视为两个独立的实体,尽管文件名相同,这违背了版本控制的全部目的。file.txt从devdev到 中master,而 low 和 beholdfile.txt仍然存在于 中master,这是有道理的,因为就像我说的,git 将这两个文件视为完全独立的。通知如果你有没有删除file.txt从dev并试图合并,那么你会得到一个合并冲突,因为混帐不知道如何处理两个不同的实体具有相同路径/文件名。
如果这是您的情况,那么我将冒着傲慢的风险说您做错了 ;)
版本控制系统的重点是让该工具及时管理不同阶段文件之间的差异,以及这些更改与存储库中其他文件的关系。
我在这种情况下改进工作流程的建议是从另一个分支检出特定文件:
file.txt到mastercheckout dev,然后只需从另一个分支中获取特定文件
git checkout master -- file.txt
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您仍将在dev分支上,但现在file.txt已从master分支添加。
现在 git 认识到这些是同一个实体。所以你可以删除文件并提交删除dev
dev到master现在file.txt将从中删除master