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

Re: [PATCH v3 3/4] reset: add option "--merge-safe" to "git reset"

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 17, 2009, 20:43 UTC
Message-ID
<7v1vm5i9o6.fsf@alter.siamese.dyndns.org>
In-Reply-To
<4AB23410.6080508@viscovery.net>
Johannes Sixt <j.sixt@viscovery.net> writes:
Show 10 quoted lines
> Christian Couder schrieb:
>> On Thu, Sep 17, 2009 at 9:24 AM, Johannes Sixt <j.sixt@viscovery.net> wrote:
>>> Junio C Hamano schrieb:
>>>> Johannes Sixt <j.sixt@viscovery.net> writes:
>>>  $ git stash
>>>  $ git reset --hard $target
>>>  $ git stash pop
>>
> It "can"? Do you say that you intend --merge-safe for something else in
> addition to the above stash + reset --hard + stash pop sequence? What?

I think I am starting to understand. The use case in a larger picture would look like

    $ (edit/add/commit)+ to work towards something
    ... And you _finished_ that something.
    $ (edit/add)+ to work towards something else that is wonderful
    ... Now you notice that all the commits for that earlier something
    ... are crap and you would want to discard them, while still keeping
    ... changes for "something else that is wonderful".
    ... Luckily, you haven't committed anything you would want to keep,
    ... and you can afford to reset the tip commits away.
    $ git reset --keep-local-changes HEAD~7
    ... or howmanyever commits you want to discard.

The reset in this case is done purely to discard the crap, not to redo them (you have something else you want to work on in your work tree and index, and they are not fixups---if they were you wouldn't have resetted but used "commit --amend" or "rebase -i").

It is more like switching branches but in this case you are switching to your own branch immediately after rewinding that same branch.

In other words, as far as the index, the work tree and where HEAD will point at are concerned, the new mode of reset works exactly like this:

    $ (edit/add)+ to work towards something wonderful
    ... notice that the work does not belong to the current branch
    ... and you would want to switch to another branch while carrying
    ... your local changes.
    $ git checkout another-branch

The only difference being that reset will stay on the same branch and remove some commits from the tip of it, while checkout will leave the original branch intact.

It makes sense that it has the same "safety" as "checkout" has when switching branches; when you have modification in the index for a path, and the path is different between switched-to commit and the current commit, the command errors out with "cannot merge" (or a better message).

One drawback is that you can use this new mode of resetting only until you make a commit that is part of the new "something else that is wonderful" topic. After that "git reset" with this new option is not useful for this workflow, and you would need to stash then rebase -i then unstash.

Previous: Christian CouderNext: Christian Couder
Message 12 of 15 in “"git reset --merge" related improvements”
  1. 0/4 "git reset --merge" related improvementsChristian Couder, Sep 17, 2009
  2. 1/4 reset: add a few tests for "git reset --merge"Christian Couder, Sep 17, 2009
  3. 2/4 reset: use "unpack_trees()" directly instead of "git read-tree"Christian Couder, Sep 17, 2009
  4. 3/4 reset: add option "--merge-safe" to "git reset"Christian Couder, Sep 17, 2009
  5. Junio C HamanoSep 17, 2009
  6. Johannes SixtSep 17, 2009
  7. Junio C HamanoSep 17, 2009
  8. Johannes SixtSep 17, 2009
  9. Christian CouderSep 17, 2009
  10. Johannes SixtSep 17, 2009
  11. Christian CouderSep 17, 2009
  12. Junio C HamanoSep 17, 2009
  13. Christian CouderSep 17, 2009
  14. Daniel BarkalowSep 17, 2009
  15. 4/4 reset: add test cases for "--merge-safe" optionChristian Couder, Sep 17, 2009

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.