Git在某些文件中撤消更改

时间:2009-06-01 02:09:05

标签: git file version-control undo revert

编码时我将print语句添加到某些文件中以跟踪发生的情况。

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

假设我在文件A中添加了打印,但我修改了文件B。我想提交B A,我想恢复原状。

6 个答案:

答案 0 :(得分:285)

有三种基本方法可以执行此操作,具体取决于您对文件A的更改所做的操作。如果您尚未将更改添加到索引或提交它们,那么您只想使用checkout命令 - 这将更改工作副本的状态以匹配存储库:

git checkout A

如果您已将其添加到索引中,请使用reset:

git reset A

如果您已提交,则使用revert命令:

# 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

答案 1 :(得分:19)

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

git checkout - modifiedfile.java


1)$ git status

您将看到修改后的文件

2)$ git checkout - modifiedfile.java

3)$ git status

答案 2 :(得分:7)

git add B # Add it to the index
git reset A # Remove it from the index
git commit # Commit the index

答案 3 :(得分:6)

man git-checkoutgit checkout A

答案 4 :(得分:3)

是;

git commit FILE

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

git reset --hard

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

我可能还有其他不了解的方法......

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

答案 5 :(得分:1)

为什么不能简单地使用“git add &lt; file&gt; ”(或者甚至是“git add --interactive”)标记要提交的更改内容,或者“git gui”有交互式选择的选项),然后用“git commit”代替“git commit -a”?

在您的情况下(例如),它将是:

prompt> git add B
prompt> git commit

只会对文件B进行更改,文件A将保持“脏”状态,即工作区版本中的那些打印语句。如果要删除这些打印语句,则应该使用

prompt> git reset A

prompt> git checkout HEAD -- A

恢复到comded版本(来自HEAD的版本,即“git show HEAD:A”版本)。