我不小心提交了log / test.log但从未推过它。我已经完成了一个git rm来摆脱它。但是当我尝试推送时,我仍然会收到大量试图传输的数据。不应该git rm解决这个问题。如果没有,我该如何解决?
答案 0 :(得分:11)
不要还原提交然后推送,因为巨大的文件仍将在历史记录中随身携带。
鉴于您尚未推送它并且您要重做的提交是最新的,请从历史记录中删除该提交:
$ git reset HEAD^
这将使您的索引返回到父提交(HEAD^
)所处的状态。现在你有一个重新调整:第一次添加和提交你想要的方式。
如果您已经进行了其他后续提交,则需要git rebase -i <commit>
其中<commit>
是错误提交的父级的SHA-1。
例如(注意SHA-1在您的回购中会有所不同)
$ git rebase -i 57d0b28
会让你进入一个类似于
的编辑器pick 366eca1 This has a huge file pick d975b30 delete foo pick 121802a delete bar # Rebase 57d0b28..121802a onto 57d0b28 # # 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 # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
使用重度提交
替换pick
和edit
edit 366eca1 This has a huge file pick d975b30 delete foo pick 121802a delete bar
保存并退出编辑器返回shell,在那里您将看到表单
的消息Stopped at 366eca1... This has a huge file You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue
从那里删除有问题的文件(--cached
仅从索引中删除文件)
$ git rm --cached big-nasty-file rm 'big-nasty-file'
修改提交
$ git commit --amend
并完成rebase
$ git rebase --continue
答案 1 :(得分:2)
如果您尚未推送,则可以使用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失败的问题(或者您认为它会失败),您可以在提交问题后保存提交的所有补丁,删除所有补丁并重新应用他们按顺序。