【问题标题】:Git: temporarily reverting pushed commit(s)Git:暂时恢复推送的提交
【发布时间】:2013-02-22 13:41:50
【问题描述】:

比如说,您已经推送了一些提交并将它们拉入生产环境,例如在您的服务器的 webroot 中。然后出了点问题。显然,通常您想要做的是将 webroot 中的文件暂时恢复到以前的状态,然后返回您的本地开发位置,修复损坏的地方,测试它,在损坏某些东西的提交之上提交并推送这些新的修复提交到主分支。然后再次转到生产 webroot 并将所有内容拉到最新提交,这样所有内容都已修复并正常工作。然后每个人都可以只拉主分支,而不必担心提交失败或重置 git head 或其他令人沮丧的事情。

那么:这是一种合法且安全的方法吗

在生产 webroot 中,在 master 分支上

>git log --pretty=format:"%h %ad | %s [%an]" --date=short

0fu83bd Wed Mar 6 17:47:42 2013 | Merge branch 'sample' [developer1]
fd442f8 Wed Mar 6 17:47:10 2013 | Some updates [developer1]
ad84471 Wed Mar 6 17:25:12 2013 | Added something [developer2]

找到您想要暂时恢复文件状态的提交,例如 ad84471

>git checkout ad84471
>git branch
* (no branch)
  master

去任何你开发、修复、提交、[合并]、推送主分支的地方。当您这样做时,生产文件处于 ad84471 状态并且没有人修改它们。然后回到生产 webroot:

>git checkout master
>git pull
>git branch
* master
>git log --pretty=format:"%h %ad | %s [%an]" --date=short
7guffbd Wed Mar 6 17:47:42 2013 | Fixed 0fu83bd bugs [developer1]   <---new commit
0fu83bd Wed Mar 6 17:47:42 2013 | Merge branch 'sample' [developer1]
fd442f8 Wed Mar 6 17:47:10 2013 | Some updates [developer1]
ad84471 Wed Mar 6 17:25:12 2013 | Added something [developer2]

现在我们在 master 分支中,一切正常。每个人都只需拉出最新的更改,就可以开始了。

我已经使用 md5deep 检查了文件,以确保一切都返回(在修复之前)到我们恢复的状态:

>md5deep -rel webroot > hashes_master_before_checkouting_ad84471
>git checkout ad84471
>git checkout master
>md5deep -rel webroot > hashes_master_after_checkouting_master_again

仅显示这些哈希之间的差异

webroot/.git/logs/HEAD
webroot/.git/index

变了。

所以这似乎是一个快速修复问题的好方法,还是我错了?

免责声明:我知道在很多项目中这与预期的工作流程背道而驰,而且这种做法不是很好,而且之前应该有自动化测试,但对于开发人员很少的小型项目,通常不会可能或实用,因此与使用 git reset 或 revert 相比,此方法可以节省大量时间并简化事情。

【问题讨论】:

    标签: git reset undo revert


    【解决方案1】:

    对我来说,紧急修复似乎很好。

    如果您想更加“严谨”,您可以改为从“已知良好”提交创建一个分支并在生产环境中检查它,因为它会留下更多的审计线索。

    在开发机器上:

    git branch hotfix-20130307 ad84471
    git push origin hotfix-20130307
    

    在生产机器上:

    git fetch
    git checkout hotfix-20130307
    

    那么在master分支修复后,在prod机器上再次checkout master并更新即可:

    git checkout master
    git pull
    

    这样做的好处是,如果有人去生产机器并运行git branch,他们会得到更多信息,并且大概可以在错误跟踪器中找到hotfix-20130307 分支的一些记录,并知道为什么这样做.如果这是一个小团队,并且唯一可能查看 prod 机器的人已经知道情况如何,那么这可能是矫枉过正。

    【讨论】:

    • 谢谢!我是否可以得出结论,我描述的方法和您的方法都不会导致将来出现问题?
    • 他们不应该,我什至会说他们不能。没有必要做你所做的md5 检查(除了让自己放心),因为 Git 保证文件将在您检查某些内容时恢复到完全正确的内容,并且如果文件包含未提交的更改,它会大声喊叫。检查以前的提交,检查分支头,拉取等都是非常明确的操作,不能让文件处于不良状态,它们会准确地告诉你存储库中的内容
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 2020-04-02
    • 2021-03-26
    • 2022-06-14
    • 2013-12-17
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多