⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢠⣴⣿⣿⣿⣷⣼⣿⠀⣴⠾⠷⠶⠦⡄⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⢠⡤⢶⣦⣾⣿⣿⣿⣿⣿⣿⣿⠀⣿⣶⣶⣦⣄⠳⣤⣤⠄⠀⠀⠀ ⠀⠀⠀⢀⣼⣳⡿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣶⣿⣿⣗⠈⠙⠻⣶⣄⡀⠀⠀⠀ ⠀⠀⠀⣰⠿⠁⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠈⠳⣤⠀⠀ ⠀⠀⢀⡟⠀⢰⣿⠟⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⠉⠁⠈⠻⣶⣄⠀⠀⠈⠛⢦ ⠀⣀⡼⠃⠀⣼⡟⠀⠀⢸⣿⡿⠉⣿⡿⠿⠛⣿⡄⠀⠀⠀⠙⠿⣆⠀⠀⠀⠈ ⠈⠁⠀⠀⢸⡟⠀⠀⠀⢸⣿⠀⠀⣿⠁⠀⠀⠈⠃⠀⠀⠀⠀⠀⠘⢷⡄⠀⠀ ⠀⠀⠀⠀⣼⠃⠀⠀⠀⢸⡟⠀⠀⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⡆⠀ ⠀⠀⠀⣠⡏⠀⠀⠀⠀⣼⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠻⠃⠀⠀⠀⠀⣻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ Current Dir: /usr/libexec/git-core/ [DIR] mergetools [ delete | rename ] [FILE] git [ edit | delete | rename | download ] [FILE] git-add [ edit | delete | rename | download ] [FILE] git-add--interactive [ edit | delete | rename | download ] [FILE] git-am [ edit | delete | rename | download ] [FILE] git-annotate [ edit | delete | rename | download ] [FILE] git-apply [ edit | delete | rename | download ] [FILE] git-archive [ edit | delete | rename | download ] [FILE] git-bisect [ edit | delete | rename | download ] [FILE] git-bisect--helper [ edit | delete | rename | download ] [FILE] git-blame [ edit | delete | rename | download ] [FILE] git-branch [ edit | delete | rename | download ] [FILE] git-bundle [ edit | delete | rename | download ] [FILE] git-cat-file [ edit | delete | rename | download ] [FILE] git-check-attr [ edit | delete | rename | download ] [FILE] git-check-ignore [ edit | delete | rename | download ] [FILE] git-check-ref-format [ edit | delete | rename | download ] [FILE] git-checkout [ edit | delete | rename | download ] [FILE] git-checkout-index [ edit | delete | rename | download ] [FILE] git-cherry [ edit | delete | rename | download ] [FILE] git-cherry-pick [ edit | delete | rename | download ] [FILE] git-clean [ edit | delete | rename | download ] [FILE] git-clone [ edit | delete | rename | download ] [FILE] git-column [ edit | delete | rename | download ] [FILE] git-commit [ edit | delete | rename | download ] [FILE] git-commit-tree [ edit | delete | rename | download ] [FILE] git-config [ edit | delete | rename | download ] [FILE] git-count-objects [ edit | delete | rename | download ] [FILE] git-credential [ edit | delete | rename | download ] [FILE] git-credential-cache [ edit | delete | rename | download ] [FILE] git-credential-cache--daemon [ edit | delete | rename | download ] [FILE] git-credential-store [ edit | delete | rename | download ] [FILE] git-describe [ edit | delete | rename | download ] [FILE] git-diff [ edit | delete | rename | download ] [FILE] git-diff-files [ edit | delete | rename | download ] [FILE] git-diff-index [ edit | delete | rename | download ] [FILE] git-diff-tree [ edit | delete | rename | download ] [FILE] git-difftool [ edit | delete | rename | download ] [FILE] git-difftool--helper [ edit | delete | rename | download ] [FILE] git-fast-export [ edit | delete | rename | download ] [FILE] git-fast-import [ edit | delete | rename | download ] [FILE] git-fetch [ edit | delete | rename | download ] [FILE] git-fetch-pack [ edit | delete | rename | download ] [FILE] git-filter-branch [ edit | delete | rename | download ] [FILE] git-fmt-merge-msg [ edit | delete | rename | download ] [FILE] git-for-each-ref [ edit | delete | rename | download ] [FILE] git-format-patch [ edit | delete | rename | download ] [FILE] git-fsck [ edit | delete | rename | download ] [FILE] git-fsck-objects [ edit | delete | rename | download ] [FILE] git-gc [ edit | delete | rename | download ] [FILE] git-get-tar-commit-id [ edit | delete | rename | download ] [FILE] git-grep [ edit | delete | rename | download ] [FILE] git-hash-object [ edit | delete | rename | download ] [FILE] git-help [ edit | delete | rename | download ] [FILE] git-http-backend [ edit | delete | rename | download ] [FILE] git-http-fetch [ edit | delete | rename | download ] [FILE] git-http-push [ edit | delete | rename | download ] [FILE] git-imap-send [ edit | delete | rename | download ] [FILE] git-index-pack [ edit | delete | rename | download ] [FILE] git-init [ edit | delete | rename | download ] [FILE] git-init-db [ edit | delete | rename | download ] [FILE] git-log [ edit | delete | rename | download ] [FILE] git-lost-found [ edit | delete | rename | download ] [FILE] git-ls-files [ edit | delete | rename | download ] [FILE] git-ls-remote [ edit | delete | rename | download ] [FILE] git-ls-tree [ edit | delete | rename | download ] [FILE] git-mailinfo [ edit | delete | rename | download ] [FILE] git-mailsplit [ edit | delete | rename | download ] [FILE] git-merge [ edit | delete | rename | download ] [FILE] git-merge-base [ edit | delete | rename | download ] [FILE] git-merge-file [ edit | delete | rename | download ] [FILE] git-merge-index [ edit | delete | rename | download ] [FILE] git-merge-octopus [ edit | delete | rename | download ] [FILE] git-merge-one-file [ edit | delete | rename | download ] [FILE] git-merge-ours [ edit | delete | rename | download ] [FILE] git-merge-recursive [ edit | delete | rename | download ] [FILE] git-merge-resolve [ edit | delete | rename | download ] [FILE] git-merge-subtree [ edit | delete | rename | download ] [FILE] git-merge-tree [ edit | delete | rename | download ] [FILE] git-mergetool [ edit | delete | rename | download ] [FILE] git-mergetool--lib [ edit | delete | rename | download ] [FILE] git-mktag [ edit | delete | rename | download ] [FILE] git-mktree [ edit | delete | rename | download ] [FILE] git-mv [ edit | delete | rename | download ] [FILE] git-name-rev [ edit | delete | rename | download ] [FILE] git-notes [ edit | delete | rename | download ] [FILE] git-pack-objects [ edit | delete | rename | download ] [FILE] git-pack-redundant [ edit | delete | rename | download ] [FILE] git-pack-refs [ edit | delete | rename | download ] [FILE] git-parse-remote [ edit | delete | rename | download ] [FILE] git-patch-id [ edit | delete | rename | download ] [FILE] git-peek-remote [ edit | delete | rename | download ] [FILE] git-prune [ edit | delete | rename | download ] [FILE] git-prune-packed [ edit | delete | rename | download ] [FILE] git-pull [ edit | delete | rename | download ] [FILE] git-push [ edit | delete | rename | download ] [FILE] git-quiltimport [ edit | delete | rename | download ] [FILE] git-read-tree [ edit | delete | rename | download ] [FILE] git-rebase [ edit | delete | rename | download ] [FILE] git-rebase--am [ edit | delete | rename | download ] [FILE] git-rebase--interactive [ edit | delete | rename | download ] [FILE] git-rebase--merge [ edit | delete | rename | download ] [FILE] git-receive-pack [ edit | delete | rename | download ] [FILE] git-reflog [ edit | delete | rename | download ] [FILE] git-relink [ edit | delete | rename | download ] [FILE] git-remote [ edit | delete | rename | download ] [FILE] git-remote-ext [ edit | delete | rename | download ] [FILE] git-remote-fd [ edit | delete | rename | download ] [FILE] git-remote-ftp [ edit | delete | rename | download ] [FILE] git-remote-ftps [ edit | delete | rename | download ] [FILE] git-remote-http [ edit | delete | rename | download ] [FILE] git-remote-https [ edit | delete | rename | download ] [FILE] git-remote-testpy [ edit | delete | rename | download ] [FILE] git-repack [ edit | delete | rename | download ] [FILE] git-replace [ edit | delete | rename | download ] [FILE] git-repo-config [ edit | delete | rename | download ] [FILE] git-request-pull [ edit | delete | rename | download ] [FILE] git-rerere [ edit | delete | rename | download ] [FILE] git-reset [ edit | delete | rename | download ] [FILE] git-rev-list [ edit | delete | rename | download ] [FILE] git-rev-parse [ edit | delete | rename | download ] [FILE] git-revert [ edit | delete | rename | download ] [FILE] git-rm [ edit | delete | rename | download ] [FILE] git-send-pack [ edit | delete | rename | download ] [FILE] git-sh-i18n [ edit | delete | rename | download ] [FILE] git-sh-i18n--envsubst [ edit | delete | rename | download ] [FILE] git-sh-setup [ edit | delete | rename | download ] [FILE] git-shell [ edit | delete | rename | download ] [FILE] git-shortlog [ edit | delete | rename | download ] [FILE] git-show [ edit | delete | rename | download ] [FILE] git-show-branch [ edit | delete | rename | download ] [FILE] git-show-index [ edit | delete | rename | download ] [FILE] git-show-ref [ edit | delete | rename | download ] [FILE] git-stage [ edit | delete | rename | download ] [FILE] git-stash [ edit | delete | rename | download ] [FILE] git-status [ edit | delete | rename | download ] [FILE] git-stripspace [ edit | delete | rename | download ] [FILE] git-submodule [ edit | delete | rename | download ] [FILE] git-submodule--helper [ edit | delete | rename | download ] [FILE] git-subtree [ edit | delete | rename | download ] [FILE] git-symbolic-ref [ edit | delete | rename | download ] [FILE] git-tag [ edit | delete | rename | download ] [FILE] git-tar-tree [ edit | delete | rename | download ] [FILE] git-unpack-file [ edit | delete | rename | download ] [FILE] git-unpack-objects [ edit | delete | rename | download ] [FILE] git-update-index [ edit | delete | rename | download ] [FILE] git-update-ref [ edit | delete | rename | download ] [FILE] git-update-server-info [ edit | delete | rename | download ] [FILE] git-upload-archive [ edit | delete | rename | download ] [FILE] git-upload-pack [ edit | delete | rename | download ] [FILE] git-var [ edit | delete | rename | download ] [FILE] git-verify-pack [ edit | delete | rename | download ] [FILE] git-verify-tag [ edit | delete | rename | download ] [FILE] git-web--browse [ edit | delete | rename | download ] [FILE] git-whatchanged [ edit | delete | rename | download ] [FILE] git-write-tree [ edit | delete | rename | download ] Viewing: /usr/libexec/git-core/git-mergetool #!/bin/sh # # This program resolves merge conflicts in git # # Copyright (c) 2006 Theodore Y. Ts'o # # This file is licensed under the GPL v2, or a later version # at the discretion of Junio C Hamano. # USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [file to merge] ...' SUBDIRECTORY_OK=Yes OPTIONS_SPEC= TOOL_MODE=merge . git-sh-setup . git-mergetool--lib require_work_tree # Returns true if the mode reflects a symlink is_symlink () { test "$1" = 120000 } is_submodule () { test "$1" = 160000 } local_present () { test -n "$local_mode" } remote_present () { test -n "$remote_mode" } base_present () { test -n "$base_mode" } cleanup_temp_files () { if test "$1" = --save-backup then rm -rf -- "$MERGED.orig" test -e "$BACKUP" && mv -- "$BACKUP" "$MERGED.orig" rm -f -- "$LOCAL" "$REMOTE" "$BASE" else rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP" fi } describe_file () { mode="$1" branch="$2" file="$3" printf " {%s}: " "$branch" if test -z "$mode" then echo "deleted" elif is_symlink "$mode" then echo "a symbolic link -> '$(cat "$file")'" elif is_submodule "$mode" then echo "submodule commit $file" elif base_present then echo "modified file" else echo "created file" fi } resolve_symlink_merge () { while true do printf "Use (l)ocal or (r)emote, or (a)bort? " read ans || return 1 case "$ans" in [lL]*) git checkout-index -f --stage=2 -- "$MERGED" git add -- "$MERGED" cleanup_temp_files --save-backup return 0 ;; [rR]*) git checkout-index -f --stage=3 -- "$MERGED" git add -- "$MERGED" cleanup_temp_files --save-backup return 0 ;; [aA]*) return 1 ;; esac done } resolve_deleted_merge () { while true do if base_present then printf "Use (m)odified or (d)eleted file, or (a)bort? " else printf "Use (c)reated or (d)eleted file, or (a)bort? " fi read ans || return 1 case "$ans" in [mMcC]*) git add -- "$MERGED" cleanup_temp_files --save-backup return 0 ;; [dD]*) git rm -- "$MERGED" > /dev/null cleanup_temp_files return 0 ;; [aA]*) return 1 ;; esac done } resolve_submodule_merge () { while true do printf "Use (l)ocal or (r)emote, or (a)bort? " read ans || return 1 case "$ans" in [lL]*) if ! local_present then if test -n "$(git ls-tree HEAD -- "$MERGED")" then # Local isn't present, but it's a subdirectory git ls-tree --full-name -r HEAD -- "$MERGED" | git update-index --index-info || exit $? else test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" git update-index --force-remove "$MERGED" cleanup_temp_files --save-backup fi elif is_submodule "$local_mode" then stage_submodule "$MERGED" "$local_sha1" else git checkout-index -f --stage=2 -- "$MERGED" git add -- "$MERGED" fi return 0 ;; [rR]*) if ! remote_present then if test -n "$(git ls-tree MERGE_HEAD -- "$MERGED")" then # Remote isn't present, but it's a subdirectory git ls-tree --full-name -r MERGE_HEAD -- "$MERGED" | git update-index --index-info || exit $? else test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" git update-index --force-remove "$MERGED" fi elif is_submodule "$remote_mode" then ! is_submodule "$local_mode" && test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" stage_submodule "$MERGED" "$remote_sha1" else test -e "$MERGED" && mv -- "$MERGED" "$BACKUP" git checkout-index -f --stage=3 -- "$MERGED" git add -- "$MERGED" fi cleanup_temp_files --save-backup return 0 ;; [aA]*) return 1 ;; esac done } stage_submodule () { path="$1" submodule_sha1="$2" mkdir -p "$path" || die "fatal: unable to create directory for module at $path" # Find $path relative to work tree work_tree_root=$(cd_to_toplevel && pwd) work_rel_path=$(cd "$path" && GIT_WORK_TREE="${work_tree_root}" git rev-parse --show-prefix ) test -n "$work_rel_path" || die "fatal: unable to get path of module $path relative to work tree" git update-index --add --replace --cacheinfo 160000 "$submodule_sha1" "${work_rel_path%/}" || die } checkout_staged_file () { tmpfile=$(expr \ "$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \ : '\([^ ]*\) ') if test $? -eq 0 -a -n "$tmpfile" then mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3" else >"$3" fi } merge_file () { MERGED="$1" f=$(git ls-files -u -- "$MERGED") if test -z "$f" then if test ! -f "$MERGED" then echo "$MERGED: file not found" else echo "$MERGED: file does not need merging" fi return 1 fi ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')" BACKUP="./$MERGED.BACKUP.$ext" LOCAL="./$MERGED.LOCAL.$ext" REMOTE="./$MERGED.REMOTE.$ext" BASE="./$MERGED.BASE.$ext" base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}') local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}') remote_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}') if is_submodule "$local_mode" || is_submodule "$remote_mode" then echo "Submodule merge conflict for '$MERGED':" local_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $2;}') remote_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $2;}') describe_file "$local_mode" "local" "$local_sha1" describe_file "$remote_mode" "remote" "$remote_sha1" resolve_submodule_merge return fi mv -- "$MERGED" "$BACKUP" cp -- "$BACKUP" "$MERGED" checkout_staged_file 1 "$MERGED" "$BASE" checkout_staged_file 2 "$MERGED" "$LOCAL" checkout_staged_file 3 "$MERGED" "$REMOTE" if test -z "$local_mode" -o -z "$remote_mode" then echo "Deleted merge conflict for '$MERGED':" describe_file "$local_mode" "local" "$LOCAL" describe_file "$remote_mode" "remote" "$REMOTE" resolve_deleted_merge return fi if is_symlink "$local_mode" || is_symlink "$remote_mode" then echo "Symbolic link merge conflict for '$MERGED':" describe_file "$local_mode" "local" "$LOCAL" describe_file "$remote_mode" "remote" "$REMOTE" resolve_symlink_merge return fi echo "Normal merge conflict for '$MERGED':" describe_file "$local_mode" "local" "$LOCAL" describe_file "$remote_mode" "remote" "$REMOTE" if "$prompt" = true then printf "Hit return to start merge resolution tool (%s): " "$merge_tool" read ans || return 1 fi if base_present then present=true else present=false fi if ! run_merge_tool "$merge_tool" "$present" then echo "merge of $MERGED failed" 1>&2 mv -- "$BACKUP" "$MERGED" if test "$merge_keep_temporaries" = "false" then cleanup_temp_files fi return 1 fi if test "$merge_keep_backup" = "true" then mv -- "$BACKUP" "$MERGED.orig" else rm -- "$BACKUP" fi git add -- "$MERGED" cleanup_temp_files return 0 } prompt=$(git config --bool mergetool.prompt || echo true) while test $# != 0 do case "$1" in --tool-help) show_tool_help ;; -t|--tool*) case "$#,$1" in *,*=*) merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)') ;; 1,*) usage ;; *) merge_tool="$2" shift ;; esac ;; -y|--no-prompt) prompt=false ;; --prompt) prompt=true ;; --) shift break ;; -*) usage ;; *) break ;; esac shift done prompt_after_failed_merge () { while true do printf "Continue merging other unresolved paths (y/n) ? " read ans || return 1 case "$ans" in [yY]*) return 0 ;; [nN]*) return 1 ;; esac done } if test -z "$merge_tool" then merge_tool=$(get_merge_tool "$merge_tool") || exit fi merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)" merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)" last_status=0 rollup_status=0 files= if test $# -eq 0 then cd_to_toplevel if test -e "$GIT_DIR/MERGE_RR" then files=$(git rerere remaining) else files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u) fi else files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]* //' | sort -u) fi if test -z "$files" then echo "No files need merging" exit 0 fi printf "Merging:\n" printf "%s\n" "$files" IFS=' ' for i in $files do if test $last_status -ne 0 then prompt_after_failed_merge || exit 1 fi printf "\n" merge_file "$i" last_status=$? if test $last_status -ne 0 then rollup_status=1 fi done exit $rollup_status