3

这个问题非常类似于:如何告诉 git 始终选择我的本地版本以在特定文件上进行冲突合并?有一个重要的区别。

我已经按照 VonC 对上述问题的回答中的出色步骤进行了操作,并且几乎一切正常。但是,在我的情况下,我只更改了文件的传入版本(不是本地版本和传入版本)。

不需要合并,因为只有一个分支有变化。在这种情况下,git 似乎不需要运行合并驱动程序,而是简单地用传入的版本覆盖本地版本,这正是我的自定义合并驱动程序应该阻止的。

有什么方法可以从本质上告诉 git 在合并期间它永远不应该更改特定文件(即使在上述 VonC 的答案似乎不太有效的情况下)?

4

1 回答 1

2

当 Git 决定没有冲突时,似乎其他人已经尝试并未能强制冲突。

这个 SO 问题“ Git 合并 - 手动合并 - 强制冲突具有整个旧文件和新文件版本”在评论中得出结论:

我最害怕的是那个答案:“这是不可能的,因为这是 git 的工作方式”。

并且“需要 GIT 工作流程建议”提到尝试:

*.xml merge=Unset进入我的.gitattributes档案。
或自定义合并驱动程序~/.gitconfig试图导致自动合并失败

换句话说,这可能不是正确的方法。

如果您确定合并引入的所有修改不应该在这里,那么您可以尝试:

git clone yourRepo aCloneRepo
cd aCloneRepo
git merge --no-commit --no-ff origin/source_branch
# simply overwrite any change file by the ones in ..\yourRepo
git add .
git commit -m "merge"

请注意,git merge即使您git status提到没有要提交的内容,最后的 " " 也将起作用(因为您恢复了所有修改文件的内容)。
它将在新的提交中记录合并。

这会给你:

C:\Users\VonC\prog\git\tests\mergekeep\r4>git lg
*   a6a1588 - (HEAD, master) merge (2 minutes ago) <VonC>
|\
| * 1bcd75d - (origin/b) addition (2 hours ago) <VonC>
|/
* 9d2e8fb - (origin/master, origin/HEAD) first file (2 hours ago) <VonC>

但是本地文件不变。

如果您再次尝试合并您的分支,您将获得:

C:\Users\VonC\prog\git\tests\mergekeep\r4>git merge origin/b
Already up-to-date.

但是,这种解决方法很麻烦,涉及从一个工作树到另一个工作树的克隆和一些手动复制或 rsynch。
我尝试使用各种 git reset 命令或管道命令,如git update-index,但没有太大成功。

于 2012-04-08T15:04:17.527 回答