我知道这已经被问过并在前面讨论过了,但我找不到适合这个问题的工作流程。
假设我正在开发一个我想推送到GitHub的新项目。 在一些提交和推送运行良好后,我继续编码和编辑,并在某些时候我添加一些大于100MB的大文件到我的项目(不知道或记住,这将导致问题时我会尝试在下一步推动它。)
所以我这样做:
git add .
之后我做了:
git commit -m 'some commit message'
最后:
git push
现在我遇到了麻烦,因为我收到远程错误:检测到大文件。
那么我的选择是1.保持我的项目更改和我添加的文件处于活动状态2.从未来的提交中排除大文件文件。
我找到了用git revert …
删除最后一次提交(我在其他地方添加了大文件)的命令,但这不是我想要的,因为它还删除了我工作目录中的所有工作
答案 0 :(得分:1)
对于您的直接问题,您想要改变/编辑:
git rebase -i HEAD~1
其中“1”是你的bigass提交的提交次数。例如,对于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提交更改“选择”以“编辑”。然后,您将返回命令行,处于一个中间状态,您可以:
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
中的same entries,但它们永远不会被推送到远程或覆盖。要注意:如果你不正确地忽略某些东西或忘记你忽略的东西,这会让你发疯!
更广泛地说,如果执行打算对大型文件进行版本化,您可能有兴趣修改工作流程以使用git-lfs(大文件存储),解决这个问题。它将内容哈希/指针存储在git中,并将大量二进制文件存储在云数据存储区中。它得到了Github和Microsoft VSO(包括免费无限存储空间)等支持。
答案 1 :(得分:0)
据我了解,最后一次提交有一组变化加上一个大文件。如果您还原该提交,可能会使大型文件看起来不见了,但它仍然存在于历史记录中。所以,如果你推,你可能仍然有问题。如果要从历史记录中删除大文件但在该提交中保留其他更改,则可以对该最后一次提交进行交互式rebase并编辑它以删除大文件。
答案 2 :(得分:0)
这实现了与Joe A的答案相同的效果,除了它更简单,并且在我看来,对于不熟悉该区域的人来说它更安全。
git reset --soft HEAD~
这将取消提交,但将所有已经提交的内容保留为暂存状态
然后git rm
不应该提交的文件,然后重新提交
现在你应该能够推动。
请注意,Joe的回答中有技术上没有错误,我已经对它进行了投票;对于这样一个简单的问题,它只是矫枉过正而且过于复杂。但是,如果您的提交链包含n> 1,那么Joe的回答将是您的最佳选择。所以这更像是一个特殊情况,你可以做一些更安全的事情,因为它只是你最后一次操作有问题。