git合并时始终使用本地版本的文件(即使合并的一侧没有更改)

时间:2012-04-08 06:25:49

标签: git version-control git-merge

这个问题与How do I tell git to always select my local version for conflicted merges on a specific file?非常相似,但有一个重要区别。

我已经按照VonC对上述问题的回答中的优秀步骤进行了操作,一切都近乎可行。但是,在我的情况下,我只更改了文件的传入版本(而不是本地传入版本)。

由于只有一个分支发生了变化,因此不需要合并。在这种情况下,似乎git不打算运行合并驱动程序,只是用传入的覆盖本地版本,这正是我的自定义合并驱动程序应该阻止的。< / em>的

有没有办法告诉git它在合并期间永远不应该更改特定文件(即使在VonC的答案看起来不太合适的上述情况下)?

1 个答案:

答案 0 :(得分:2)

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

这个问题“Git merge - manual merge - forcing conflic having WHOLE old and new file version”在评论中得出结论:

  

我最担心的是答案:“这是不可能的,因为它是git的工作方式”。

并且“Need GIT workflow suggestion”提到尝试:

  

*.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,但没有太大的成功。