On Mon, Jun 11, 2018 at 06:06:11PM +0200, ch wrote: > After the rebase the 'stuff' branch only has a single commit even though I'd > expect there to be two according to the instructions that were passed to > git-rebase. It works as expected if there's either no merge-conflict at the > reword or if the conflicting commit is applied as 'pick'. > > I'm running git version 2.17.1.windows.2. I also tried native git version 2.7.4 > via WSL (running Ubuntu 16.04.4 LTS) and this version does not exhibit this > behavior. Thanks for a thorough report. I couldn't reproduce it on v2.17.1 on Linux, which makes me wonder if the issue is related to git-for-windows somehow. To the best of my knowledge (and a quick scan of "git diff" results) the code should be the same, though. I'm cc-ing Johannes, who is both the resident interactive-rebase expert _and_ the Git for Windows maintainer. Copious quoting below. -Peff -- >8 -- > Hi all! > > During a recent rebase operation on one of my repositories a number of commits > unexpectedly ended up getting squashed into other commits. After some > experiments it turned out that the 'reword' instruction seems to squash the > referenced commit into the preceding commit if there's a merge-conflict. > > Here's a small reproduction recipe to illustrate the behavior: > > 1. Create a small test repository using the following Bash script: > > ---- > function add_file() > { > echo "$1" > "$2" > git add "$2" > git commit -m "$3" > } > > git init . > > add_file "test" "file-1" "master" > > git checkout -b stuff > > add_file "aaa" "file-2" "feature_a" > add_file "bbb" "file-2" "fixup! feature_a" > add_file "ccc" "file-2" "fixup! feature_a" > > add_file "ddd" "file-2" "feature_b" > add_file "eee" "file-2" "fixup! feature_b" > add_file "fff" "file-2" "fixup! feature_b" > ---- > > 2. Run > > $ git rebase --autosquash --interactive --onto master master stuff > > to interactively rebase 'stuff' onto 'master'. This should generate the > following todo-stream: > > ---- > pick ... feature_a > fixup ... fixup! feature_a > fixup <hash_1> fixup! feature_a > pick <hash_2> feature_b > fixup ... fixup! feature_b > fixup ... fixup! feature_b > ---- > > 3. Remove the fixup line right before the second pick (i.e. 'fixup <hash_1>') > in order to enforce a merge-conflict later when applying commit <hash_2>. > > 4. Replace the second pick instruction (i.e. 'pick <hash_2>') with a reword. > > 5. Launch the rebase operation. It should fail at the 'reword <hash_2>' > instruction due to a merge-conflict. > > 6. Resolve the conflict by taking the remote-side (i.e. 'ddd'), add the > change to the index with git-add and run > > $ git rebase --continue > > This should spawn the commit message editor and after saving and quitting > the rebase should finish cleanly. > > After the rebase the 'stuff' branch only has a single commit even though I'd > expect there to be two according to the instructions that were passed to > git-rebase. It works as expected if there's either no merge-conflict at the > reword or if the conflicting commit is applied as 'pick'. > > I'm running git version 2.17.1.windows.2. I also tried native git version 2.7.4 > via WSL (running Ubuntu 16.04.4 LTS) and this version does not exhibit this > behavior. > > - ch