如何将提交移动到 git 中的暂存区?

Posted

技术标签:

【中文标题】如何将提交移动到 git 中的暂存区?【英文标题】:How do you move a commit to the staging area in git? 【发布时间】:2011-11-05 01:20:07 【问题描述】:

如果您想将提交移动到暂存区域 - 即取消提交并将其中的所有更改移动到暂存区域(有效地将分支置于它之前的状态)提交) - 你是怎么做的?还是你做不到的?

我知道的最接近的方法是将提交中更改的所有文件复制到其他地方,将分支重置为提交之前的提交,然后再尝试移动到暂存区域,移动所有复制的文件回到存储库,然后将它们添加到暂存区域。它有效,但它并不是一个很好的解决方案。我想做的只是撤消提交并将其更改移动到暂存区域。可以做到吗?如果有,怎么做?

【问题讨论】:

【参考方案1】:
git reset --soft HEAD^

这会将您的索引重置为HEAD^(上一次提交),但将您的更改保留在暂存区域中。

git-reset 文档中有一些 handy diagrams

如果您使用的是 Windows,则可能需要使用此格式:

git reset --soft HEAD~1

【讨论】:

澄清一下,波浪号和胡萝卜在 git 版本中的含义不同。 HEAD~1 始终跟随提交的第一个父级,如果它是具有多个父级的合并提交,则可能不是您想要的。关于 Windows cmd shell,您只需要使用另一个 carot 来转义 carot,例如“git reset --soft HEAD^^”返回到“HEAD^”。这纯粹是 Windows cmd shell 的产物,因此如果您在 Windows 上使用 git GUI,则不必这样做。波浪号和胡萝卜在schacon.github.io/git/git-rev-parse#_specifying_revisions 解释 我为“方便的图表”添加了一个链接。你能快速检查它是否指向你想要的部分吗?谢谢 请注意,对于 Mac OS (zsh),您需要转义插入符号:git reset --soft HEAD\^ 假设第一次提交是 commit1,最后一次提交是 commit4,是否可以只将提交 2 移动到暂存区? @fall 在某种意义上来说是可能的,通过使用git rebase -i然后git reset --soft head~1将提交2移动到提交4之后的组合【参考方案2】:

简单的方法

    提交到暂存区的文件

    git reset --soft HEAD^1

    暂存到 UnStage :(使用“git reset HEAD ...”取消暂存)

    git reset HEAD git commands.txt or git reset HEAD *ds.txt

这里, *--> 所有以 ds.txt 结尾的文件都取消暂存。

请参考下图清楚:

【讨论】:

我想你的意思是HEAD~1【参考方案3】:

将提交移回暂存区域取决于您的最后一次提交。 如果您的最后一次提交是 repo 的第一次(或初始)提交,那么您需要执行

git update-ref -d HEAD

如果您的最后一次提交不是第一次(或初始)提交,则执行

git reset HEAD~

【讨论】:

这涵盖了一种特殊情况,即您尝试移至暂存区的提交是第一次提交。

以上是关于如何将提交移动到 git 中的暂存区?的主要内容,如果未能解决你的问题,请参考以下文章

Git中的暂存区有啥用?

百思不得其解,tortoisegit是把git中的暂存区概念干掉了吗

Git | 删除暂存区的修改

关于git

git学习:理解git暂存区(stage)

Git 工作区版本库中的暂存区和版本库之间的关系