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 是 2222222
、3333333
和 4444444
.
如果你运行:
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
。为此,您需要:
- 移动四个命令的顺序;然后
- 更改 提交的哈希 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 将在你的编辑器上打开一个建议提交消息,该消息由来自提交的两个提交消息组成 1111111
和 4444444
。您的工作是将其编辑为新的和改进的提交消息,用于此新的和改进的提交。
我们不知道这个新的和改进的提交会有什么哈希 ID,但为了具体起见,我们假设它是 5555555
。完成该提交后,您的 Git 将继续挑选提交 2222222
到新的和改进的提交。在这种情况下,改进将是它出现在 5555555
之后:否则,它所做的一切都与 2222222
相同。然后 Git 将继续将提交 3333333
复制到新的和改进的提交中。和以前一样,实际的改进只是出现在正确的地方。
复制所有提交后,您的 Git 将采用分支名称 master
并使其标识最后一次提交。我们不知道数字是多少,但为了具体起见,我们分别称这三个新的和改进的提交为 5555555
、6666666
和 7777777
。因此,在 origin/master
上的 last 提交之后,您现在将有 three 提交,而不是四次提交。这三个提交将是 rebase 产生的三个提交。
原始的四次提交序列将保留在您的 存储库中,并且可以恢复至少一个月左右。如果由于某种原因三次提交序列有缺陷(例如,可能您在 4444444
中删除了太多文件,或者删除了太少文件),您可以使用它。但是,如果新的三次提交序列一切正常,您现在可以继续使用它。
我不小心提交了并推送了 几千张图片,直到大约十分钟后我才注意到,直到推送为止。我中途取消了它。
我删除了有问题的图像,添加并提交,并希望在没有臃肿提交的情况下再次推送。
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/
与
你的图片——无法正确剪切和粘贴,所以我什至没有尝试过——显示你有四个提交,哈希 ID 未知(gitk
将它们放在别处) ,在 origin/master
:
其中第一个是“错误的”提交,它包括想要的更改,但也添加了所有这些图像文件。我们现在假设它的哈希 ID 以
1111111
开头。它的提交消息以“移动的成员、旅游和视频文件夹在一个新的...中”开始。第二次到第四次提交都是好的。现在我们假设它们的哈希 ID 是
2222222
、3333333
和4444444
.
如果你运行:
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
。为此,您需要:
- 移动四个命令的顺序;然后
- 更改 提交的哈希 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 将在你的编辑器上打开一个建议提交消息,该消息由来自提交的两个提交消息组成 1111111
和 4444444
。您的工作是将其编辑为新的和改进的提交消息,用于此新的和改进的提交。
我们不知道这个新的和改进的提交会有什么哈希 ID,但为了具体起见,我们假设它是 5555555
。完成该提交后,您的 Git 将继续挑选提交 2222222
到新的和改进的提交。在这种情况下,改进将是它出现在 5555555
之后:否则,它所做的一切都与 2222222
相同。然后 Git 将继续将提交 3333333
复制到新的和改进的提交中。和以前一样,实际的改进只是出现在正确的地方。
复制所有提交后,您的 Git 将采用分支名称 master
并使其标识最后一次提交。我们不知道数字是多少,但为了具体起见,我们分别称这三个新的和改进的提交为 5555555
、6666666
和 7777777
。因此,在 origin/master
上的 last 提交之后,您现在将有 three 提交,而不是四次提交。这三个提交将是 rebase 产生的三个提交。
原始的四次提交序列将保留在您的 存储库中,并且可以恢复至少一个月左右。如果由于某种原因三次提交序列有缺陷(例如,可能您在 4444444
中删除了太多文件,或者删除了太少文件),您可以使用它。但是,如果新的三次提交序列一切正常,您现在可以继续使用它。