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

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做了:

  1. 查找远程控制主要指向的内容
  2. 提交的下载及其引用的您在本地没有的所有内容.
  3. 更新origin/master引用以指向该提交,以记住远程在其"master"版本上的位置.

接下来,我们将简单地更新我们的本地"master"以指向相同的提交,并更新我们的工作树.

为此,我们将使用:

git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

(假设您没有为远程仓库使用不同的名称,而不是默认的"原点" - 如果您这样做,则相应地调整).

这实际上做了三件事:

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

您现在拥有与远程匹配的本地主分支和树.

但是还有一个步骤,就是清理遗留下来的任何东西,这些都没有被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)

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

  • 如果生产服务器没有存储库的工作副本,它将如何工作? (2认同)
  • (我完全意识到问题和“答案”的年龄。答案仍然是错误的答案,可能会让人们感到困惑。OP 现在可能是 git 专家!)裸仓库在生产服务器上将毫无用处. 重点是获得一个最新的工作树来构建或运行。这个答案假设了一个完全不同的问题——你如何初始化一个远程服务器,就像你推入和拉出一样。但这与此用例无关,其中工作树是重点。 (2认同)