Git Interactive Merge?

Ste*_*ven 68 git version-control

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

我想要在出现冲突(或命令行)时像我一样打开一个差异程序,并准确选择哪些行去哪里.

反正有没有这样做?

Phi*_*ler 67

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

git merge --no-commit --no-ff branch-to-merge
Run Code Online (Sandbox Code Playgroud)

然后你会问git这个文件出现在两个分支中:

git show HEAD:filename >filename.HEAD
git show branch-to-merge:filename >filename.branch
Run Code Online (Sandbox Code Playgroud)

和他们的合并基地,

git show `git merge-base HEAD branch-to-merge`:filename  >filename.base
Run Code Online (Sandbox Code Playgroud)

你将使用你想要的任何工具合并它们(例如)

meld filename.{HEAD,branch,base}
Run Code Online (Sandbox Code Playgroud)

你将暂存那个(git add filename),然后提交merge(git commit).

  • Git Gotcha:`git merge --no-commit --no-ff`根本不会提交任何内容,请参阅下面的@ Brad-O答案.你必须包括`--no-ff` (7认同)
  • 想知道同样的事情格雷厄姆......我尝试做`git merge --no-commit branch`,它最终合并了它......我想要的是最终得到 3 个文件,或 2 个文件。我可以使用差异并将我想要的所有内容移到该文件中。 (2认同)

小智 38

最简单的方法是做git merge <other_branch然后git mergetool以图形方式解决冲突.有关如何设置mergetool的信息,请参阅#10935226.

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

Novelocrat提供了一个深入挖掘的好方法,但是你经常需要更改初始命令,git merge --no-commit --no-ff <other_branch>因为--no-commit实际上意味着"不要提交合并......除非它是快进合并." 对于很多想要完全按照自己的意愿行事的人来说,这有点像毒刺.

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

  • 10935226是这个问题的编号.在那里写你的意思是什么? (8认同)

Hug*_*ugh 29

根据这个要点,temp可能是现有的分支.

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


在主人:

git checkout -b temp
Run Code Online (Sandbox Code Playgroud)

在临时:

git merge --no-commit --no-ff refactor
Run Code Online (Sandbox Code Playgroud)

...哪个阶段,所以:

git reset HEAD
Run Code Online (Sandbox Code Playgroud)

然后开始添加你想要的部分:

git add --interactive
Run Code Online (Sandbox Code Playgroud)


taj*_*taj 22

从要合并的分支:

git checkout -p branch_to_merge --
Run Code Online (Sandbox Code Playgroud)

这不会检查branch_to_merge,但会让你以交互方式添加来自补丁(差异)的帅哥.

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

  • 这对于交互式合并来说非常容易使用 - 谢谢! (3认同)
  • 这正是我一直在寻找的。为什么这不是公认的答案? (2认同)
  • 此命令显示每个“块”(紧密分组的文件中的差异)以及用于使用或不使用它的“是”或“否”选项。很有用。 (2认同)
  • 对于您在分支上所做的所有操作以及不在主分支上所做的所有操作,都假定应将其删除。这不是最明智的合并策略。 (2认同)