使用Git进行团队开发
2016-05-01 00:01
477 查看
工具准备
操作系统中已安装Git,个人比较喜欢命令行操作,所以即使Windows下也习惯使用Git Bash。项目准备
选择服务器
需要有一个存放在Git服务器中的项目,不限于Github和CSDN中的CODE。举例:
git@github.com:username/project.git
或者:
https://github.com/username/project.git
以上是同一个Github项目的SSH和HTTPS两种路径,不赘述。
如果搭建私服,可以使用
git init --bare project.git创建。
创建项目
本文以GitHub项目例:git@github.com:username/project.git
然后在本地克隆项目代码:
git clone git@github.com:username/project.git
查看项目分支情况可以使用命令
git branch:
$ git branch * master
可以看到当前项目坐在的分支是master(*号后边为当前所在分支名)。
而且项目目前也只有一个分支,就是master。
团队开发
但是我们在实际项目开发中,通常都是以团队开发为主,所以为了维护线上主干代码的稳定,我们也都会采取创建分支-开发-测试-合并-上线的形式进行实际操作的。所以接下来描述一下简单的团队开发Git项目。本地分支
工程师Alice需要对原来的代码做改动,这是她需要创建一个分支,名字为develop:$ git branch develop $ git branch develop * master
这个时候我们看到本地工作区已经有两个分支:master和develop。但当前工作区还是在master上(注意*号位置),需要手动切换到develop上。只需使用
git checkout命令
$ git checkout develop Switched to branch 'develop' $ git branch * develop master
这样就将当前工作区切换到新的分支中,我们可以发现此时的develop分支中的内容是master的复制。
当然有人希望创建分支后直接切换到新的分支:
$ git checkout -b develop Switched to a new branch 'develop'
远程分支
现在的develop分支只是存在于Alice的本地环境,当工程师Bob打算协同Alice进行相同业务的开发时,他也需要拿到develop分支的代码,那该怎么获取呢,此时需要Alice将本地分支编程远程分支,以供给其他工程师共同开发。使用
git branch -a能够查询当前所有分支,包括本地分支和远程分支(下边remotes/origin开头)
$ git branch -a * develop master remotes/origin/HEAD -> origin/master remotes/origin/master
发现并没有远程分支里并没有新建的develop,这是需要执行
git push origin develop命令,将本地develop分支推送到Git服务器,生成远程分支。
$ git push origin develop Total 0 (delta 0), reused 0 (delta 0) To git@github.com:username/project.git * [new branch] develop -> develop
这是再用
git branch -a查看分支。
$ git branch -a * develop master remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/master
可以看到多了一个名为
remotes/origin/develop的分支,即为创建的远程分支。
好了,现在Bob和其他任何工程师都可以通过拉取远程分支获取Alice创建的develop分支代码。
Bob先做一次分支查询
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/master
发现存在
remotes/origin/develop远程分支。
此时只需执行
git fetch origin develop:develop将远程分支代码拉取到本地.。
$ git fetch origin develop:develop From github.com:username/project * [new branch] develop -> develop $ git branch -a develop * master remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/master
再通过查询可以看到本地多了一个develop本地分支。
git fetch origin develop:develop这个命令的意思是将远程develop分支代码拉取到本地develop分支中。这是一个快捷的方式,如果Bob本地没有develop分支,该命令会创建一个名为develop的分支,如果Bob本地有自己的分支,如Bob_dev,则可以执行
git fetch origin develop:Bob_dev或者先切到Bob_dev分支内,执行
git fetch origin develop即可。
多人开发
此时Alice和Bob就可以切到本地develop分支进行开发了(
git checkout develop)。
1. 开发过程中每个工程师在推送代码之前要先执行拉取操作,因为远程仓库有更新的话,不先拉取(pull/fetch)是无法推送(push)的,尽量少使用
git pull进行拉取,而是先用
git fetch拉取在进行
git merge。
2. 在每个开发阶段都及时地提交代码(
git commit)并推送(
git push)至远程仓库,可以使用
git status检查工作区是否还有未处理的代码和文件。在提交代码的时候写好优秀的注释(
git commit file -m 'Alice fix bug in filename')。
3. 在项目代码将要合并到主干master的时候,要由一名工程师做最后的合并处理,如创建分支的Alice。由于在合并代码时极易产生冲突,所以一定要先与主干代码版本做对比(
git diff),合并时可以使用
git merge,当然如果develop可以废除的话,也可以使用
git rebase做最后的合并。
4. 最后在分支代码合并到主干或者代码上线后,develop分支完成了自己的任务,可以删除本地分支和远程分支。
删除本地分支:
$ git branch -d develop
Deleted branch develop (was 1fe1352).
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/master
删除远程分支:
$ git push origin --delete develop To git@github.com:username/project.git - [deleted] develop $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master
解决冲突
在代码的合并阶段(git pull或者
git merge命令),通常会产生代码冲突。如果是其他工程师造成的冲突,需要转给相关工程师处理,也造成大量的沟通成本。为了减少冲突,建议每个工程师各自单独负责模块,业务互相不冲突。
在解决冲突时,需要使用
git log和
git diff来检查历史版本的修改信息
$ git log README.md commit 265886db0d6868cc669e0ef253e6e9ac1e39319c Author: Alice <alice@mail.com> Date: Sat Apr 30 23:38:27 2016 +0800 chenge readme commit 1fe13525fa14a4234accd9c345c2a85fd1b30b09 Author: Bob <bob@mail.com> Date: Sat Apr 30 17:06:12 2016 +0800 Create README.md
git log可以列出该文件的历史提交版本,能看到提交的版本号和提交的注释信息。
然后使用
git diff来对比该文件两个版本的不同。
$ git diff 265886db0d6868cc669e0ef253e6e9ac1e39319c 1fe13525fa14a4234accd9c345c2a85fd1b30b09 README.md diff --git a/README.md b/README.md index a760469..d879d21 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # testRepository -project Repository +Test Repository
需要回退到某一版本,可以使用
git reset命令
$ git reset --hard 265886db0d6868cc669e0ef253e6e9ac1e39319c HEAD is now at 265886d chenge readme
如果文件尚未提交,也可以用
git checkout filename恢复到提交前。
$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README.md no changes added to commit (use "git add" and/or "git commit -a") $ git checkout README.md $ git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean
开发规范
git config --global user.name "<用户名>"。
git config --global user.email "<电子邮件>" 。
团队开发禁止在主干直接修改代码,一定要开分支,而且是远程分支进行开发。
创建分支可以打标签,
git tag。
拉取代码时最好先
git fetch再
git merge而不是直接
git pull。
提交代码和推送代码以及代码上线之前,一定要先和原来版本对比
git diff。
提交代码加注释
git commit -m 'Bob developed'。
最后,由于本人经验尚浅,文章写得也是简单的团队开发流程,所列出的也都是基本的Git命令,所以并没有加以详解。
很多大型团队都会使用Git Flow工作流模式和GitLab等工具,以后也会抽时间研究和使用。
本文纯属抛砖引玉,如有谬误和不足,欢迎指正,希望能和广大Git爱好者有更多的交流。
相关文章推荐
- 大道至简阅读笔记08-完结
- ubuntu 下扫描同一局域网的IP
- 接地
- 网络编程学习——数据链路访问
- 网络编程学习——客户/服务器程序设计范式(一)
- 网络编程学习——一些辅助函数
- Go 性能优化技巧 5/10
- Go 性能优化技巧 7/10
- JAVA_TCP_HTTP_Get_Data_Baidu
- UWP 部署失败,因为未检测到任何Windows Phone (ARM->Device)
- ELK安装使用
- hibernate 关于联合主键
- Bestcoder #82 Div2 ztr loves lucky numbers(next_permutation)
- Commission
- Selenium 测百度
- Centos7 修改运行级别
- Unity3d之Animation(动画系统)
- 该不该详细打日志
- 又开始折腾装 Linux 虚拟机了
- centos下postgresql安装使用