撤销已暂存的更改,保留未暂存的更改。

7

我在git中有一些暂存的和未暂存的更改,还有一些未跟踪的文件。我想保留未暂存的更改和未跟踪的文件,并且放弃暂存的更改。

最简单的方法是什么?请使用命令行进行操作。

3个回答

8
我在git中有一些已经暂存和未暂存的更改,还有一些未跟踪的文件。我希望保留未提交的更改和未跟踪的文件,并且舍弃已经暂存的更改。
正如你在评论中澄清的那样,你的意思是“...并丢弃已经暂存的更改”(而不是提交的更改)。通常,您可以使用git reset来撤销git add。但在您的情况下,您想要保留未暂存的更改,因此:
git commit     # move staged to a commit, does not touch unstaged changes/unadded files

git checkout HEAD^    # checkout the previously committed version while keeping unstaged changes/unadded files   

git branch yourbranchname --force    # to grab the branch and move it back as well

1
实际上,在我的使用情况下,这个问题是有意义的。因此,我不想取消暂存,而是真正地取消暂存并丢弃已暂存的更改,同时不丢失(当前)未暂存的更改... - Jan Rüegg
1
是的,但你写的是“放弃已提交的更改”。你的意思是“暂存的更改”。这里有重要的区别,你可能需要更新你的问题。 - AnoE
哦,你当然是对的,那是一个打字错误。谢谢你的提示,我更新了问题! - Jan Rüegg

1
git reset HEAD^

将HEAD重置为其父级,现在提交更改在索引中被丢弃,但保留在工作树中。
git checkout -- paths_of_files_whose_changes_are_to_be_discarded_in_the_work_tree

放弃工作树中的更改。

抱歉,问题中有误,我已更新(我错误地写成“提交”而不是“暂存”)。所以我觉得您的答案不再适用... - Jan Rüegg
@JanRüegg 之后,git reset -- path_of_file 可以放弃文件在索引中的改动。再使用 git checkout -- path_of_file 可以放弃工作区中的改动。 - ElpieKay
不错的想法...然而,索引中有相当多的文件,所以我选择了另一种解决方案来节省一些打字时间 ;) - Jan Rüegg
只要能够帮助,就没关系。@JanRüegg - ElpieKay

0

如果要撤销未提交的更改保留已暂存的更改,请将以下内容添加到您的~/.gitconfig文件中:

[alias]
    revert-unstaged = "!sh -c '{ git commit -m=tmp && git reset --hard HEAD && git reset --soft HEAD^ || git reset --hard HEAD; } > /dev/null 2>&1; git status'"

然后你可以执行git revert-unstaged,它会执行以下操作:

  • 如果有暂存的更改,则创建一个本地提交

  • 使用git reset --hard HEAD删除任何未暂存的更改

  • 如果更改已经被暂存,恢复本地提交以还原它们

  • 运行git status以获取新状态的概述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接