在初始提交中添加文件而不创建新提交

时间:2016-03-04 10:00:13

标签: git

我做了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图变为按照下面的给定图像

git graph

我的存储库的当前图表如下所示

enter image description here

查看前两个提交,它与master分离。我想要去包围的哈希。 git rebase给我以下错误

$ git rebase -i head~5
fatal: Needed a single revision
invalid upstream head~5

2 个答案:

答案 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

使用什么rebase?

它曾用于在历史记录之上应用提交,但在某些情况下(这样)也用于重写历史记录

什么是-i flag?

它用于启动一个交互式过程,其中将向您显示编辑器(如vi)以及您可以从不同选项中进行选择的位置

为什么要头~5

因为您需要重写最近五次提交的历史记录

<小时/>

接下来我该怎么做?

通过互动式变基,会向您显示此类内容

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(例如)是标识提交的哈希。

现在您可以选择如何处理您的提交。如果您需要前四个提交只有一个,则可以应用fixupsquash(请参阅上面的命令)。

凭借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,或者其他什么)这对于谁需要推动该分支而言可能是一种痛苦。