Git:在没有应用它的情况下将文件丢弃

时间:2017-05-03 08:55:18

标签: git git-stash

我很惊讶没有找到对这个问题的回复,但基本上说我有藏在其中的几个文件(我可以通过git扩展来探索它)。看一下它的内容,我想在应用它之前删除一些文件,是否可能?

我能想到的唯一解决方法是:

  1. 结帐存储到新分支
  2. 结帐目标文件
  3. 再次藏匿
  4. 删除分支
  5. 还有更好的东西吗?

    感谢

4 个答案:

答案 0 :(得分:3)

您可以直接使用stash@{0}作为提交参考。

如果您的工作树是干净的(没有修改过的文件),您可以签出所需的文件:

git checkout stash@{0} -- file1 file2 file3

然后手动检查差异以保持您想要的效果。

如果您想要更接近git stash apply的行为,可以创建补丁并应用它:

git show -p stash@{0} -- file1 file2 file3 | git apply -

[编辑]列出在stash@{0}中修改的文件:

git diff --name-only stash@{0}^ stash@{0}

如果你想获得除一个以外的所有文件:

git show -p stash@{0} -- $(git diff --name-only stash@{0}^ stash@{0} |\
                           grep -v "thefile")

答案 1 :(得分:1)

是的,有更好的方法可以做到这一点。

首先,您可以将存储列表检查为

git stash list

然后你可以在下面检查隐藏提交的内容。

git stash show -p stash@{1}

然后您可以使用

申请
git stash apply stash@{1}

答案 2 :(得分:1)

这个问题的棘手部分似乎围绕着你想要什么样的东西在你完成时的样子。由于git stash {pop|apply}只会影响工作树(有时甚至是索引),因此很容易从存储中选择性地进行更改(足以让我最初认为你过度思考问题):

git stash pop
# maybe a 'git reset head' if the index was changed
git checkout -- file.with.unwanted.changes.in.stash

但是那些命令完全删除了藏匿处;相反,如果我说git stash apply而不是pop,那就会保持不变。听起来您希望存储保留在您选择的更改中(如果您需要再次应用它们)。

(我认为有时候你可能会想要完全相反的做法 - 留下那些你没有申请的变化,以便以后可以申请。)

所以退后一步:修改存储涉及什么?

实际上,存储包含两到三个临时提交。特殊引用stash指向这些提交,并且#34;堆栈"使用reflog维护多个stashes(这可能有点像hack,但通常是有效的)。

所以修改存储是为了创建新的提交(因为提交是不可变的)并重新排列stash ref和reflog。

这就是为什么LeGEC提到的符号可以起作用,并且可以为读取存储提供额外的灵活性。但是因为reflog的使用与非stash refs不同,利用这个事实设计到存储的方法可能会产生意想不到的结果。我并不是说结果会很糟糕,或者无法预测/控制;但我认为最终你会创造出比你避免更多的复杂性。

因此,如果我们将自己局限于实际记录的git-stash子命令,那么存储或多或少是原子的。当你创建一个存储时,patch模式允许你选择工作更改放入堆栈,但我不知道pop / apply没有相应的功能。不过,那还是:

如果你有一个干净的工作树和你要拆分的藏匿处,你可以尝试这样的事情:

应用一些更改,并在存储中保留相同的更改

git stash pop
git stash -p
# select the "good" changes
git checkout -- .
git stash apply

应用一些更改,并将剩余的更改保留在存储

git stash pop
git stash -p
# select the "unwanted" changes

将存储分成两部分,稍后决定如何处理它们

git stash pop
git stash -p
# select the "good" changes
git stash
# now the "good" changes are stash@{1} and the "unwanted" are stash@{0}

答案 3 :(得分:0)

删除隐藏条目而不应用它的简单解决方案是删除它:

git stash drop stash@{1}

1是您通过运行获得的隐藏条目:

git stash list