【发布时间】:2011-01-20 14:06:03
【问题描述】:
我不小心提交了 log/test.log 但从未推送过它。我已经做了一个 git rm 来摆脱它。但是当我尝试推送时,我仍然会尝试传输大量数据。 git rm 不应该解决这个问题。如果没有,我该如何解决?
【问题讨论】:
标签: git
我不小心提交了 log/test.log 但从未推送过它。我已经做了一个 git rm 来摆脱它。但是当我尝试推送时,我仍然会尝试传输大量数据。 git rm 不应该解决这个问题。如果没有,我该如何解决?
【问题讨论】:
标签: git
不要恢复提交然后推送,因为巨大的文件仍然会在历史记录中携带。
鉴于您尚未推送它并且您要重做的提交是最新的,请从您的历史记录中删除该提交:
$ git reset HEAD^
这会将您的索引返回到它在父提交时所处的状态 (HEAD^)。现在你有一个调度:添加并提交你第一次想要的方式。
如果您进行了其他后续提交,则需要 git rebase -i <commit> 其中 <commit> 是错误提交的父级的 SHA-1。
例如(并注意 SHA-1 在您的存储库中会有所不同)
$ git rebase -i 57d0b28
会让你进入一个类似的编辑器
pick 366eca1 这个文件很大 选择 d975b30 删除 foo 选择 121802a 删除栏 # 将 57d0b28..121802a 重新设置为 57d0b28 # # 命令: # p, pick = 使用提交 # r, reword = 使用提交,但编辑提交信息 # e, edit = 使用提交,但停止修改 # s, squash = 使用提交,但融合到之前的提交中 # # 如果你在这里删除一行,COMMIT 将会丢失。 # 但是,如果你删除所有内容,rebase 将被中止。 #
将pick 替换为edit 在重提交的那一行
edit 366eca1 这个文件很大 选择 d975b30 删除 foo 选择 121802a 删除栏
保存并退出您的编辑器以返回您的 shell,您将在其中看到表单消息
停在 366eca1... 这有一个巨大的文件
您现在可以修改提交,使用
git commit --amend
对更改感到满意后,运行
git rebase --continue
从那里删除有问题的文件(--cached 仅从索引中删除该文件)
$ git rm --cached big-nasty-file rm '大文件'
修改提交
$ git commit --amend
并完成变基
$ git rebase --continue
【讨论】:
git log 或 gitk,例如。
如果您还没有推送,您可以使用git rebase -i 来编辑您的提交历史,同时删除add 和rm。需要注意的是,您必须小心不要编辑任何已推送的提交。
http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive
您询问如果提交中还有其他更改以及在此之后的其他提交,您是否仍然可以执行此操作。这取决于。您应该能够编辑/删除任何未推送的提交,而不仅仅是最近的。但是,如果以后的更改严重依赖于已删除提交中的更改(例如,您添加了一个文件,然后在以后的提交中对其进行了编辑),那么 rebase 可能会失败。如果您删除一个提交,您将丢失该提交中的所有更改。我不知道从提交中删除单个更改的方法。如果您不想丢失 test.rb 提交中的其他更改,您可以在删除提交之前生成一个补丁(使用 git show <commitid> > /tmp/patch 或内置 git patch 功能)。然后编辑您的补丁文件以删除大的 test.rb,但保留您想要的更改,然后将补丁重新应用到头部。
如果您遇到我之前提到的 rebase 失败的问题(或者您认为它会失败),您可以在问题提交后为 所有 的提交保存补丁,将它们全部删除,然后重新应用按顺序排列。
【讨论】: