如何丢弃Git中的分阶段更改

时间:2014-02-18 14:03:42

标签: git

我的问题与那个问题有关:git-new-workdir: Commit in working tree A causes bogus changes in tree B。我使用git-new-workdir从同一个Git存储库中获得多个工作目录。通常,我在每个工作目录中的不同分支上工作,但是我可能会在给定工作目录的分支中提交,而另一个工作目录是同一分支的签出。当发生这种情况时,第二个工作目录会获得与我刚刚提交的提交相反的分阶段更改。现在问我的问题......

如何在不丢弃非分阶段修改的情况下丢弃分阶段变更?

修改:我不想取消暂存阶段性更改(例如git reset),但我想完全放弃已暂存的更改。

3 个答案:

答案 0 :(得分:1)

要在不触及工作树的情况下丢弃索引,您可以这样做:

git reset

这就是它的作用。这相当于你自己的答案,“仅使用git命令”。最终效果就像是将git diff HEAD的结果拉回来,将所有内容回滚到最顶层的提交,然后将该差异重新应用到HEAD以重新创建原始工作树。

但是假设您想要从索引中删除更改,以便实际从您的工作中减去这些丢弃的更改。在这种情况下, I 会做的是使用交互式rebase来拼接更改:

git commit    # commit the index
git commit -a # commit the remaining changes

git rebase --interactive HEAD^^  # rebase top two commits onto same branch

在出现的编辑器窗口中,我只是删除保存来自不需要的索引的不需要的更改的提交,然后保存并退出,让交互式rebase完成剩下的工作。可能存在合并冲突,这些冲突必须得到解决,因为之前未进行过的所需更改可能取决于分阶段的不需要的更改。

最后,我会进行一次提交,其中只包含以前未进行的更改,并且不需要的更改已消失。那时,我可以摆脱那个提交,把它变成未分级的变化:

git reset HEAD^

或者只是保留提交并通过执行更多黑客操作来处理它,并git commit --amend添加它并更新其消息。

rebase --interactive所做的一切(事实上,非交互式rebase所做的)可以使用cherry-pick命令完成,但它提供了方便的“工作流程自动化”。

对于涉及提交重新排序,删除提交,将多个提交压缩为一个,重写提交消息(除最顶层补丁之外)等任何场景,最好知道如何使用交互变基

我们的想法是将所有更改的表示形式转换为单独的提交,然后使用commit-munging kung-fu,最后在必要时“取消提交”某些内容。

对于复杂的事情,git在处理提交时要比使用非分段更改或索引更好,这些是临时区域;所以你想先把你的工作从那里拿出来进入提交。事实上,如果您有未分阶段或分阶段的更改,git会阻止您执行各种有用的操作。

让你的工作进入提交的一个原因是,在git中很容易永远丢失工作副本或索引。工作副本和索引不是提交对象,所以它们不可恢复来自reflog。键入错误的命令,消除其中一个或两个,它们已经消失了。但是, 提交的任何更改都可以恢复,即使您丢失了它们,也可以通过reflog,或通过您可以设置的分支指针或标记。

答案 1 :(得分:0)

使用git-diffpatch

可以做到以下几点
git diff HEAD > my.patch
git reset --hard
patch -p1 < my.patch

但必须有更好的方法只使用git命令。

答案 2 :(得分:-1)

当我找到它时面对面

git reset HEAD
git checkout -- .

然后使用git rm filename

删除您可能已创建的所有本地文件