我知道之前已经有人询问和讨论过这个问题,但我找不到解决此问题的正确工作流程。
假设我正在开发一个新项目,我想将其推送到 GitHub。 经过几次运行良好的提交和推送后,我继续编码和编辑,在某个时候我向我的项目添加了一些大于 100MB 的大文件(不知道或没有记住,当我尝试推送时这会导致问题)下一步)。
所以我这样做:
git add .
之后我会:
git commit -m 'some commit message'
最后:
git push
现在我遇到了麻烦,因为我收到远程错误:检测到大文件。
那么我的选择是什么:1. 保持项目更改和添加的文件处于活动状态;2. 从未来的提交中排除大文件。
我找到了用
git revert …
删除最后一次提交(我在其中添加了大文件等)的命令,但这不是我想要的,因为它还会删除我工作目录中的所有工作。
对于您眼前的问题,您想要重新调整/编辑:
git rebase -i HEAD~1
其中“1”是您的大提交的提交数量。例如,对于 3 次提交,我可能会得到一个 $EDITOR 界面,例如:
pick d187a63 Some bigass file and other stuff
pick d1dff5c Use https for remote service
pick e8a29cd Add honeybadger
# Rebase e99b72e..c564a67 onto e99b72e ( 3 TODO item(s))
#
# 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
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
通过操作非注释行,git 将对您的提交应用相应的操作。在您的情况下,您希望将 bigass 提交的“pick”更改为“edit”。然后您将回到命令行,处于中间变基状态,您可以:
git rm bigass.file # remove the file from the commit
git commit good.file other.file # make additional commit(s) w/ just the stuff you want
git rebase --continue # wrap up rebase
最后,说明所有未提交的文件(通过删除、排除或包含)和
git rebase --continue
。
注意:您还可以使用
.gitignore
忽略本地生成的文件而不影响 .git/info/exclude
。您可以在 .gitignore
中使用相同的条目,但它们永远不会被推送到远程或被覆盖。请注意:如果您错误地忽略了某些内容或忘记了您所忽略的内容,这可能会让您发疯!
更广泛地说,如果您想要打算对大文件进行版本控制,您可能有兴趣修改您的工作流程以使用git-lfs(大文件存储),以解决这个确切的问题。它将内容哈希/指针存储在 git 中,并将大量二进制文件存储在云数据存储中。它得到了 Github 和 Microsoft VSO(包括免费无限存储)等的支持。
这达到了与 Joe A 的答案相同的效果,只是它更简单,而且在我看来,对于不熟悉该地区的人来说更安全。
git reset --soft HEAD~
git rm
不应该提交的文件然后重新提交。请注意,乔的答案技术上没有任何问题,我已经投了赞成票;对于这样一个简单的问题来说,这太过分了,而且过于复杂。但是,如果您的提交链包含 n>1 个提交,Joe 的答案将是您的最佳选择。因此,这更像是一种特殊情况,您可以做一些更安全的事情,因为这只是您最后一次操作出现问题。
据我了解,最后一次提交包含更改组合和一个大文件。如果您恢复该提交,这可能会使大文件看起来已经消失,但它仍然存在于历史记录中。因此,如果你推动,你可能仍然会遇到问题。如果您想从历史记录中删除大文件,但保留该提交中的其他更改,您可以对上次提交进行交互式变基并编辑它以删除大文件。