Re: [PATCH] Disconnect stash from its base commit
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:44:52
Possibly related (same subject, not in this thread)
- 2016-06-15 · Re: [PATCH] Disconnect stash from its base commit · Junio C Hamano <hidden>
Johannes Schindelin [off-list ref] writes:
quoted
This patch changes the structure of a stash to use a parentless new commit that has the same tree as the HEAD commit, in place of the HEAD commit. This way, a stash does not keep the history that leads to the HEAD commit reachable, even if the stash is kept forever.May I register my suspicion that this is the wrong direction to go? I actually find it quite nice that I can easily see in gitk where I spawned off a certain stash, indeed, how the recent stash history (manually specified with "stash@{0} stash@{1} stash@{2}" [*1*]), relates to the current branch's history.
A stash may primarily be for applying the change to random place, but
where it was created is not a useless information. The very original use
case that was in the discussion "git stash" (actually its original form
"git save") was first posted was "I am in the middle of something, and get
interrupted. Stash the changes away to switch branches to deal with the
emergency for a while so that I can later come back to where I was, and I
want both saving away and coming back easy operations". A stash _can_ be
applied to any random other state, but "coming back" is very much part of
what it should have supported, and not recording the base commit means we
would lose that capability.
Side note. In addition to the current "stash apply" and "stash
pop", "stash branch $stash newbranchname" that does
git checkout -b newbranchanme $stash^
(i.e. create a new branch starting from the state you were in)
might be a good ingredient to support a more git-like workflow to
resume. If your original branch gained extra commits, was
rewound, or was rebased during the emergency/distraction, you may
not have anywhere to apply/pop the stash without conflicts when
you want to "come back" with normal
git checkout somebranch && git stash pop
But that imaginary "stash branch" command would always give you
the exact state you were in and creates a clean fork to finish
what you were doing, and continue.
So the base commit is an integral part of what a stash is, and I agree
with you that an unexpiring stash that pins the whole history beind it is
a feature. It is not unncessary cruft that accumulates that we need to
worry about.