From Electron Cloud
Jump to: navigation, search

Easier merging when you know you always want "mine" or "theirs"

(Disclaimer: there could very well be a more elegant way which I don't know about; feel free to email if you know of one)

cp can be added as a "merge tool" which you can use selectively to accept one side or the other of merge conflicts automatically, without having to run a visual diff. (But it's a good idea to run visual diff or regular diff first to make sure whether you want the "local" or "remote" version!) Seems that so far in such cases I always want the "remote" version (in other words, the second version in the diff, or the non-HEAD version), so I just add cp in that direction as a "merge tool":

git config --global mergetool.accept-remote.cmd 'cp $REMOTE $MERGED'
git config --global mergetool.accept-remote.trustExitCode true

Usage:

git mergetool --tool=accept-remote [file ...]

and it will interact with you, something like this:

# git mergetool --tool=accept-remote
Merging:
file1.c
file2.h

Normal merge conflict for 'file1.c':
  {local}: modified
  {remote}: modified
Hit return to start merge resolution tool (accept-remote): 

...

and so on for each file to be merged.

lsgit

lsgit is a script to list subdirectories which are git repositories, recursively, along with the branch or SHA1 of each. It depends on /etc/bash_completion.d/git though for the __git_ps1 function. (It would be better if I would find out the porcelain commands for that if possible, but I didn't.) At least it's working on Linux and OSX (with git installed via brew).

#!/bin/bash
if [ -f /usr/share/git/git-prompt.sh ]
then
	source /usr/share/git/git-prompt.sh
fi
if [ -f /etc/bash_completion.d/git ]
then
	source /etc/bash_completion.d/git
fi
if [ -f /usr/local/etc/bash_completion.d/git-prompt.sh ]
then
	source /usr/local/etc/bash_completion.d/git-prompt.sh
fi
for d in `/usr/bin/find . -name '.git' | sort`
do
	repopath=`dirname ${d}`
	pushd ${repopath} > /dev/null
	echo -e "$repopath \033[60G\033[33m `__git_ps1 %s` \033[0m"
	if [ "$1" == '-v' ]; then
		git status -uno
	fi
	popd > /dev/null
done

I see that someone else had the same idea, but it's in perl and depends on the locate database. Not that there's anything wrong with that as long as you keep it updated, which takes some fiddling on OSX; and I also get an error about not having a -r option to locate.