dro*_*son 21 git github git-pull git-remote
我对Git很陌生,并且已经阅读了Pro Git的书@ http://git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging.我的问题是,如果我今天所做的是使用生产服务器和远程Git仓库的首选方式.
我有我的回购托管在GitHub上,使用三个远程分支:开发 - >测试 - >主.
每当"测试"分支被验证正在工作时,我git merge在本地"掌握"'测试'(快进?),并git push在GitHub上"掌握".
在生产服务器上(/opt/www/url.com/)我做了:
git init
git remote add origin https://github.com/.....
git pull origin master
Run Code Online (Sandbox Code Playgroud)
现在每次我想更新主人我发出一个 git pull
git pull origin master
Run Code Online (Sandbox Code Playgroud)
生产永远不会将任何变化推向远程.并且不会发生局部变化.我做得对吗?如果没有,那么将更新提升到生产的首选方法是什么?
编辑#1:我不想管理我现在面临的生产服务器上的任何冲突(不知怎的,我做错了什么).我只想下拉最新更新的主分支,然后切换到它.
Bob*_*rns 11
做'git pull'对此非常普通,但是有一种更加防弹的方式.
如果不以某种方式进行局部更改,就不会有任何冲突.但是如果你只是想获得一个最新的树,并吹走任何局部变化,那么有一种更好的方法,它会忽略任何本地的:
首先,您需要从服务器获取最新信息.而不是'git pull',为此,我们将使用:
git fetch origin master
Run Code Online (Sandbox Code Playgroud)
这是'git pull'的前半部分.(第二个是合并到你的本地主人,这是你遇到问题的地方).
Git fetch做了:
接下来,我们将简单地更新我们的本地"master"以指向相同的提交,并更新我们的工作树.
为此,我们将使用:
git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)
(假设您没有为远程仓库使用不同的名称,而不是默认的"原点" - 如果您这样做,则相应地调整).
这实际上做了三件事:
您现在拥有与远程匹配的本地主分支和树.
但是还有一个步骤,就是清理遗留下来的任何东西,这些都没有被git跟踪.
git clean -fdx
Run Code Online (Sandbox Code Playgroud)
将删除先前构建创建的任何文件,并为您提供干净的环境.在任何情况下,您都应该将要保留的任何构建工件复制到其他位置.
'git pull'旨在帮助开发人员协调他们的工作,所以它真的不是这项工作的理想工具.'git fetch'和'git reset --hard'更具体,没有防止意外覆盖当地工作的保护.
但这正是你想要的.
但是,如果您有时需要更改以修复生产服务器上的问题,您可能希望继续使用"git pull".合并和可能的冲突可能比有害更有帮助.
但有时您只需要可靠的更新作为自动化的一部分,任何本地更改都是一个需要消除的问题.
但即使使用'git pull',你也可能想要'git clean'.遗留下来的文件可能会以神秘且难以识别的方式搞乱构建和部署.
And*_*röm 10
你应该使用:
git init --bare
Run Code Online (Sandbox Code Playgroud)
要初始化一个没有工作树的仓库,这意味着不会发生冲突.