【问题标题】:Git: remove all local and remote commits but keep the changesGit:删除所有本地和远程提交,但保留更改
【发布时间】:2016-08-10 06:13:11
【问题描述】:

我创建了一个新分支new_feature 并开始着手处理它。到目前为止,我做了 4 次提交,并将它们全部推送到远程。但是出于某种官方原因,我需要从本地和远程删除所有提交,但我需要将更改保留在本地,然后在一次提交中再次提交所有内容。所以我需要做的步骤是

  1. 从本地分支new_feature 中删除提交
  2. 从远程分支new_feature 中删除提交
  3. 需要保留所有更改,以便在删除提交期间我不会丢失迄今为止所做的任何更改。
  4. 使用我目前在 new_feature 分支中所做的所有更改创建一个新提交
  5. 将最后一次提交推送到远程new_feature 分支。最后,new_feature 分支应该只有一个提交,其中包含我迄今为止在此分支中所做的所有更改。

【问题讨论】:

    标签: git git-branch git-commit git-remote


    【解决方案1】:

    要保留您的更改,同时有效地将您的树重置为最新的远程提交,请使用git reset origin/master。然后将所有内容作为一个新的提交提交。然后推送(这需要--force)。

    变基会起作用,但在这种特殊情况下,它并不是真正需要的。

    【讨论】:

      【解决方案2】:

      听起来你想变基——这将允许你将多个提交合并为一个。假设您有以下提交(最近的提交):

      cdef... Finished feature X new_feature/HEAD
      89ab... Continue feature X
      4567... Start feature X
      0123... Fix typo in docs master
      

      您想将最后三个提交合并为一个,因此您基于 您要保留的最后一个提交

      $ git rebase -i 0123
      

      编辑器弹出:

      pick cdef... Finish feature X
      pick 89ab... Continue feature X
      pick 4567... Start feature X
      

      将“pick”更改为“squash”以进行后续提交:

      squash cdef... Finish feature X
      squash 89ab... Continue feature X
      pick 4567... Start feature X
      

      所有更改将合并到一个提交中,系统会要求您提供新的提交消息,并且 Bob 是您的叔叔。

      顺便说一句,如果您想要可以回滚的提交的安全性,但想要/需要清晰的提交历史记录,这是一种很好的工作方式:分支,在本地疯狂提交,然后变基为逻辑大块。

      回到您当前的情况,现在您遇到了无法将其推送到遥控器的问题,因为您已经更改了历史记录。您可以强制推动,但不要轻易这样做 - 您会为任何拉入该分支的人破坏事情。

      $ git push --force <remote> new_feature
      

      【讨论】:

        【解决方案3】:

        你被要求有效地“压缩你的提交”。

        当您的更改准备好合并到 master 时,这是一个很常见的请求。

        您的一些选择是:

        • 使用交互式变基,例如git rebase -i HEAD~10 选择并压缩提交。

        • https://stackoverflow.com/a/5190323/631619一样使用git merge --squash

        • 将更改的文件复制到项目之外,然后从 master 创建一个新分支(或删除您的分支,然后重新创建它),然后将文件复制进去。

        请注意,前两个选项可能需要您强制推送(使用 `-f),因此请确保没有其他人已经将其他提交 推送到该分支这是选项 3 的原因之一对新手来说更安全。

        【讨论】:

        • 选项 3 也需要强制推送,因为他已经推送了分支。这是最危险的选择,因为它需要更多的手动工作并且可能出错。
        【解决方案4】:

        我不确定您为什么需要按照您的要求做,但根据您描述的场景,我将按照以下方式进行操作。

        1. 使用git rebase 将所有本地提交压缩到一个提交中。 (https://git-scm.com/docs/git-rebase)
        2. git push--force 一起使用,以使用重新设置的本地分支覆盖远程分支。 (https://git-scm.com/docs/git-push)

        注意,如果有人检查了您的远程分支,当您覆盖远程分支的历史记录时,他们将陷入困境。

        我希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          使用git rebase -i ... 将提交合并为一个,然后使用git push --force 用重新定位的本地分支覆盖远程分支。

          【讨论】:

            猜你喜欢
            • 2021-09-17
            • 2018-07-20
            • 2018-12-07
            • 2016-03-16
            • 2018-12-25
            • 1970-01-01
            • 1970-01-01
            • 2012-04-28
            相关资源
            最近更新 更多