【git】如果我只想 merge 一个文件应该怎么办

77 阅读1分钟

背景

在多人项目中,有的时候你开发的分支和 master 会有很多冲突,尤其是 squash merge 的时候。这时,你分支中依赖 master 中的某个文件,你只想合并这个文件而不是整个分支,这个时候,你应该如何做。

案例

假设有一个 test1 分支,这个分支里有一个 demo1.txt 文件。路径和文件内容如图所示。

image.png

在 test1 分支上建立 test2

git checkout -b test2

而我的 test2 分支的 demo1.txt 的文件内容如图所示:

image.png 此时,又有其他人更新了 test1 的一些功能

image.png

我并不想解决 test1 和 test2 的其他冲突,因为这很耗费时间,我只想 merge demo1.txt 这个文件。我想使用 same function needed 这一功能,同时,我不希望自己的 test2 被覆盖掉。

那么是否可以用

git checkout test1 express/file/demo1.txt

呢?答案是是不行的,checkout 在上述命令中的含义是覆盖,它会直接把 test1 的 demo1.txt 覆盖当前分支的 demo1.txt 文件。

所以需要使用 --patch 关键字

git checkout --patch test1 express/file/demo1.txt

这个时候会让你解决冲突:

image.png

y 和 n,一个是采纳,一个是不采纳,如果选了 y 就相当于覆盖了,所以不行。需要选 e,自己进入 vim edit。

删除 test2 前面的减号,:wq 保存。

image.png

完成合并

image.png

当然,这个方法的弊端是没有办法利用 vscode 解决冲突,因此比较麻烦。我目前还没有发现更好的办法。