将git的“production branch”正确地拉到生产服务器的方式

27
我对Git还比较新,已经阅读了Pro Git书籍 @ http://git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging。我的问题是,我今天所做的是否是与生产服务器和远程Git仓库一起工作的首选方法。
我将我的仓库托管在GitHub上,使用三个远程分支:developing -> testing -> master。
每当“testing”分支被验证工作正常后,我会在本地使用git merge “master”和“testing”(快进?),然后将“master”用git push推送到GitHub。
在生产服务器(/opt/www/url.com/)上,我已经完成了:
git init
git remote add origin https://github.com/.....
git pull origin master

现在,每当我想更新主分支时,我都会执行 git pull 命令。

git pull origin master

生产环境将永远不会推送任何更改到远程, 本地也不会发生更改。我这样做对吗?如果不是,那么最好的方法是什么,可以将更新引入到生产环境?

编辑#1: 我不想在生产服务器上处理任何冲突(不知怎么搞的我现在面临这个问题了)。我只是想拉取最新的主分支,并切换到它。

1个回答

30

对于这个问题,进行'git pull'是相当普通的,但有一种更加可靠的方法。

如果你没有进行本地更改,就不会出现任何冲突。但如果你只想获取最新的树,并消除任何本地更改,那么有一种更好的方法,它会忽略任何本地更改:

首先,你需要从服务器获取最新版本。与其使用'git pull',我们将使用:

git fetch origin master

这是执行 "git pull" 的前半部分(第二部分是合并到您的本地 master 分支,这就是出现问题的地方)。

Git fetch 执行以下操作:

  1. 查找远程主分支所指向的提交
  2. 下载该提交及其引用的本地未具备的所有内容。
  3. 更新 origin/master 引用以指向此提交,以便记住远程主分支版本的位置。

接下来,我们将简单地更新本地的 "master" 分支,使其指向相同的提交,并更新我们的工作树。

为此,我们将使用:

git reset --hard origin/master

(假设您没有使用不同于默认的“origin”的远程仓库名称-如果是,请相应地进行调整。)

这实际上执行了三个操作:

  1. 将您的本地主分支更新为指向刚从远程获取的提交。
  2. 将该树加载到您的索引中
  3. 将您的工作树更新以与索引匹配。

现在,您拥有一个与远程匹配的本地主分支和树。

但还有一步是清除任何未被git跟踪的剩余内容。

git clean -fdx

将删除先前生成的任何文件并提供一个干净的环境。无论如何,您都应该将要保留的构建工件复制到其他位置。

'git pull'旨在协调开发人员的工作,因此它并不是这项工作的理想工具。 'git fetch'和'git reset --hard'更加特定,没有保护本地工作免受意外覆盖的功能。

但这正是你在这里想要的。

尽管如此,如果您有时会更改以解决生产服务器上的问题,则可能希望继续使用'git pull'。合并和可能的冲突可能比有害更有帮助。

但有时您只需要可靠的更新作为自动化的一部分,并且任何本地更改都是需要消除的问题。

但是,甚至在'git pull'中您可能也需要使用'git clean'。剩余的文件可能会以神秘和难以识别的方式破坏构建和部署。


不要按照这些步骤,否则会导致我的服务器崩溃。 - Mohamed Raza
正如我所说,只有在您想要清除本地更改时才应该执行此操作。如果您不将服务器代码和服务器数据分开,则更新没有简单的解决方案。日志文件、数据文件、临时文件等都应该存储在另一个位置。 - Bob Kerns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接