将git“生产分支”拉到生产服务器的“正确”方式

时间:2012-10-30 09:00:32

标签: git github git-pull git-remote

我对Git很陌生,并且阅读了Pro Git书@ http://git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging。我的问题是,如果我今天所做的是使用生产服务器和远程Git仓库的首选方式。

我在GitHub上托管了我的仓库,使用了三个远程分支:开发 - >测试 - >主

每当'testing'分支被验证有效时,我git merge'掌握'在本地进行'测试'(快进?),并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:我不想管理我现在面临的生产服务器上的任何冲突(不知怎的,我做错了什么)。我只是想下拉最新更新的主分支,然后切换到它。

2 个答案:

答案 0 :(得分:12)

您应该使用:

git init --bare

初始化一个没有工作树的仓库,这意味着不会有冲突。

答案 1 :(得分:6)

为此,做“ git pull”是很平常的,但是有一种更防弹的方法。

如果您不进行本地更改,就不会有任何冲突。但是,如果您只想获取最新的树并删除所有本地更改,则有更好的方法,它可以忽略任何本地内容:

首先,您需要从服务器获取最新信息。为此,我们将使用:

git fetch origin master

这执行“ git pull”的前半部分。 (第二个是合并到本地主机中,这是您遇到问题的地方。)

Git抓取确实做到了:

  1. 查找提交主机指向远程主机的内容
  2. 下载提交的内容以及它在本地没有引用的所有内容。
  3. 更新源/主引用以指向该提交,以记住遥控器在其“主”版本上的位置。

接下来,我们将简单地更新本地“主”以指向同一提交,并更新工作树。

为此,我们将使用:

git reset --hard origin/master

(这是假设您没有为远程仓库使用其他名称,而是默认的“来源”,如果您使用的话,请进行相应的调整。)

这实际上可以做三件事:

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

您现在有了与远程服务器匹配的本地主分支和树。

但是还有一个步骤,就是清除git不会跟踪的所有剩余内容。

git clean -fdx

将删除由先前版本创建的所有文件,并为您提供一个干净的环境。无论如何,都应将要保留的所有构建工件复制到其他位置。

'git pull'是针对开发人员协调其工作的,因此,它实际上并不是完成此工作的理想工具。 'git fetch'和'git reset --hard'更具体,没有防止意外覆盖本地工作的保护措施。

但这就是您想要的。

不过,如果有时要进行更改以修复生产服务器上的问题,则可能要继续使用'git pull'。合并和可能发生的冲突可能比有害更有益。

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

但是,即使使用“ git pull”,您也可能希望使用“ git clean”。剩下的文件可以以神秘且难以识别的方式破坏构建和部署。