xmedeko
xmedeko

Reputation: 7805

Git get theirs commit hash

When git working tree is in conflict state during merge/rebase/cherry-pick, it's possible to get ours/theirs/base version of individual files by several ways, e.g. git checkout --ours/--theirs path/file or git show :n:path/file where n is 1, 2 or 3, see e.g. Git: get ours/theirs file content during merge

However, I would like to get ours and theirs commit hashes (SHA). For ours it's simple: git rev-parse HEAD. But for theirs I have to try git rev-parse for preudorefs MERGE_HEAD, REBASE_HEAD, CHERRY_PICK_HEAD, REVERT_HEAD, ... (... is for maybe more pseudorefs? E.g. what pseudoref has stash pop conflict?). Is there any simple way to get theirs commit hash for all scenarios simply and reliably?

Upvotes: 2

Views: 84

Answers (1)

jthill
jthill

Reputation: 60235

Is there any simple way to get theirs commit hash for all scenarios simply and reliably?

There's no requirement that there be a commit hash for it. Git will already construct a base version from multiple merge bases resolving merges that have them, it's already common in some workflows to have a :1:$path revision that's referenced only in the index, that was constructed specially.

Also: anyone doing something Git doesn't already have a convenience command for can load the index arbitrarily (pretty much the same way the existing conveniences do) with git update-index --index-info or --cacheinfo or --info-only.

You could ls `git rev-parse --git-dir`/*_HEAD and ignore FETCH_HEAD to get all the _HEADs of commands that follow the existing naming convention, and walk through their content looking for a match.

path=example.c
pathrev=`git rev-parse :3:$path`
for head in `git rev-parse --git-dir`/*_HEAD
do if test x`git rev-parse ${head##*/}:$path 2>&-` = x$pathrev
then git rev-parse ${head##*/}
fi; done

will do it for existing commands.

Upvotes: 2

Related Questions