git/list[1] front-page[2] threads[3] people[4] search[5] about
 

RE: Why does "git pull --rebase" require a clean git directory?

From
SVShupak, Vitaly <vitaly.shupak@deshaw.com>
Date
Dec 11, 2020, 21:23 UTC
Message-ID
<f5b5b94830ca45b69440c0ebc1de5e69@deshaw.com>
In-Reply-To
<X9LqnolNcWZvA7Bm@camp.crustytoothpaste.net>
Thanks for the explanation. It seems like some optimizations may still be possible. For example, if the pull could be done with a fast-forward merge, then you don't need to rebase at all. This could be an option like pull.rebase=noffonly.
-----Original Message-----
From: brian m. carlson <sandals@crustytoothpaste.net> 
Sent: Thursday, December 10, 2020 10:42 PM
To: Shupak, Vitaly <Vitaly.Shupak@deshaw.com>
Cc: git@vger.kernel.org
Subject: Re: Why does "git pull --rebase" require a clean git directory?
On 2020-12-10 at 22:15:11, Shupak, Vitaly wrote:
Show 12 quoted lines
> Hi,
> 
> "git pull --rebase" requires having NO uncommitted changes, even if 
> the locally modified files haven't been updated upstream, or even if 
> there are no changes to upstream at all. I know I could use 
> --autostash, but that's inefficient and may be undesirable if it would 
> create a conflict.
> 
> Would it be possible to change the behavior of "git pull --rebase" so 
> that it only fails if the locally modified files conflict with the 
> files modified upstream (similar to the default git pull behavior 
> without --rebase)?
I suspect the reason for the difference is in how the two pieces of code work.  A merge in general can work in a dirty tree whereas a rebase cannot.  That, in turn, is because the merge code merges two files internally and then writes them out to the working tree, whereas the rebase code, at least in some cases, doesn't contain the same precautions not to modify the working tree.
Moreover, a merge is a single operation, so it's safe to operate on a commit and then give up.  A rebase consists of multiple operations, so we'd have to evaluate each operation and synthesize it, internally performing the merge (or apply) that's a part of it, in order to determine if it would conflict.  Otherwise, we'd have to just try it and somehow abort cleanly in the middle without otherwise dirtying the working tree.  Right now, that abort step involves a reset --hard, which is going to blow away your data.
So is it possible to do?  Sure.  Is it easy?  Not especially with the current code.  So certainly it could be done if it were important to someone, but it will likely be a good bit of work.

Sorry this wasn't the news you were hoping for. I'd love to have some easy solution that I could offer to send in a patch for this weekend to solve this, but unfortunately it's not that easy. -- brian m. carlson (he/him or they/them) Houston, Texas, US

Previous: brian m. carlsonNext: brian m. carlson
Message 3 of 5 in “Why does "git pull --rebase" require a clean git directory?”
  1. Shupak, VitalyDec 10, 2020
  2. brian m. carlsonDec 11, 2020
  3. Shupak, VitalyDec 11, 2020
  4. brian m. carlsonDec 12, 2020
  5. Phillip SusiDec 11, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.