如何在git中删除最后两个提交并将我的提交1作为工作目录中的更改?

时间:2016-02-11 10:55:21

标签: linux git version-control

以下是该方案:

  1. 在一个小型的Ubuntu Web服务器上,我运行了一个git服务器。该网站从git存储库中签出。我添加并提交了大量更改。 Git diff显示更新了50多个代码文件和20000多个图像文件。我没有太注意这个想法,这些应该被忽略,我的错。有点愚蠢,但我认为将所有更改作为批量提交是最快的。我们称之为提交A
  2. # Commit A git add . git commit -m "Changes so far in this year"

    1. 我发现我忘了排除工作/输出文件(大量生成的图像)​​。除了这些文件(大约20000),我有大约50多个代码更改的文件。

    2. 在线阅读和git手册后,我明白最好的办法是更新.gitignore并生成要删除和删除缓存的文件列表。这应该从提交而不是本地文件夹中删除。让这个提交B

    3. # Commit B vi .gitignore git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached git add . git commit -m "Cleanup of generated files from commit history"

      1. 麻烦的是,现在我的git push失败并出现以下错误
      2. git push origin master Counting objects: 19219, done. error: pack-objects died of signal 9 error: pack-objects died with strange error error: child process died of signal 9 error: died of signal 9 error: failed to push some refs to '/srv/gitrepositories/xxxx.git'

        对此question about error 9的回答表明,这可能是因为git内存不足。

        我的选择?

        • 承诺A&承诺B由巨大的组成 对象的数量,看上面的计数似乎?
        • 有没有更好的方法来清除这个混乱的可能选项删除提交A&从历史中完全提交B并完成我的更改?
        • Idealy我想回到我的git diff仅报告50多个代码文件的阶段。图像现在被.gitignore
        • 忽略
        • Can I delete a git commit but keep the changes?这听起来像什么?对于提交A和提交B,我可以两次这样做吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用git reset HEAD~2永久清除历史记录中的最后2个提交,同时保留工作目录中的更改,然后git push -f强制将更改的历史记录推送到远程。

如果您的回购信息与他人共享,则不建议您更改提交历史记录。