获取两个不同 git 存储库中文件的差异并应用于第一个存储库

get diff between files in two different git repos and apply to first repo

我有两个不同的本地 git 存储库,我们称之为 ab。它们都在我的主目录的 projects 文件夹中。我想在两个回购协议中的特定文件之间获得差异,我们称之为 foo,并将该差异应用到 a.

如果我 运行 git diff ./foo ../b/foo > diff.diff 从内部 a 我可以查看差异并确认它包含我想要应用的更改,但是当我 运行 git apply diff.diff 然后我得到这个错误:

fatal: invalid path './foo' 

如果我尝试 运行ning git diff ~/projects/a/foo ~/projects/b/foo > diff.diff,那么当我尝试应用差异时,我会收到此错误:

error: home/ryan/projects/a/foo: No such file or directory

现在,我只需复制文件即可获得与应用差异相同的效果,但是否有充分的理由说明这不起作用?

要比较回购 a 和回购 b 之间的 foo 文件并将更改应用到回购 a,您只需要使用以下命令:

# In ~/projects/a (local repo a)
git remote add repob  ~/projects/b -f
git diff master repob/master -- foo > diff.patch
git apply diff.patch

现在 repo a 中的 foo 更改为 repo b 的版本。然后你可以提交并推送:

git add foo
git commit -m 'change foo as the version in repo b'
git push

首先,git diff 在这里没有给你买任何东西——你还不如使用普通的 diff -u。补丁不适用的原因是 git-apply 被 diff 中不一致的文件路径弄糊涂了。要解决此问题,您需要设置工作目录,以便 diff 中的相对路径对于文件的两个版本具有相同深度。在这里,我将目录更改为两个项目目录的共同父目录:

cd ~/projects
diff -u a/foo b/foo >a/diff.patch
cd a
patch -p1 <diff.patch
git add ... commit ... etc ...