From 88d5072466de2e0ba256a283eaaa6a79e31735a5 Mon Sep 17 00:00:00 2001 From: Paul Tan Date: Sat, 6 Jun 2015 19:46:07 +0800 Subject: am --skip: revert changes introduced by failed 3way merge Even when a merge conflict occurs with am --3way, the index will be modified with the results of any succesfully merged files (such as a new file). These changes to the index will not be reverted with a "git read-tree --reset -u HEAD HEAD", as git read-tree will not be aware of how the current index differs from HEAD. To fix this, we first reset any conflicting entries from the index. The resulting index will contain the results of successfully merged files. We write the index to a tree, then use git read-tree -m to fast-forward the "index tree" back to HEAD, thus undoing all the changes from the failed merge. Signed-off-by: Paul Tan Signed-off-by: Junio C Hamano --- git-am.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'git-am.sh') diff --git a/git-am.sh b/git-am.sh index ee61a77d7..80a7fdbd2 100755 --- a/git-am.sh +++ b/git-am.sh @@ -68,6 +68,8 @@ then cmdline="$cmdline -3" fi +empty_tree=4b825dc642cb6eb9a060e54bf8d69288fbee4904 + sq () { git rev-parse --sq-quote "$@" } @@ -492,7 +494,10 @@ then ;; t,) git rerere clear - git read-tree --reset -u HEAD HEAD + head_tree=$(git rev-parse --verify -q HEAD || echo $empty_tree) && + git read-tree --reset -u $head_tree $head_tree && + index_tree=$(git write-tree) && + git read-tree -m -u $index_tree $head_tree orig_head=$(cat "$GIT_DIR/ORIG_HEAD") git reset HEAD git update-ref ORIG_HEAD $orig_head -- cgit v1.2.1