几条命令及其作用
Workspace:工作区 即当前文件夹
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库 即github或gitee
git init 初始化本地仓库
git add. 将本地更新存在本地暂存区
git commit -m 提交暂存区至本地仓库
git branch 查看所有本地分支
git branch 分支名 创建新的分支
git checkout 分支名 切换到目的分支
git remote set -url 远程仓库链接 设置本地仓库关联的远程仓库
参考.
一些概念
- 分支:分支就是从主线上分离出来进行另外的操作,而又不影响主线。临时任务
- 主线:全程任务
- 创建分支:仅需创建分支指针怎指向需要从哪里开始创建分支的提交对象(commit)就是本地仓库的对象,然后进行修改再提交,新分支的指针会指向你最新提交commit对象,而原来分支的指针则指向你原来开发的位置,当你在哪个分支开发,HEAD就指向那个分支的最新提交对象commit。
- 分支的新建与合并
图1:当我们建立分支test之前,只有master一个主分支,:我们所有的开发都是在这个分支上,而且HEAD是指向最近一次提交的commit对象c3,c3以前还有两次提交c1和c2。
图2:通过git branch test创建test分支,这时HEAD还是指向master分支最近一次提交的c3,当git checkout test切换到test分支后,HEAD就指向test分支的最近一次提交c3,这个时候其实在.git里面都是指向同样一份数据c3。
图3 在test分支上提交c4,c5两个版本后,test和HEAD均指向最后一次提交c5 。但master仍然指向c3.
如果此时需要将test分支合并到master分支,只需将master移动指向c5。
命令:
对test分支进行合并 git merge --no-ff test
解释:这里的–no-ff实际就是快进式合并。会直接将master分支指向test分支。
如下图:
图四:此时master分支上进行了另外的开发,提交了c6,c7。则此时的master和HEAD指针均指向c7,如果对两个分支合并则如下图:
图5:需先切换至master。
命令:git merge test
将test分支合并到master分支。
git并非简单地移动指针,因为两边都有开发,所以git对于两个分支最新提交的c5和c7,两个分支共同祖先c3来进行一次简单的三方合并。
冲突:即你在c5和c7这两个提交中均修改了同一文件。则git会停下合并,等你处理好冲突后,再提交c8,然后再进行合并。
这时master和HEAD都指向c8,但是test是没有移动的,此时还可以在test上继续开发,再合并到master,如果test已经没有利用价值了就可以删掉了。
关于分支:
- 本地分支:我们可以通过git branch查看到的分支,也就是我们自己git仓库所拥有的分支,我们都可以利用。
- 远程分支:是对远程仓库的分支的索引,它其实也是本地分支,只是我们无法移动它,必须要在和中心服务器交互,根据服务器更新到本地来的代码移动,远程分支指向的是我们上次和中心服务器交互更新得到的最新版本,它也是个指针。
- 追踪分支:是一个本地分支,对应了一个远程分支。如果我们本地的某个分支对应了一个特定的远程分支,那么它就是追踪分支。
比如我们最初的master分支就是一个追踪分支,它对应远程分支origin/master,这里origin是远程仓库名,当我们在master分支里执行更新(fetch,pull)或是推送(push),在不指定分支的情况下,默认就是从origin/master分支更新来或者提交到origin/master分支。
从图七和图八很容易看出来,和我们本地创建分支很相似,只是origin/master远程分支只有在连接服务器并更新服务器代码到本地后才会移动。
更新远程代码到本地有两个命令:
fetch:是将远程代码更新到本地,但是不会执行合并操作,需要自己查看,解决冲突什么的,然后自己再执行merge将更新来的代码合并到我们自己制定的分支。
pull:就将这两个操作合成了一步,直接更新服务器代码更新并合并到到本地指定分支,当然遇到冲突也必须要自己解决。
一般都使用fetch来实现更新,虽然麻烦了点,但是不容易出问题。
将本地代码推送到远程仓库,也就是中心服务器,一般我们推送数据都是git push origin master:master
,这里指定远程仓库名,本地分支名和远端分支,也就是将我们本地master分支的数据推送到远程仓库origin的master分支。
如果本地的master分支是追踪分支,那么在不指定的情况下,它会自己找到远程仓库中对应的分支来推送数据。
如果直接进行git push origin
操作,只指定远程仓库名,那么git会根据我们目前所在分支和它所对应的远程仓库的分支来实现数据推送,前提是我们目前所在分支必须是追踪分支。
当然如果是git push origin :master,这里本地分支名是空的,这个操作就是将空分支推送到远程仓库的master分支,结果就是将master分支删除。建立追踪分支
第一种方式是根据远程分支创建追踪分支,如果不指定该追踪分支的名字,默认和远程仓库的分支名字一样:
git checkout --track origin/test
,这样我们就建立了一个名为test的追踪分支.
git checkout -b name origin/test
, 重新指定追踪分支的名字,这样我们就创建了一个名为name的追踪分支,它对应远程仓库的test分支。
第二种方式是已经存在某个本地分支,要让它来对应某个远程分支来成为追踪分支,也有两个命令可以用:
git branch --set-upstream test origin/test
git branch -f --track test origin/test
这里我们就让我们本地已经存在的test分支来追踪远程的test分支。
过程
管理员要做的
- 在gitee上创建一个仓库
git clone +ssh地址
注意仓库里至少有个readme 不然无法clone- 把本地项目放到该文件夹
git add.
git commit -m
git push
小组成员要做的
- 本地
git clone 项目连接
- 新建本地dev分支
git checkout -b dev
- 做出代码修改
git add .
,git commit -m "描述"
- 使用
git push origin dev
推送到远程仓库dev分支 - 通知管理员进行分支合并
管理员分支合并
- 在本地用
git checkout -b dev
创建dev分支,并将当前分支切换成dev分支 - 用
git pull origin dev
拉取远程仓库的dev分支 - 用
git branch -v
查看当前分支,用git checkout master
切换到master分支 - 审核通过小组成员代码后,用
git merge --no-ff dev
合并dev分支 git add .
,git commit -m "描述"
- 用
git push origin master
推送到码云master分支