Regression in 'git pull --rebase --autostash' since v2.32.0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Felipe,

Your recent clean-up of 'git pull --autostash' seems to unfortunately have made things
worse if the pull brings new files that conflict with existing untracked files,
which makes the pull abort,
and there are tracked files with modifications (so --autostash comes into play).

Before your change, 'git pull --no-rebase --autostash' did *not* apply the autostash
after the pull failed, thus loosing modifications to tracked files (and it did not save the
stash entry !). 'git pull --rebase --autostash' correctly applied the autostash, but ended with
a strange "error: could not detach HEAD".

After your change, both 'git pull --no-rebase --autostash' and 'git pull --rebase --autostash'
have the same buggy behaviour: they do not apply the autostash and do not save it in the stash list.

I had already documented the old behaviour at [1]. Here, I copy my reproducer script
(save it as "script"):

~~~bash
#!/bin/sh

# usage: ./script <'git pull' arguments>

set -x

rm -rf test
rm -rf clone

# Create origin repo
git init test
(
cd test
date>>file
git add file
git commit -m "add file"
)
# Clone
git clone test clone
# Create new file in origin
(
cd test
date>>other
git add other
git commit -m "add other"
)
# Create the same file in clone (untracked)
(
cd clone
date>>other
# If testing '--autostash', add some modifications to 'file'
if [[ "$@" =~ "--autostash" ]]; then
  date>>file
fi
# status before pull
git status
# Try to pull
git pull "$@"
# status after pull
git status
# see if the stash was saved
git stash list
)
~~~


Here are the buggy results :

** ./script --no-rebase --autostash **

~~~
+ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   file

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	other

no changes added to commit (use "git add" and/or "git commit -a")
+ git pull --no-rebase --autostash
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 283 bytes | 94.00 KiB/s, done.
From /Users/Philippe/Code/GIT-devel/BUGS/ggg-759-pull-autotash-untracked/test
   4ebab2f..fc7a169  master     -> origin/master
Updating 4ebab2f..fc7a169
Created autostash: cfd51b5
error: The following untracked working tree files would be overwritten by merge:
	other
Please move or remove them before you merge.
Aborting
+ git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	other

nothing added to commit but untracked files present (use "git add" to track)
+ git stash list
# empty!
~~~

** ./script --rebase --autostash **

~~~
+ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   file

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	other

no changes added to commit (use "git add" and/or "git commit -a")
+ git pull --rebase --autostash
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), 223 bytes | 13.00 KiB/s, done.
From /Users/Philippe/Code/GIT-devel/BUGS/ggg-759-pull-autotash-untracked/test
   1aa91d4..4f8c34c  master     -> origin/master
Updating 1aa91d4..4f8c34c
Created autostash: d5dffd9
error: The following untracked working tree files would be overwritten by merge:
	other
Please move or remove them before you merge.
Aborting
+ git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	other

nothing added to commit but untracked files present (use "git add" to track)
+ git stash list
# empty!
~~~

Reverting 221ec24e9b (Merge branch 'fc/pull-cleanups', 2021-07-08) brings
back the old behaviour (which is still buggy for --no-rebase).

I noticed (by reading the code and checking)
that the autostash is not completely lost, it's still pointed to by the MERGE_AUTOSTASH
special ref, but this is ref is not documented (it's just mentioned without a
clear definition).

Cheers,
Philippe.


[1] https://github.com/gitgitgadget/git/issues/759



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux