Git:删除所有本地和远程提交但保留更改

时间:2016-04-18 13:17:33

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

我创建了一个新分支new_feature并开始研究它。到目前为止,我做了4次提交,并将所有这些提交到远程。但由于某些官方原因,我需要从本地和远程删除所有提交,但我需要在本地保留更改,然后在一次提交中再次提交所有内容。所以我需要做的步骤是

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

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不确定你为什么需要做你要问的事情,但我会根据你所描述的场景来做这件事。

  1. 使用git rebase将所有本地提交压缩到一次提交中。 (https://git-scm.com/docs/git-rebase
  2. git push--force一起使用您的重新定位的本地分支覆盖远程分支。 (https://git-scm.com/docs/git-push
  3. 注意,如果有人检查了您的远程分支,当您覆盖远程分支的历史记录时,它们将会处于困境中。

    我希望这会有所帮助。

答案 3 :(得分:0)

你被要求有效地"压制你的提交"。

这是一个非常常见的请求,因为您的更改已准备好合并为master。

您的一些选择是:

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

  • https://stackoverflow.com/a/5190323/631619

  • 中使用git merge --squash
  • 将更改后的文件复制到项目外部,然后从master创建一个新分支(或删除分支,然后重新创建),然后复制文件。

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

答案 4 :(得分:0)

听起来你想要改变 - 这将允许你将几个提交折叠成一个。我们假设你有以下提交(最近的提交):

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

改变"选择"到"壁球"对于后来的提交:

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

所有更改将合并为一个提交,您将被要求提交新的提交消息,并且Bob是您的叔叔。

顺便说一下,如果你想要提交的安全性可以回滚,但想要/需要一个清晰的提交历史记录,这是一个很好的工作方式:分支,在本地疯狂提交,然后重新变成逻辑黑客。

回到目前的状况,现在您已经遇到了无法将此问题推到遥控器上的问题,因为您已经改变了历史记录。你可以强行推动,但不要轻易做到这一点 - 你会为那些拉开那个分支的人打破一切。

$ git push --force <remote> new_feature