Git 交互式合并



我有两个分支,文件完全相同(如果你想知道它是一个.sql文件),我想交互式地合并它。

几乎我想打开一个差异程序,就像我在发生冲突(或命令行)时所做的那样,并准确选择哪些行去哪里。

有没有办法这样做?

是的,但主要是通过手动实现。你会告诉 Git 你正在合并两个相关的分支,但它不应该尝试自己提交结果,(编辑添加:如果它认为合并是微不足道的,也不要快进):

git merge --no-commit --no-ff branch-to-merge

然后,您将向 git 询问出现在两个分支中的文件:

git show HEAD:filename >filename.HEAD
git show branch-to-merge:filename >filename.branch

和他们的合并基础,

git show `git merge-base HEAD branch-to-merge`:filename  >filename.base

您将使用所需的任何工具(例如)

meld filename.{HEAD,branch,base}

您将暂存该 ( git add filename ),然后提交合并 ( git commit )。

从要合并到的分支:

git checkout -p branch_to_merge --

这不会签出branch_to_merge,但可以让您交互式地从补丁(diff)添加大块头。

http://git-scm.com/docs/git-checkout

最简单的方法是执行git merge <other_branch然后git mergetool图形化地解决冲突。请参阅 #10935226 了解如何设置合并工具。

问题是,您更改的文件可能会与旧文件快进合并。然后你必须变得更聪明一点。

Novelocrat 提供了一种深入挖掘的好方法,但您经常需要将初始命令更改为 git merge --no-commit --no-ff <other_branch>,因为 --no-commit 实际上意味着"不要提交合并......除非是快进合并。对于很多人来说,这有点刺痛,他们试图做你想做的事。

有时最不容易混淆的方式不是很时尚:在不同的工作副本中签出另一个分支,使用你最喜欢的合并工具在你想要的目录中获取你想要的版本,然后提交它。

根据这个要点,其中 temp 可以是现有的分支。

https://gist.github.com/katylava/564416


在主控上:

git checkout -b temp

在温度上:

git merge --no-commit --no-ff refactor

。哪个阶段一切,所以:

git reset HEAD

然后开始添加所需的部分:

git add --interactive

我发现这样做的最好方法是:

  1. 使用更改签出分支
  2. 从该点创建新分支
  3. 将新分支重置为要比较和构建的提交。 默认情况下,重置将是"混合"重置,这意味着它不会更改"工作树",即实际的代码文件
  4. 此时,我的文本编辑器 (VSCode) 向我展示了当前文件与重置到的提交之间的区别。 我可以编辑代码以选择要提交的行。这样做是允许我查看我的分支更改的所有内容并确认我将提交的每一行代码。 这很有用,例如在将我的更改合并回生产环境之前。

您可以简单地使用 WinMerge、DiffMerge 或任何可用的 diff/merge UI 工具来手动完成工作。 如果你想把它挂接到"git difftool"中,你可以在网上搜索,找到让这些工具与git一起工作的方法。

最新更新