我做了10次提交,每次提交都已经推送到中央存储库。让我们假设我有提交的例子。
C1-C2-C3-C4-C5
其中C5是我的最后一次提交,所有提交都被推送了。我掌握的分支。我想删除历史记录,并希望将我的最后一次提交保留在git日志中。我不希望任何人都可以重置任何以前的提交或推送。
有人告诉我使用git rebase -i head~4
,但我希望在实施之前明确我的意识。
我已实施以下命令
git checkout --orphan newB
git add -A
git commit
git branch -D master
git branch -m master
git push
在以上命令之后,我的git图变为按照下面的给定图像
我的存储库的当前图表如下所示
查看前两个提交,它与master分离。我想要去包围的哈希。 git rebase给我以下错误
$ git rebase -i head~5
fatal: Needed a single revision
invalid upstream head~5
答案 0 :(得分:3)
要重写第一次提交,不应指定upstream
提交。 (您可以提供的第一个上游提交是您的第一个提交,它将开始从第一次提交重写,而不是包括第一次提交。)
相反,你可以使用--root
表示你想从分支的根开始重写,这将允许你重写第一次提交。
例如:
% git log --oneline
072c8fc Modification 3 to master
9bdb3a2 Modification 2 to master
45f0758 Modification 1 to master
96da320 Initial revision
指定upstream
96da320
(或HEAD~3
)将不允许您重写第一次提交。同样,您不能指定HEAD~4
,因为这将引用您的第一个提交的父级,这当然不存在。
相反,如果您使用--root
标志:
% git rebase -i --root
然后您的交互式rebase脚本将包含根提交:
pick 96da320 Initial revision
pick 45f0758 Modification 1 to master
pick 9bdb3a2 Modification 2 to master
pick 072c8fc Modification 3 to master
答案 1 :(得分:1)
使用git rebase -i head~5
代替git rebase -i head~4
它曾用于在历史记录之上应用提交,但在某些情况下(这样)也用于重写历史记录
它用于启动一个交互式过程,其中将向您显示编辑器(如vi)以及您可以从不同选项中进行选择的位置
因为您需要重写最近五次提交的历史记录
<小时/>
通过互动式变基,会向您显示此类内容
pick 9e40be3 First commit message
pick 6e20a2a Second commit message
pick 0b06199 Third commit message
pick 3b4d266 Fourth commit message
pick c273e2f Fifth commit message
及以下
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
其中c273e2f
(例如)是标识提交的哈希。
现在您可以选择如何处理您的提交。如果您需要前四个提交只有一个,则可以应用fixup
或squash
(请参阅上面的命令)。
凭借fixup
,您无法“旅行”#34;提交消息并且只提交第一个提交消息(或者说诚实的提交消息,用于提交你正在修复)。
使用squash
,您可以选择要保留的信息,甚至可以编辑它们(另一个&#34;编辑页面&#34;如果选择此方法,将会向您展示。)
您的工作示例可能类似于
pick 9e40be3 First commit message
f 6e20a2a Second commit message
f 0b06199 Third commit message
f 3b4d266 Fourth commit message
pick c273e2f Fifth commit message
这将导致两次提交(第一次使用第二次第三次第四次&#34;合并&#34;以及第五次),其中第一次提交将具有第一次原始提交消息,第五次提交是否将具有第五次原始提交消息
当您要重写历史记录时,当您推送时,您需要指定-f
作为标记,如果您在公共&#34;中进行此操作分支(例如dev
,或master
,或者其他什么)这对于谁需要推动该分支而言可能是一种痛苦。