协慌网

登录 贡献 社区

是否有 git-merge --dry-run 选项?

我正在合并一个可能有很多冲突的远程分支。我怎么知道它是否会发生冲突?

我看不到git-merge--dry-run

答案

如前所述,传递--no-commit标志,但是为了避免快速提交,也传递--no-ff ,如下所示:

$ git merge --no-commit --no-ff $BRANCH

要检查分阶段的更改:

$ git diff --cached

即使是快速合并,您也可以撤消合并:

$ git merge --abort

我只需要实现一种方法,该方法可以自动查找存储库与其远程数据库之间的冲突。该解决方案在内存中进行合并,因此不会触及索引或工作树。我认为这是解决此问题的最安全的方法。运作方式如下:

  1. 将远程获取到您的存储库。例如: git fetch origin master
  2. 运行 git merge-base: git merge-base FETCH_HEAD master
  3. 运行 git merge-tree: git merge-tree mergebase master FETCH_HEADmergebase是上一步骤中 merge-base 打印的十六进制 ID)

现在,假设您想将远程主服务器与本地主服务器合并,但是可以使用任何分支。 git merge-tree将在内存中执行合并并将结果打印到标准输出。模式的<<>> Grep。或者,您可以将输出打印到文件中并进行检查。如果您发现以 “两个都更改” 开头的行,则很可能会发生冲突。

我假设您只是想在实际尝试合并之前先弄清楚自己会遇到多少麻烦... 并且在合并失败后重置为最后一次提交是相对容易的,因此如果这样的话我不会感到惊讶是预期的方法。

就是说,如果您真的不想触摸工作树中的现有文件,则可以创建一个补丁并将其针对目标分支进行测试。这还具有显示确切地对哪些文件进行了更改的好处 - 只需在文本编辑器中打开补丁文件即可。

git checkout -b mycrazybranch
[change some stuff...]
git add .
git commit -m "changed some stuff"
git format-patch master --stdout > crazy.patch
git checkout master
git apply crazy.patch --check
[all good! cleanup...]
rm crazy.patch

如您所见,这将创建一个补丁文件,然后可以使用 --check 对其进行测试,看是否有任何错误,然后删除该补丁文件。