Git - 不小心提交并推送了数千张图片 - 如果没有提交我该如何推送?

Git - accidentally committed and pushed thousands of images - how to I push without that commit?

我不小心提交了并推送了 几千张图片,直到大约十分钟后我才注意到,直到推送为止。我中途取消了它。

我删除了有问题的图像,添加并提交,并希望在没有臃肿提交的情况下再次推送。

gitk 截图

输入git revert (unwanted commit hash) 您可以使用 git log —oneline 获取不需要的提交哈希,以获取提交哈希,例如 cdb76bf

你试过了吗git rebase -i HEAD~2 它将打开您的默认文本编辑器,以便您可以 select 您想要的提交。 您可以使用 git log —oneline 检查,您不会在那里看到提交

不完全确定这会奏效,但如果我足够快地抓住它,我会这样做。当它变得太旧时,您会遇到删除新提交依赖于它的文件的问题。

git rebase -i HEAD~5

这将提取最后 5 次提交。将好的保留为“pick”并使用 'd' 或 drop 作为坏的。只需编辑错误提交的“选择”文本。这些选项都在这里可用:https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History。我建议您查看名为“删除提交”的部分。

在 vim 中输入“!wq”后,请按照剩余说明进行操作。请注意,前三个将在以后出现,因为它需要重建,后面的一个是基于错误的提交等。

完成后,请执行 git log --oneline 以检查一切是否符合预期。

根据你的说法,我认为git reset --soft是正确的选择。

不确定这次提交的哈希是什么,但你会想要做的: git reset --soft abcdefg

其中 abcdefg 是错误提交的哈希值。

这将撤消您最近的所有更改,包括错误的提交。

您可能会发现此页面有用:https://www.git-tower.com/learn/git/faq/undo-last-commit/

一样,我也相信交互式变基是解决问题的方法。但是,为了更容易更正 just 错误添加的文件,我会使用稍微不同的路径。

你的图片——无法正确剪切和粘贴,所以我什至没有尝试过——显示你有四个提交,哈希 ID 未知(gitk 将它们放在别处) ,在 origin/master:

标识的提交之后
  • 其中第一个是“错误的”提交,它包括想要的更改,但也添加了所有这些图像文件。我们现在假设它的哈希 ID 以 1111111 开头。它的提交消息以“移动的成员、旅游和视频文件夹在一个新的...中”开始。

  • 第二次到第四次提交都是好的。现在我们假设它们的哈希 ID 是 222222233333334444444.

如果你运行:

git rebase -i origin/master

您的 Git 会将这四个提交的哈希 ID 列出到某处的临时文件中。然后它将准备一条指令 sheet,除了描述如何使用它的注释之外,它会读取:

pick 1111111 moved members, tour and vod folders inside a new ...
pick 2222222 deleted tour content
pick 3333333 adds tour/content to gitignore
pick 4444444 deletes unused asset images

rebase 的工作方式——交互或非交互——是复制原始提交到新的和改进的提交。至少,我们希望新副本得到改进。复制的确切机制取决于您的 Git 版本,但是 interactive rebase 主要使用 git cherry-pick,这通常是执行此操作的最佳方式。这就是为什么您看到的命令是 pick 个命令:它们的意思是 现在做一个 cherry-pick 。 Git 进行重置以倒回您命名的提交,在本例中为 origin/master 指向的提交,然后使用重复的 cherry-picking 来重新获得想要的提交。

Git 所需要做的就是合并 提交4444444 和提交1111111。为此,您需要:

  1. 移动四个命令的顺序;然后
  2. 更改 提交的哈希 ID 显然不是 4444444,但我们一直在调用它,因此 command这里是squash.

生成的指令 sheet 包含:

pick 1111111 moved members, tour and vod folders inside a new ...
squash 4444444 deletes unused asset images
pick 2222222 deleted tour content
pick 3333333 adds tour/content to gitignore

这告诉 git rebase -i,与其 只是 挑选提交 1111111,不如 合并 提交1111111 提交 4444444。将两者结合后——在这种情况下,这将导致保留你想要的更改,但删除意外添加的文件——Git 将在你的编辑器上打开一个建议提交消息,该消息由来自提交的两个提交消息组成 11111114444444。您的工作是将其编辑为新的和改进的提交消息,用于此新的和改进的提交。

我们不知道这个新的和改进的提交会有什么哈希 ID,但为了具体起见,我们假设它是 5555555。完成该提交后,您的 Git 将继续挑选提交 2222222 到新的和改进的提交。在这种情况下,改进将是它出现在 5555555 之后:否则,它所做的一切都与 2222222 相同。然后 Git 将继续将提交 3333333 复制到新的和改进的提交中。和以前一样,实际的改进只是出现在正确的地方。

复制所有提交后,您的 Git 将采用分支名称 master 并使其标识最后一次提交。我们不知道数字是多少,但为了具体起见,我们分别称这三个新的和改进的提交为 555555566666667777777。因此,在 origin/master 上的 last 提交之后,您现在将有 three 提交,而不是四次提交。这三个提交将是 rebase 产生的三个提交。

原始的四次提交序列将保留在您的 存储库中,并且可以恢复至少一个月左右。如果由于某种原因三次提交序列有缺陷(例如,可能您在 4444444 中删除了太多文件,或者删除了太少文件),您可以使用它。但是,如果新的三次提交序列一切正常,您现在可以继续使用它。