Git 撤消一些文件中的更改

在编写代码时,我将 print 语句添加到一些文件中,以跟踪正在发生的事情。

完成后,是否可以恢复某些文件中的更改,但提交我实际处理的文件?

假设我在文件 A中添加了 print,但是我修改了文件 BB是我想提交的,而 A,我想回到它的旧状态。

166679 次浏览

结账: git checkout A

是的

git commit FILE

将只提交文件。然后您可以使用

git reset --hard

撤消其他文件中的本地更改。

也许还有其他我不知道的方法..。

或者,正如 NicDumZ 所说,git-checkout 只是您想要撤销更改的文件(最好的解决方案取决于是否有更多的文件要提交或撤销: -)

有三种基本的方法可以做到这一点,这取决于您对文件 A 所做的更改。如果您还没有将更改添加到索引或提交它们,那么您只需要使用 checkout 命令-这将更改工作副本的状态以匹配存储库:

git checkout A

如果已经将其添加到索引中,请使用重置:

git reset A

如果您已经提交了它,那么您可以使用 return 命令:

# the -n means, do not commit the revert yet
git revert -n <sha1>
# now make sure we are just going to commit the revert to A
git reset B
git commit

另一方面,如果您已经提交了它,但是提交涉及到许多您不想还原的文件,那么上述方法可能涉及到许多“重置 B”命令。在这种情况下,您可能希望使用以下方法:

# revert, but do not commit yet
git revert -n <sha1>
# clean all the changes from the index
git reset
# now just add A
git add A
git commit

另一个方法同样需要使用 rebase-i 命令。如果您有多个编辑提交,这个提交可能非常有用:

# use rebase -i to cherry pick the commit you want to edit
# specify the sha1 of the commit before the one you want to edit
# you get an editor with a file and a bunch of lines starting with "pick"
# change the one(s) you want to edit to "edit" and then save the file
git rebase -i <sha1>
# now you enter a loop, for each commit you set as "edit", you get to basically redo that commit from scratch
# assume we just picked the one commit with the erroneous A commit
git reset A
git commit --amend
# go back to the start of the loop
git rebase --continue
git add B # Add it to the index
git reset A # Remove it from the index
git commit # Commit the index

为什么您不能简单地使用“ Git add < 档案 > ”(或者甚至使用“ git add —— Interactive”,或者使用“ git gui”,它有交互式提交的选项)标记您希望在提交中进行的更改,然后使用“ git commit”而不是“ git commit-a”?

在你的情况下(比如你的例子) ,应该是:

prompt> git add B
prompt> git commit

只提交对文件 B 的更改,文件 A 将保持“脏”,即在工作区版本中使用这些打印语句。当您想要删除这些 print 语句时,使用它就足够了

prompt> git reset A

或者

prompt> git checkout HEAD -- A

恢复为提交版本(来自 HEAD 的版本,即“ git show HEAD: A”版本)。

资料来源: http://git-scm.com/book/en/Git-Basics-Undoing-Things

Git checkout —— modfiedfile.java


1) $git status

您将看到修改后的文件

2) $git checkout —— modfiedfile.java

3) $git status