已执行以下命令
git add <foo.java>
git commit -m "add the foo.java file"
我如何删除我的本地提交现在和取消foo.java?
如果我输入git reset——很难,我发现它会把我修改过的foo.java恢复到原来的。
已执行以下命令
git add <foo.java>
git commit -m "add the foo.java file"
我如何删除我的本地提交现在和取消foo.java?
如果我输入git reset——很难,我发现它会把我修改过的foo.java恢复到原来的。
当前回答
假设你想要取消n次提交的更改,
其中提交哈希如下:
h1 h2 ... hn hn + 1
然后执行如下命令: Git重置hn
现在HEAD是hn+1。从h1到hn的更改将是不分段的。
其他回答
对我来说,下面的方法更具可读性(因此更可取):
git reset HEAD~1
可以有任意数量的提交,而不是1。
Use:
git reset HEAD^
这做一个“混合”重置默认情况下,这将做什么你要求;将foo.java放入unstaging,删除最近的提交。
“重置”是在本地撤销更改的方法。提交时,首先选择要包含在“git add”中的更改——这被称为“staging”。一旦这些更改被执行,您就可以“git提交”它们。
要从暂存或提交中退出,需要“重置”HEAD。在分支中,HEAD是一个指向最近提交的git变量。因此,如果你已经进行了部署,但还没有提交,你“git reset HEAD”。通过将更改从舞台上删除,这将备份到当前的HEAD。这是“git reset -mixed HEAD~0”的简写。
如果您已经提交了,那么HEAD已经前进了,所以您需要备份到以前的提交。这里你可以“reset HEAD~1”或“reset HEAD^1”或“reset HEAD~”或“reset HEAD^”——都是参考HEAD - 1。
哪个符号更好,~还是^?把~波浪号看作是一个单一的流——当每次提交都有一个单一的父元素,它只是一系列按顺序进行的更改时,那么您可以使用波浪号对流进行反向引用,例如HEAD~1, HEAD~2, HEAD~3,用于父元素、祖父母元素、曾祖父元素等等(从技术上讲,它是在早期代中查找第一个父元素)。
当有merge时,提交有多个父节点。这就是^插入符号起作用的时候——你可以记住,因为它显示了分支连接在一起。使用插入号,HEAD^1将是单个提交的第一个父节点,HEAD^2将是第二个父节点——例如,父节点和母节点。
因此,如果你只是在单亲提交上返回一跳,那么HEAD~和HEAD^是等价的,你可以使用其中任何一个。
此外,重置可以是-软,-混合,或-硬。软重置只是退出提交——它重置HEAD,但不会检出之前提交的文件,因此工作目录中的所有更改都被保留。而且——软重置甚至不清除舞台(也称为索引),所以所有被舞台的文件仍然会在舞台上。
——mixed reset(默认值)也不会检出之前提交的文件,因此保留所有更改,但清除该阶段。这就是为什么一个简单的“git reset HEAD”将清除舞台。
hard reset会重置HEAD,它会清空舞台,但它也会检出之前提交的所有文件,因此它会覆盖任何更改。
如果您已经将提交推到远程存储库,那么重置工作就不那么好了。你可以在本地重置,但是当你试图推到远程时,git会看到你的本地HEAD在远程分支的HEAD后面,并且会拒绝推。你也许可以强迫推,但git真的不喜欢这么做。
或者,如果您想保留更改,您也可以保存更改,检查之前的提交,取消保存更改,暂存它们,创建一个新的提交,然后推送。
Git重置-软就是为了这个:它就像Git重置-硬,但不触及文件。
git重置-软头~1应该做什么你想要的。在此之后,您将在索引中看到第一次更改(通过git diff—cached可见),并且您的最新更改不是阶段性的。Git状态将如下所示:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.java
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.java
#
然后你可以执行git add foo.java,并一次性提交两个更改。