Hi, I ran across this doing a pull --rebase using the current master version of git
This happens on Slackware linux, using git HEAD, version 2.35.8, and 2.46.2
I have a clone of the ffmpeg video package, with a few custom commits on top of it, I periodically fetch and "pull --rebase" to update the underlying ffmpeg code. I tried this recently, and my custom commits disappeared.
I looked further with a small test, and it looks like this is happening:
The setup:
"base" repo with a few commits (A, B, C)
"clone_1" cloned from "base", with a few extra commits (F, G)
"clone_2" cloned from "clone_1"Add a few more commits for base (D, E)
Then use "git remote set-url origin" to point "clone_2" to "base"
Then, in "clone_2" do "pull --rebase"; the F and G commits disappear.
Then, in "clone_1" do "pull --rebase"; the F and G commits are retained.
Something like this:
# commit trees: # # base: A---B---C (initial base repo with 3 commits) # clone_1: A---B---C (clone_1 cloned from base at commit C) # base: A---B---C---D---E (base added extra commits D and E) # clone_1: A---B---C---F---G (clone_1 added extra commits F and G) # clone_2: A---B---C---F---G (clone_2 cloned from clone_1 at commit G) # # *** now, change clone_2 to use base as the upstream url, and fetch / pull / rebase to get up to date *** # # * set clone_2 upstream to point to base repo # * "pull --rebase" in clone_2 (should fetch from base repo and rebase F and G after D and E) # # expected result: A---B---C---D---E---F---G # actual result: A---B---C---D---E # commits F and G are gone # # Doing "pull --rebase" in clone_1 gives the expected result: # expected result: A---B---C---D---E---F---G #
This looks like either stale state info after the "set-url" command, or I'm doing something wrong.
I can repeatedly cause this to happen in my local ffmpeg devel area, if that helps debug/test this. ... and answer questions, if any.
Thanks for the help! Bill
P.S. here's the test script I used for this:
--------------------------------------------------------------------------
#!/bin/bash
set -o errexit
BASE_WORKING_DIR="rebase_bug.working"
# Clean up the test area rm -rf "${BASE_WORKING_DIR:?}" mkdir "${BASE_WORKING_DIR:?}" cd "${BASE_WORKING_DIR:?}"
WORKING_DIR="${PWD}"mkdir test_rebase_base.git cd test_rebase_base.git
# create the base git repo, with commit A, B and C
git init
echo "Commit A" > testfileA
git add testfileA
git commit -m "Commit A" echo "Commit B" > testfileB
git add testfileB
git commit -m "Commit B" echo "Commit C" > testfileC
git add testfileC
git commit -m "Commit C"cd ..
# Clone the base area into the clone_1 area
git clone test_rebase_base.git test_rebase_clone_1.gitcd test_rebase_base.git
# Add commit D and E to the base area echo "Commit D" > testfileD
git add testfileD
git commit -m "Commit D" echo "Commit E" > testfileE
git add testfileE
git commit -m "Commit E"cd ..
cd test_rebase_clone_1.git
# Add commit F and G to the clone_1 area echo "Commit F" > testfileF
git add testfileF
git commit -m "Commit F" echo "Commit G" > testfileG
git add testfileG
git commit -m "Commit G"cd ..
# clone from clone_1 into clone_2
git clone test_rebase_clone_1.git test_rebase_clone_2.gitcd test_rebase_clone_2.git
# change clone_2 to point to base
git remote set-url origin "${WORKING_DIR:?}/test_rebase_base.git" # expecting this to pull in the "base" extra commits, and move the
local HEAD commit after it in sequence
git pull --rebasecd ..
cd test_rebase_clone_1.git
# do the same pull --rebase in clone_1
git pull --rebasecd ..
cd test_rebase_base.git git log --oneline > "${WORKING_DIR:?}/test_rebase_base.oneline.log" cd ..
cd test_rebase_clone_1.git git log --oneline > "${WORKING_DIR:?}/test_rebase_clone_1.oneline.log" cd ..
cd test_rebase_clone_2.git git log --oneline > "${WORKING_DIR:?}/test_rebase_clone_2.oneline.log" cd ..
# The test_rebase_clone_1.oneline.log and test_rebase_clone_2.oneline.log should match, but they don't
echo "done"
--------------------------------------------------------------------------------------------------