如何配置git mergetool配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何配置git mergetool配置相关的知识,希望对你有一定的参考价值。

参考技术A   先来说说
git
所保存的对象。对于
git
来说,
commits
,文件,
branches
都是一些对象。
commits
保存的是一些文本文件之间
diff
(只对文本文件来说)。所谓的
merge
就是把那些
diff
在某些
commit
点上面重播(
replay)一次。
  可是
git

merge
没有直接
merge
一系列
commits
的功能。对于一个
commit
,我们可以使用
cherry-pick
来把那个
commit
replay
到其它
commit
点上面。对于一系列的
commit
,这样做很麻烦,假如发生冲突麻烦更加大,你必须记住在
replay
到哪个
commit
的时候发生冲突,解决完之后还必须到跳过那个
commit
继续
cherry-pick。
  git

rebase
能达到此目的。它和
merge
的不同之处在于
merge
是在历史记录分开的时候那个点开始重播的,而rebase
是保存好在
upstream
没有的
commits
,然后把那些
commits
重播在新的
base
点上。
  假设要把
branches
A

commit
c-d
(从
a-f

merge

branch
B
有两种方法:
  方法一:首先用从
A
创建新的分支
A1
,用
branch
–f
d
去除
commit
e
f
,然后用
rebase
去除
commit
a

b(详情见
rebase
--help
)。然后把
branch
B
rebase

branch
A1

  方法二:首先从
A
创建新的分支
A1
,用
branch
–f
d
去除
commit
e
f
。然后用
rebase
–onto
B
b
A1

A1“嫁接”(
transplant
)到
B
上。
  方法一方法二的区别在于
c-d
应用的位置不同,方法一会出现在
B
的最前面;方法二相反。

使用 Sublimerge 配置 git mergetool

【中文标题】使用 Sublimerge 配置 git mergetool【英文标题】:Configure git mergetool with Sublimerge 【发布时间】:2014-07-20 13:42:54 【问题描述】:

我配置了我的 git 来解决与 Sublimerge 的合并冲突。 为此,我被跑了:

git config --global merge.tool sublimerge

git config --global mergetool.sublimerge.cmd 'subl -n --wait \"$REMOTE\" \"$BASE\"   \"$LOCAL\" \"$MERGED\" --command \"sublimerge_diff_views\"'

git config --global mergetool.sublimerge.trustExitCode 'false'

git config --global diff.tool sublimerge

git config --global difftool.sublimerge.cmd 'subl -n --wait \"$REMOTE\" \"$LOCAL\" --command \"sublimerge_diff_views \\\"left_read_only\\\": true, \\\"right_read_only\\\": true\"'

当我运行 git mergetool 时,Sublime 将打开四列:.remote、.base、.local 和当前文件。但是,所有列都是空的。

并且所有列名的文件扩展名后都有一个“,例如:file.php.REMOTE.44625.php”、file.php.BASE.44625.php“、file.php.LOCAL.44625.php”和file.php”。然后我无法编辑冲突。

谁能帮帮我?

【问题讨论】:

***.com/q/19297084/6309 的答案之一会有帮助吗? @VonC,不...我已经看到了这个答案。 它是否有效git difftool?崇高的文本控制台(ctrl`)中有什么吗?大概你正在使用 linux/mac?你在全局配置文件 ~/.gitconfig 中得到了什么? 使用 Git 2.22(2019 年第二季度,五年后),git config --global merge.tool smerge 就足够了。见my answer below。 【参考方案1】:

在你的 ~/.gitconfig 中添加以下内容

[merge]
tool = sublimerge

[mergetool "sublimerge"]
cmd = subl -n --wait \"$REMOTE\" \"$BASE\" \"$LOCAL\" \"$MERGED\" --command \"sublimerge_diff_views\"
trustExitCode = false

[diff]
tool = sublimerge

[difftool "sublimerge"]
cmd = subl -n --wait \"$REMOTE\" \"$LOCAL\" --command \"sublimerge_diff_views \\\"left_read_only\\\": true, \\\"right_read_only\\\": true\"

【讨论】:

这对我有用,在命令 $> git difftool 并回答提示 Y/n 之后。【参考方案2】:

添加 git 合并工具作为 sublime 编辑器后,然后验证 ~/.gitconfig 文件。

$git config --list

user.email=xyz@live.com
user.name=xyz
color.ui=true
color.status=auto
color.branch=auto
push.default=matching
branch.autosetuprebase=always
core.editor=subl -n -w
merge.tool=sublimerge
mergetool.sublimerge.cmd=subl -n --wait \"$REMOTE\" \"$BASE\"   \"$LOCAL\" \"$MERGED\" --command \"sublimerge_diff_views\"
mergetool.sublimerge.trustexitcode=false
diff.tool=sublimerge
difftool.sublimerge.cmd=subl -n --wait \"$REMOTE\" \"$LOCAL\" --command \"sublimerge_diff_views \\\"left_read_only\\\": true, \\\"right_read_only\\\": true\"

如果没有反映则手动添加合并工具详情

$vim ~/.gitconfig

[core]
        editor = subl -n -w
[merge]
        tool = sublimerge
[mergetool "sublimerge"]
        cmd = subl -n --wait \\\"$REMOTE\\\" \\\"$BASE\\\"   \\\"$LOCAL\\\" \\\"$MERGED\\\" --command \\\"sublimerge_diff_views\\\"
        trustExitCode = false
[diff]
        tool = sublimerge
[difftool "sublimerge"]
        cmd = subl -n --wait \\\"$REMOTE\\\" \\\"$LOCAL\\\" --command \\\"sublimerge_diff_views \\\\\\\"left_read_only\\\\\\\": true, \\\\\\\"right_read_only\\\\\\\": true\\\"

【讨论】:

以上是关于如何配置git mergetool配置的主要内容,如果未能解决你的问题,请参考以下文章

apache_conf 将DiffMerge配置为默认git mergetool

使用 IntelliJ 作为 git mergetool 总是一启动就退出

合并工具应如何指示合并成功?

Git gitconfig 配置

02_创建Git仓库,克隆仓库,git add,git commit,git push,git pull,同行冲突,不同行冲突的结局方案,git mergetool的使用

Kdiff3 不会用 mergetool 命令打开