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

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

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

【问题讨论】:

    标签: git commit staging


    【解决方案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】:

    简单的方法

    1. 提交到暂存区的文件

      git reset --soft HEAD^1

    2. 暂存到 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~
    

    【讨论】:

    • 这涵盖了一种特殊情况,即您尝试移至暂存区的提交是第一次提交。
    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 2022-12-04
    • 2021-03-12
    • 2017-05-18
    • 2012-11-08
    • 1970-01-01
    • 2015-01-09
    • 2011-03-11
    相关资源
    最近更新 更多