我对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:我不想管理我现在面临的生产服务器上的任何冲突(不知怎的,我做错了什么)。我只是想下拉最新更新的主分支,然后切换到它。
答案 0 :(得分:12)
您应该使用:
git init --bare
初始化一个没有工作树的仓库,这意味着不会有冲突。
答案 1 :(得分:6)
为此,做“ git pull”是很平常的,但是有一种更防弹的方法。
如果您不进行本地更改,就不会有任何冲突。但是,如果您只想获取最新的树并删除所有本地更改,则有更好的方法,它可以忽略任何本地内容:
首先,您需要从服务器获取最新信息。为此,我们将使用:
git fetch origin master
这执行“ git pull”的前半部分。 (第二个是合并到本地主机中,这是您遇到问题的地方。)
Git抓取确实做到了:
接下来,我们将简单地更新本地“主”以指向同一提交,并更新工作树。
为此,我们将使用:
git reset --hard origin/master
(这是假设您没有为远程仓库使用其他名称,而是默认的“来源”,如果您使用的话,请进行相应的调整。)
这实际上可以做三件事:
您现在有了与远程服务器匹配的本地主分支和树。
但是还有一个步骤,就是清除git不会跟踪的所有剩余内容。
git clean -fdx
将删除由先前版本创建的所有文件,并为您提供一个干净的环境。无论如何,都应将要保留的所有构建工件复制到其他位置。
'git pull'是针对开发人员协调其工作的,因此,它实际上并不是完成此工作的理想工具。 'git fetch'和'git reset --hard'更具体,没有防止意外覆盖本地工作的保护措施。
但这就是您想要的。
不过,如果有时要进行更改以修复生产服务器上的问题,则可能要继续使用'git pull'。合并和可能发生的冲突可能比有害更有益。
但是有时您只是希望可靠的更新作为自动化的一部分,因此任何本地更改都是要消除的问题。
但是,即使使用“ git pull”,您也可能希望使用“ git clean”。剩下的文件可以以神秘且难以识别的方式破坏构建和部署。