使用git merge单独提交冲突解决方案

vmj*_*vmj 13 git merge merge-conflict-resolution

我正在尝试将一个大主题分支合并到主服务器中,但我想要一个单独的提交来显示冲突解决方案是如何发生的.目标是让一个提交显示"这些文件冲突以及它们如何冲突",下一个提交将显示"这就是解决冲突的方式".即第一次提交将包含冲突标记.

原因是大主题分支已经过审查和测试,主分支也是如此.在合并中,我们只想查看需要一些工作的部分(冲突和其他合并工作).

这是我到目前为止所做的:

git checkout master
git checkout -b merge-from-topic
git merge topic
Run Code Online (Sandbox Code Playgroud)

要记录有冲突的文件,我使用临时文件:

git diff --name-only --diff-filter=U >conflicts.txt
Run Code Online (Sandbox Code Playgroud)

首先,我只是将带有冲突标记的文件添加到提交中:

xargs git add <conflicts.txt
git commit
Run Code Online (Sandbox Code Playgroud)

然后我创建另一个分支(用于审查目的),我想在其中进行冲突解决:

git checkout -b resolve-merge-from-topic
Run Code Online (Sandbox Code Playgroud)

为了恢复冲突,我试过了

xargs git reset HEAD^ -- <conflicts.txt
Run Code Online (Sandbox Code Playgroud)

但是后来git mergetool说没有文件需要合并,尽管我工作树中的文件有冲突标记.

如何恢复conflict.txt中列出的文件,以便我可以在它们上使用git mergetool

我也对其他获得"单独提交冲突解决"效果的方式持开放态度.

seh*_*ehe 4

git merge会留下冲突标记。

然后,您(通常)调用git mergetool(根据--tool您的偏好)来解决冲突。大多数时候,这会导致阶段性的变化这是你想要改变的(例如使用git reset)。

现在单独提交“原始”合并,然后git add . && git commit -m 'resolutions'添加git commit -am 'resolutions'冲突解决方案。

请注意,这会使您在合并边界修订版中留下“损坏的”构建。

步骤:

git checkout -b be_merged       # start a temp branch for the merge (safety)

git merge --no-commit diverge   # initiate merge from a diverged branch
git status                      # shows conflicts
git mergetool                   # resolve them as always
git status                      # shows resolutions as staged
git reset                       # unstage the changes
git status                      # shows unstaged changes (good!)
git commit -m 'merge, conflicts pending'   # commit the merge
git commit -am 'conflicts resolved'        # commit the resolutions
Run Code Online (Sandbox Code Playgroud)

  • 似乎对我不起作用。在“git重置”之后,所有修改的文件都将被取消暂存,并且所有添加的文件都将被取消跟踪,因此以下“git commit”不会执行任何操作。最后的“git commit -a”仅提交修改的文件,提交中没有冲突标记的迹象,而所有新文件都未被跟踪。 (2认同)