git-merge tools

MELD

1. 安装 meld 

$ sudo apt-get install meld

2. 添加 difftool 和 mergetool 为 meld

 $ git config --global diff.tool meld
 $ git config --global merge.tool meld

3. 使用下面命令测试,可以一个一个文件比较

 $ git diffall HEAD HEAD^1 

4.  为能全部比较,需要下载牛人写的脚本

#!/bin/sh
# Copyright 2010 - 2012, Tim Henigan <tim.henigan@gmail.com>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


# Perform a directory diff between commits in the repository using
# the external diff or merge tool specified in the user's config.

USAGE='[--cached] [--copy-back] [-x|--extcmd=<command>] <commit>{0,2} [-- <path>*]

    --cached     Compare to the index rather than the working tree.

    --copy-back  Copy files back to the working tree when the diff
                 tool exits (in case they were modified by the
                 user).  This option is only valid if the diff
                 compared with the working tree.

    -x=<command>
    --extcmd=<command>  Specify a custom command for viewing diffs.
                 git-diffall ignores the configured defaults and
                 runs $command $LOCAL $REMOTE when this option is
                 specified. Additionally, $BASE is set in the
                 environment.
'

SUBDIRECTORY_OK=1
. "$(git --exec-path)/git-sh-setup"

TOOL_MODE=diff
. "$(git --exec-path)/git-mergetool--lib"

merge_tool="$(get_merge_tool)"
if test -z "$merge_tool"
then
        echo "Error: Either the 'diff.tool' or 'merge.tool' option must be set."
        usage
fi

start_dir=$(pwd)

# All the file paths returned by the diff command are relative to the root
# of the working copy. So if the script is called from a subdirectory, it
# must switch to the root of working copy before trying to use those paths.
cdup=$(git rev-parse --show-cdup) &&
cd "$cdup" || {
        echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
        exit 1
}

# set up temp dir
tmp=$(perl -e 'use File::Temp qw(tempdir);
        $t=tempdir("/tmp/git-diffall.XXXXX") or exit(1);
        print $t') || exit 1
trap 'rm -rf "$tmp"' EXIT

left=
right=
paths=
dashdash_seen=
compare_staged=
merge_base=
left_dir=
right_dir=
diff_tool=
copy_back=

while test $# != 0
do
        case "$1" in
        -h|--h|--he|--hel|--help)
                usage
                ;;
        --cached)
                compare_staged=1
                ;;
        --copy-back)
                copy_back=1
                ;;
        -x|--e|--ex|--ext|--extc|--extcm|--extcmd)
                if test $# = 1
                then
                        echo You must specify the tool for use with --extcmd
                        usage
                else
                        diff_tool=$2
                        shift
                fi
                ;;
        --)
                dashdash_seen=1
                ;;
        -*)
                echo Invalid option: "$1"
                usage
                ;;
        *)
                # could be commit, commit range or path limiter
                case "$1" in
                *...*)
                        left=${1%...*}
                        right=${1#*...}
                        merge_base=1
                        ;;
                *..*)
                        left=${1%..*}
                        right=${1#*..}
                        ;;
                *)
                        if test -n "$dashdash_seen"
                        then
                                paths="$paths$1 "
                        elif test -z "$left"
                        then
                                left=$1
                        elif test -z "$right"
                        then
                                right=$1
                        else
                                paths="$paths$1 "
                        fi
                        ;;
                esac
                ;;
        esac
        shift
done

# Determine the set of files which changed
if test -n "$left" && test -n "$right"
then
        left_dir="cmt-$(git rev-parse --short $left)"
        right_dir="cmt-$(git rev-parse --short $right)"

        if test -n "$compare_staged"
        then
                usage
        elif test -n "$merge_base"
        then
                git diff --name-only "$left"..."$right" -- $paths >"$tmp/filelist"
        else
                git diff --name-only "$left" "$right" -- $paths >"$tmp/filelist"
        fi
elif test -n "$left"
then
        left_dir="cmt-$(git rev-parse --short $left)"

        if test -n "$compare_staged"
        then
                right_dir="staged"
                git diff --name-only --cached "$left" -- $paths >"$tmp/filelist"
        else
                right_dir="working_tree"
                git diff --name-only "$left" -- $paths >"$tmp/filelist"
        fi
else
        left_dir="HEAD"

        if test -n "$compare_staged"
        then
                right_dir="staged"
                git diff --name-only --cached -- $paths >"$tmp/filelist"
        else
                right_dir="working_tree"
                git diff --name-only -- $paths >"$tmp/filelist"
        fi
fi

# Exit immediately if there are no diffs
if test ! -s "$tmp/filelist"
then
        exit 0
fi

if test -n "$copy_back" && test "$right_dir" != "working_tree"
then
        echo "--copy-back is only valid when diff includes the working tree."
        exit 1
fi

# Create the named tmp directories that will hold the files to be compared
mkdir -p "$tmp/$left_dir" "$tmp/$right_dir"

# Populate the tmp/right_dir directory with the files to be compared
while read name
do
        if test -n "$right"
        then
                ls_list=$(git ls-tree $right "$name")
                if test -n "$ls_list"
                then
                        mkdir -p "$tmp/$right_dir/$(dirname "$name")"
                        git show "$right":"$name" >"$tmp/$right_dir/$name" || true
                fi
        elif test -n "$compare_staged"
        then
                ls_list=$(git ls-files -- "$name")
                if test -n "$ls_list"
                then
                        mkdir -p "$tmp/$right_dir/$(dirname "$name")"
                        git show :"$name" >"$tmp/$right_dir/$name"
                fi
        else
                if test -e "$name"
                then
                        mkdir -p "$tmp/$right_dir/$(dirname "$name")"
                        cp "$name" "$tmp/$right_dir/$name"
                fi
        fi
done < "$tmp/filelist"

# Populate the tmp/left_dir directory with the files to be compared
while read name
do
        if test -n "$left"
        then
                ls_list=$(git ls-tree $left "$name")
                if test -n "$ls_list"
                then
                        mkdir -p "$tmp/$left_dir/$(dirname "$name")"
                        git show "$left":"$name" >"$tmp/$left_dir/$name" || true
                fi
        else
                if test -n "$compare_staged"
                then
                        ls_list=$(git ls-tree HEAD "$name")
                        if test -n "$ls_list"
                        then
                                mkdir -p "$tmp/$left_dir/$(dirname "$name")"
                                git show HEAD:"$name" >"$tmp/$left_dir/$name"
                        fi
                else
                        mkdir -p "$tmp/$left_dir/$(dirname "$name")"
                        git show :"$name" >"$tmp/$left_dir/$name"
                fi
        fi
done < "$tmp/filelist"

LOCAL="$tmp/$left_dir"
REMOTE="$tmp/$right_dir"

if test -n "$diff_tool"
then
        export BASE
        eval $diff_tool '"$LOCAL"' '"$REMOTE"'
else
        run_merge_tool "$merge_tool" false
fi

# Copy files back to the working dir, if requested
if test -n "$copy_back" && test "$right_dir" = "working_tree"
then
        cd "$start_dir"
        git_top_dir=$(git rev-parse --show-toplevel)
        find "$tmp/$right_dir" -type f |
        while read file
        do
                cp "$file" "$git_top_dir/${file#$tmp/$right_dir/}"
        done
fi

5.  重新配置

$ git config --global diff.tool meld
$ git config –global alias.diffall git-diffall (git-diffall  为该脚本文件名称)

$ sudo cp git-diffall /bin

6. 再次测试【OK】

 $ git diffall HEAD HEAD^1 

7. Reference

   1. 配置方法

   2. 脚本文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值