Website Logo. Upload to /source/logo.png ; disable in /source/_includes/logo.html

舞乐 VOLER

舞动我人生

使用Git协同工作

Feb 18, 2016

本文没有深层次的分析Git的工作原理,而是从实用角度,关注常用命令,简单分析了执行命令时发生的具体动作。

建立本地仓库

从远端仓库克隆数据到本地仓库

1
git clone https://github.com/jemoii/Koenigspress.git Koenigspress

执行git clone命令,默认将远端仓库命名为origin

  • 拉取远端仓库的所有数据;
  • 创建一个指向远端仓库master分支的指针,并在本地将其命名为origin/master
  • 创建一个跟踪origin/master的本地master分支。

添加-o away选项,即执行

1
git clone -o away https://github.com/jemoii/Koenigspress.git Koenigspress

远端仓库被命名为away,相应的本地指向远端仓库master分支的指针被命名为away/master

回到上一步,可以通过git remote show origin查看远端仓库的相关信息,这里的origin即远端仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git remote
origin

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/jemoii/Koenigspress.git
  Push  URL: https://github.com/jemoii/Koenigspress.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

管理本地分支

现在执行git branch optimize_thememaster上新建optimize_theme分支,执行git checkout optimize_theme切换到optimize_theme分支上。

可以使用git checkout -b optimize_theme合并上述两步操作,执行git branch显示本地仓库分支列表,*标识当前位于optimize_theme分支

1
2
3
4
5
6
$ git checkout -b optimize_theme
Switched to a new branch 'optimize_theme'

$ git branch
  master
* optimize_theme

提交更新

修改文件后,执行git add .将修改内容添加到暂存区,接着执行git commit -m '提交主题优化'将修改内容提交到本地仓库

可以使用git commit -a -m '提交主题优化'合并上述两步操作。

现在使用git push origin optimize_theme将修改内容推送到远端仓库,远端仓库新建分支optimize保存修改内容

1
2
3
4
5
6
$ git push origin optimize_theme
Username for 'https://github.com': jemoii
Password for 'https://jemoii@github.com':
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/jemoii/Koenigspress.git
 * [new branch]      optimize_theme -> optimize_theme

现在执行git remote show origin查看远端仓库信息

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git remote show origin
* remote origin
  Fetch URL: https://github.com/jemoii/Koenigspress.git
  Push  URL: https://github.com/jemoii/Koenigspress.git
  HEAD branch: master
  Remote branches:
    master         tracked
    optimize_theme tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local refs configured for 'git push':
    master         pushes to master         (up to date)
    optimize_theme pushes to optimize_theme (up to date)

可以看到除了master分支,现在本地分支optimize_theme跟踪origin/optimize_theme

更新本地仓库

如果有另外一个协同者与我们一样克隆了远端仓库的数据到他的本地仓库,新建fix_bug分支,类似的将修改内容推送到远端仓库,且在我们执行git push前将修改内容合并到远端仓库的master分支,现在远端仓库master分支上的内容与我们执行git clone时相比发生了变化,我们再执行git push时会提示需要先将协同者的修改内容合并到我们的分支上。

首先执行git checkout master切换到master分支,执行git fetch origin

  • 从远端仓库获取本地仓库没有的数据,移动origin/master指针指向更新后的位置;
  • 创建一个指向远端仓库fix_bug分支的指针,并在本地将其命名为origin/fix_bug,本地不会新建fix_bug分支,只创建不可编辑的origin/fix_bug指针;

现在执行git merge origin/master将更新的数据合并到本地仓库的master分支,接着执行git checkout optimize_theme重新切换到optimize_theme分支,执行git merge master将更新的数据合并到本地仓库的optimize_theme分支。

现在执行git push origin optimize_theme可以将我们的修改内容推送到远端仓库。

回到上一步,在master分支上使用git pull可以合并git fetch origingit merge origin/master两步操作。

关于git merge

协同开发中创建工作分支的两种方式,第一种是前面提到的在本地仓库新建工作分支,执行git push时在远端仓库创建对应的工作分支;另一种是在远端仓库新建工作分支,执行新建/更新时在本地仓库创建指向远端仓库工作分支的指针,接着执行类似如下的命令,

1
git checkout -b fix_bug origin/fix_bug

在本地仓库创建fix_bug分支,跟踪origin/fix_bug,执行结束后切换到fix_bug分支。