Answers:
git reset --soft HEAD~1应该做你想做的。此后,您将在索引中进行第一个更改(可通过看到git diff --cached),而最新的更改不会上演。git status然后将如下所示:
# 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,您可以立即进行并提交两个更改。
git commit --amend做什么的。但是工作流程要复杂得多。尽管给出了正确的方向(git reset),但这仍无法回答OP提出的问题。
git reset --soft HEAD~
用:
git reset HEAD^
默认情况下会进行“混合”重置,这将按照您的要求进行;将foo.java放在未暂存的状态,删除最近的提交。
git reset --soft没有工作,但git reset HEAD^没有
对我来说,以下是更易读(因此更可取)的方法:
git reset HEAD~1
可以使用而不是1来撤消任何数量的提交。
git reset --soft仅用于此目的:就像git reset --hard,但不会触碰文件。
git reset“就像git reset --hard但不触碰文件。” 不git reset --soft。git reset --soft将进行更改,因此,如果要提交它们,则不必将其添加到暂存中,但是如果不需要,则必须将它们添加到暂存中git reset(是,第二次,并且没有--soft)。因此答案很短,但不正确。
“重置”是在本地撤消更改的方法。提交时,首先选择要包含在“ git add ”中的更改,这称为“暂存”。一旦变更生效,您就可以“ git commit ”它们。
要退出登台或提交,请“重置” HEAD。在分支上,HEAD是指向最近提交的git变量。因此,如果您上演但尚未提交,请“ git reset HEAD”。通过将更改从舞台上备份到当前HEAD。它是“ git reset --mixed HEAD〜0 ”的简写。
如果您已经提交,则HEAD已经完成,因此您需要备份到上一次提交。在这里,您“ 重置HEAD〜1 ”或“ 重置HEAD ^ 1 ”或“ 重置HEAD〜 ”或“ 重置HEAD ^ ”-所有参考HEAD减一。
〜或^是哪个更好的符号?将〜波浪号视为单个流 -当每个提交具有单个父级并且顺序上只是一系列更改时,则可以使用波浪号引用备份流,例如HEAD〜1,HEAD〜2,HEAD 〜3,对于父母,祖父母,曾祖父母等(从技术上讲,它是在较早的几代中找到第一个父母)。
合并时,提交中有多个父级。那是^插入符开始起作用的时候-您可以记住,因为它显示分支汇聚在一起。使用插入符号,HEAD ^ 1将是单个提交的第一个父级,而HEAD ^ 2将是单个提交的第二个父级,例如,母亲和父亲。
因此,如果您只是在单亲提交中回退一跳,则HEAD〜和HEAD ^是等效的-您可以使用任一跳。
同样,重置可以是--soft,-- mixed或--hard。软重置只会撤消提交-它会重置HEAD,但不会从较早的提交中签出文件,因此会保留工作目录中的所有更改。而且--soft reset甚至不会清除阶段(也称为index),因此所有已暂存的文件仍将处于暂存状态。
一个--mixed复位(默认),也不会从签出文件的早期承诺,因此,所有的变化被保留,但阶段已被清除。这就是为什么简单的“ git reset HEAD ”将清除舞台的原因。
一个-硬复位复位头,它清除阶段,但它也检查出所有从文件中较早的承诺,所以它覆盖任何变化。
如果您已将提交推送到远程存储库,则重置不会很好。您可以在本地重置,但是当您尝试推送到远程时,git会看到您的本地HEAD在远程分支的HEAD后面,并且会拒绝推送。您也许可以强制执行推送,但是git确实不喜欢这样做。
另外,如果您想保留更改,则可以存储它们,签出先前的提交,取消存储更改,暂存它们,创建一个新的提交,然后推送。
假设您要取消更改直到n次提交,
提交哈希如下:
然后运行以下命令:
git reset hn
现在,HEAD将位于hn + 1。从h1到hn的更改将是未分级的。