个人认为,Git是对开发人员沟通协作要求更高的源代码版本管理系统,使用元数据来管理代码。
Git不同于集中式的SVN,是一种分布式的源代码管理系统,Git在本地有完整的代码仓库,在本地也可以实现版本控制和分支管理。通过添加远程仓库的的方式,就可以实现Git所推崇的多分支多仓库的源代码版本管理理念。
在第一次在团队正式任务中引入使用之前,进行过几次局部尝试,逐步的了解了一些Git的基本操作和原理,也看过一些文章,知道有Gitlab-flow、Github-flow、Feature Branch等常用的Git工作流,一直在平时的工作中进行小的尝试。
正好在结合使用CI集成环境,进行快速开发的过程中,在团队中尝试推行了一次Git工作方式,使用的过程中也没有要求一上来就能达到某种工作流的最佳实践,以解决实际开发中的团队协作开发作为知道方针,进行开放的探索;结果在使用过程中,收获非常大, 基本上在过程中掌握了所有常用的Git命令和工具。记录下这次学习探索之旅,分享出来,希望对有兴趣学习Git的人有帮助。
1、项目的创建
这次开发的demo项目要使用某个CI工具进行自动化构建,并且一键部署到演示服务器上,所以选用了可以免费创建代码库的Gitlab,配合Gitlab CI进行开发和演示;这里用到里代码库创建和远程库跟踪的命令
git init
git remote add origin https://git.coding.net/liuwill/webPageTest.git
git pull
当然如果本地还没有任何代码,可以使用git clone来直接克隆远程库git clone https://git.coding.net/liuwill/webPageTest.git
。
2、第一次提交代码
在Git的原理里面,新创建或者编辑过的代码,是在工作区里面,而提交的意思,就是将代码保存到本地仓库,中间有一个暂存区,要提交的代码必须先添加到暂存区,才能提交到本地仓库。具体用到了add和commit命令;在提交代码之前,涉及到的操作包括:将文件添加到暂存区,提交暂存区的代码到本地存库;添加新文件;删除错误添加的文件。
git add .
git commit -m 'first commit'
执行过程中,可以使用git status
命令,查看当前的工作区和暂存区的情况。
如果在过程中,修改了某个文件,或者添加了新文件,可以执行命令git add filename
,将文件添加在暂存区。如果添加暂存区之后,不想重新发起一次commit,可以git commit --amend
,这样可以把暂存区的文件,合并到上一次commit中。
此外还可以使用git rm filename --cached
来将添加到暂存区中的文件,从暂存区移除,但是保留本地副本。
3、将修改过的代码推送到远程仓库
完成代码编辑和本地仓库的代码提交之后,就可以将代码推送到远程仓库
git remote -v
git push origin master
第一个命令可以查看本地仓库中已经添加的远程仓库;第二个命令,将本地的master分支推送到origin命名的远程仓库,且使用master分支;如果添加-u参数,那么origin/master就会设为本地master分支的跟踪分支;如果不想推送到远程仓库的master分支,执行git push origin master:develop
,可以把本地的master分支推送到远程仓库的develop分支上。
4、创建新分支
在开发过程中,git推荐使用多分支进行开发,根据不同的工作流,可以有不同的分支命名规范可以采用;
通常可以默认采用git flow进行开发;
1、一般会在develop分支中进行开发,然后在发布的时候,将代码合并到master分支;
2、如果需要,还会使用feature branch、hotfix branch和release branch分别用来进行特性开发、修复补丁、或者发布版本
git branch new-branch
git checkout -b new-branch
两种命令都可以用来创建新的分支,checkout直接将当前工作分支切换到新建的分支上
5、获取远程分支代码
如果需要获取远程分支,或者同步最新的代码,可以直接git pull origin develop
,从远程仓库拉取origin/develop分支。
或者使用fetch命令
git fetch origin develop
git log -p develop..origin/develop
git merge origin/develop
执行之后,就可以把远程仓库的develop分支合并到本地的当前工作分支下。
6、在分支中进行开发
如果在团队中使用feature branch进行开发,并且多个feature同时进行开发的话,开发过程中,不同的特性完成并合并到主分支的时间是不一样的,在最后合并代码的时候,可能会产生将多的冲突需要处理。这个时候可以使用rebase命令,在开发过程中,及时同步最新的代码,从而避免最后merge的时候,处理大量的冲突;
git checkout master
git pull
git checkout feature-x
git rebase master
如果出现代码冲突的话,打开文件处理冲突,处理完之后,可以继续进行rebase
git add conflict_filename
git rebase --continue
如果要放弃本次合并,使用git rebase --abort
命令,就会取消本次rebase操作。在rebase之前。
7、处理开发过程中的冲突
如果在合并代码,或者获取远程仓库代码之前,本地还有不想提交或者未完成的代码,可以使用stash命令,先将代码放到栈中暂存起来,等完成代码更新之后,在取出未完成的代码,继续进行操作。具体操作如下:
git stash
## do something
git stash list
git stash pop stash@{0}
8、远程仓库管理
此外,在开发过程中,因为持续集成部署的需要,可能会使用不同的远程仓库来完成不同的构建策略;或者对远程仓库的代码进行管理,还用到了一些基本的命令;
删除远程分支:
git push --delete origin feature-x
添加多个远程仓库:git remote add deploy http://giturl/repo.git
将代码强制推送到远程仓库:git push -f deploy develp
这篇文章是系列文章的第一篇,简单的介绍了在一次Git团队协作开发中用到的基本命令,接下来的一系列文章中,将会分主题对git学习使用过程中的各种相关知识和体会进行介绍。