Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何放弃Git中的阶段性更改_Git - Fatal编程技术网

如何放弃Git中的阶段性更改

如何放弃Git中的阶段性更改,git,Git,我的问题与那一个有关:。我曾经在同一个Git存储库中有多个工作目录。通常,我在每个工作目录中的不同分支上都有工作,但可能会发生这样的情况:我从给定的工作目录在分支中提交,而另一个工作目录是同一分支的签出。当这种情况发生时,第二个工作目录将得到与我刚才所做的提交相反的阶段性更改。现在我的问题来了 如何放弃阶段性更改而不放弃非阶段性修改 编辑:我不想取消暂存更改(如使用git reset),但我想完全放弃暂存更改。可以使用git diff和补丁执行以下操作: git diff HEAD > m

我的问题与那一个有关:。我曾经在同一个Git存储库中有多个工作目录。通常,我在每个工作目录中的不同分支上都有工作,但可能会发生这样的情况:我从给定的工作目录在分支中提交,而另一个工作目录是同一分支的签出。当这种情况发生时,第二个工作目录将得到与我刚才所做的提交相反的阶段性更改。现在我的问题来了

如何放弃阶段性更改而不放弃非阶段性修改


编辑:我不想取消暂存更改(如使用
git reset
),但我想完全放弃暂存更改。

可以使用
git diff
补丁执行以下操作:

git diff HEAD > my.patch
git reset --hard
patch -p1 < my.patch
git diff HEAD>my.patch
git重置——硬
补丁-p1

但一定有更好的方法只使用git命令。

当我找到它时,我用手掌捂住了脸

git reset HEAD
git checkout -- .

然后删除您可能已经创建的任何本地文件,也可以使用
git rm filename

删除索引而不触碰工作树,您只需执行以下操作:

git reset
它就是这样做的。这相当于您的自我回答“仅使用git命令”。最终的效果与存储
git diff HEAD
的结果完全一样,将所有内容回滚到最顶端的提交,然后将该差异重新应用到
HEAD
以重新创建原始工作树

但是假设您想从索引中丢弃更改,这样这些被丢弃的更改实际上会从您的工作中减去。在这种情况下,我要做的是使用交互式重基来拼接更改:

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

git rebase --interactive HEAD^^  # rebase top two commits onto same branch
在弹出的编辑器窗口中,我只需删除commit,它保存来自不需要的索引的不需要的更改,然后保存并退出,剩下的事情由交互的重基完成。可能存在合并冲突,这必须解决,因为以前未分级的所需更改可能依赖于分级的不需要的更改

最后,我将有一个单一的提交,其中只包含以前未过时的更改,不需要的更改将消失。在这一点上,我可以摆脱该提交,将其转化为未过时的更改:

git reset HEAD^
或者只需保留提交,并通过进行更多的黑客攻击和git提交来使用它——修改
以添加到它并更新它的消息

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

对于任何涉及重新排序提交、删除提交、将多个提交压缩为一个提交、重写提交消息(在最上面的补丁中除外)之类的场景,最好知道如何使用交互式重新基址

我们的想法是将所有更改的表示转换为单独的提交,然后使用“提交”功夫,最后在必要时“取消提交”某些内容

对于复杂的事情,git更擅长于使用提交,而不是使用未老化的更改或索引,后者是一种临时区域;所以你想先把你的作品拿出来,然后提交。事实上,如果您有未分级或分段的更改,git会阻止您做各种有用的事情


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

尝试
git reset-p
以交互方式重置大块代码。@chepner:如果我理解得很好,
git reset-p
只会取消部分更改,但不会放弃它们。
git checkout
放弃对跟踪文件的非阶段性修改。不幸的是,这并不能回答我的问题。问题是在不丢失工作的情况下放弃阶段性更改。如果您不关心分阶段的更改,那么您想要的是那些由
git diff HEAD
给出的更改,而不是
git diff
。如果您进行了阶段性更改,
git diff
将为您提供这些阶段性更改与工作树之间的差异。如果以上这些对你有用,那么你问错了问题。我认为你是对的。实际上,
git diff
对我有效,因为我的工作树中的阶段性更改和其他更改正在修改不同的文件。我已相应地修改了答案。