1

比如说,您已经推送了一些提交并将它们拉入生产环境,例如在您的服务器的 webroot 中。然后出了点问题。显然,您通常想要做的是将 webroot 中的文件暂时恢复到以前的状态,然后返回您的本地开发位置,修复损坏的地方,测试它,在损坏的提交之上提交并推送这些新的修复提交到主分支。然后再次转到生产 webroot 并将所有内容拉到最新提交,这样所有内容都已修复并正常工作。然后每个人都可以拉出 master 分支,而不必担心提交失败或重置 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 相比,此方法可以节省大量时间并简化事情。

4

1 回答 1

2

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

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

在开发机器上:

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 机器的人已经知道情况如何,那么这可能是矫枉过正。

于 2013-03-07T11:29:55.667 回答