If a branch moves a submodule, "merge --ff[-only]" succeeds while "merge --no-ff" fails with conflicts
- From
Dakota Hawkins <dakotahawkins@gmail.com>
- Date
- Sep 2, 2016, 19:22 UTC
- Message-ID
- <CAG0BQX=wvpkJ=PQWV-NbmhuPV8yzvd_KYKzJmsfWq9xStZ2bnQ@mail.gmail.com>
Below is a simple reproduction of the issue.
The _real_ problem is that this is how our pull request merges work, they're not allowed to do fast-forward merges. To work around this we are having to split this up into two pull requests/merges: One that copies the submodules to the new location and includes any fixes required to support the move, and a second that removes the old locations.
## Setup steps
git clone https://github.com/dakotahawkins/submodule-move-merge-bug-main-repo.git
cd submodule-move-merge-bug-main-repo
## How it was initially constructed
# git submodule add ../submodule-move-merge-bug-submodule-repo.git
./submodule-location-1
# git commit -m "Added submodule in its initial location"
# git push
# git checkout -b move-submodule
# git mv ./submodule-location-1 ./submodule-location-2
# git commit -m "Moved submodule"
# git push --set-upstream origin move-submodule
git branch move-submodule origin/move-submodule## Test fast-forward merge, this will work git checkout -b merge-ff-test master # warning: unable to rmdir submodule-location-2: Directory not empty rm -rf ./submodule-location-2 git merge --ff-only move-submodule
## Test no-fast-forward merge, this will fail with conflicts:
git checkout -b merge-no-ff-test master
git merge --no-ff move-submodule
# Auto-merging submodule-location-2
# Adding as submodule-location-2~move-submodule instead
# Automatic merge failed; fix conflicts and then commit the result.
git status
# On branch merge-no-ff-test
# You have unmerged paths.
# (fix conflicts and run "git commit")
# (use "git merge --abort" to abort the merge)
#
# Changes to be committed:
#
# modified: .gitmodules
# deleted: submodule-location-1
#
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
# added by us: submodule-location-2
#
# fatal: Not a git repository: 'submodule-location-1/.git'
# Submodule changes to be committed:
#
# * submodule-location-1 07fec24...0000000: