Github不会忘记删除的项目

时间:2015-07-30 19:34:58

标签: git github

我有一个非常简单的git问题,我无法理解。我最初尝试使用以下命令添加包含一些脚本的文件夹:

git init
git add folder
git commit
git push origin master

但是我没有意识到我在该文件夹中留下了一些太大而无法推送到github的东西,所以当然它失败了。

所以我从文件夹中删除了该项目并再次尝试。但令我惊讶的是,我得到了相同的错误,git认为我还有那么大的项目。所以我进去了,项目以某种方式回到了目录!!

我一遍又一遍地重复尝试,尝试删除,重置,我能想到的一切。无论我做什么,git都会以某种方式将这个大项添加回文件夹中,然后尝试将其与其他所有内容一起推送。

那么我做错了什么?我怎么能让git忘记这个大项目?!

3 个答案:

答案 0 :(得分:4)

你已经用一般的话说了一切,所以我大部分都在猜测。

首先,如果您在添加并提交文件夹中的大文件后立即意识到问题,并且未再提交任何提交,则git commit --amend是您的朋友。 git rm来自该文件夹的文件,使用--amend选项提交删除,并且在文件夹中提交大小的东西将获得更正/重写和大文件将从该提交中“永久”删除。坏消息是--amend仅适用于最新的提交。你不能--amend任何旧的提交最新的:

git add folder
git commit            ## oops!!
git rm folder\hugefile.zip
git commit --amend    ## uff

否则,如果你在那个糟糕的提交之后做了一些提交,请查看这些提交。如果所有值很低或没有值或者很容易重做,那么最好的方法是git reset删除/撤消所有内容,然后--amend提交使用上面的大文件,然后重做额外的提交。

git add folder
git commit -m AAA            ## oops, but I didn't notice yet
git add foo\bar
git commit -m BBB
git rm baz\boom
git commit -m CCC
# uh-oh, I just noticed the big file..
git log       # find the commit hash of 'AAA'
git reset --hard  THATCOMMITHASH
git rm folder\hugefile.zip
git commit --amend          # uff.. but BBB and CCC evaporated!
git add foo\bar
git commit -m BBB           # redo BBB
git rm baz\boom
git commit -m CCC           # redo CCC

(如果你很聪明,你也会从日志中记下BBB和CCC的提交哈希值,而不是手动重做它们,即使重置后你也可以git cherrypick,但我赢了现在钻研那个)

当然,这对大文件来说是不可行的。当然,如果您有任何未更改的本地更改,那么git reset --hard将会删除所有未经注册的本地更改。

如果以上这些都不适合你,那么,你需要更加努力。例如,如果您有本地更改,您不想丢失,先提交或存储它们,然后按上述方式执行第一种或第二种方式。如果您有许多提交但不能或不想手动重做它们,您可以使用rebase。

Rebase'编辑'(重写)提交的历史记录,具有以下功能:

  • 选择或忽略提交
  • 更改提交顺序
  • 压缩/合并提交为一个,类似于--amend

所以,要使用rebase:

  • 提交所有本地更改,不要删除大文件
  • 删除巨大的文件,将其作为单独的提交提交
  • 运行git rebase -i HASH_OF_ONE_COMMIT_BEFORE_HUGE_FILE_ADDED,这将运行“交互式rebase”并应打开带有“rebase plan”的文本编辑器
  • 在rebase计划中,找到添加文件的提交(应该是列表中的第一个),找到删除文件的提交(应该是列表中的最后一个)
  • 在rebase计划中
  • ,剪切并粘贴commit-that-deletes-the-file的pick行,并在添加文件的提交后立即移动
  • 将该提交的模式(pick)更改为fixup
  • 保存计划,让rebase继续

这将有效地“及时移动”文件删除提交在添加之后,然后将添加和删除合并到一个提交中(带有添加的消息)。实际上,就好像你记得当时那样。然而,实际上这将重写历史记录(顺便说一下,修正也会这样做),所以如果你曾经以某种方式设法推动任何原始 - 未重写的提交,那么其他人可能会在这样做之后对你生气。但是不应该这样,因为你提交大文件后你无法推送,对吗?

答案 1 :(得分:3)

当您将大文件添加到the index时,您需要使用git rm命令删除该文件,以便git不再跟踪该文件。有关完整说明,请参阅git help rm

答案 2 :(得分:2)

1)git log --oneline --decorate

第一行应该有HEAD(这是你的最后一次提交) 有些线条应该是origin/masterorigin/HEAD(这是你的遥控器的位置,因为你的推力没有通过)

由于您的提交太大,您不想还原它,但重置它(您不希望历史记录中的任何内容),以便其内容永远不会被推送。

您可以重置它,因为它尚未推送。

2)在日志中,找到您添加大文件之前的提交并复制哈希(7个字符,例如:e565r44)。

3)重置为此提交:git reset --hard e565r44(使用您的哈希值)

4)检查您的历史记录:git log --oneline --decorate(以及您的工作目录)。

然后你应该能够推动。

警告:这会删除HEADe565r44之间的所有提交,但据我了解,您只做了一次(如果你搞砸了也可以恢复,不要忧)。