入门介绍
可以看到有4个区域,remote就是远程仓库,workspace则是本地可以编辑的代码分支, repository就是本地的仓库,存储者远程代码分支,也存储者本地代码分支
拉取远程分支到本地
假如远程仓库有三个分支master,dev,bugfix,我们想要拉取dev分支进行开发,最简单的就是git clone一份代码到本地git clone
shell
git clone https://github.com/xxx/yyy.git
这样直接拉取的是master分支,通过git branch
命令可以看到本地只有一个master分支
shell
$ git branch
* master
使用git branch -a可以看到远程分支有哪些
shell
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/bugfix
需要注意的是remotes/origin/xxx
的这些分支是不可以编辑的,你可以认为这些分支就是为了同步远程代码使用的。
创建指定分支
直接clone后本地只有一个master分支是可以编辑的,如果想要编辑其他的分支则需要自己创建,例如我们想要在dev分支上进行开发,则需要先将远程的dev分支拉取下来,通过git fetch
可以拉取最新的分支到本地,
shell
git fetch origin dev
git fetch
抓取到新的远程跟踪分支时,本地的工作区(workspace)不会自动生成一份可编辑的副本,抓取结果是直接送到版本库(Repository),其实也就是我们看到的remotes/origin/dev
通过git checkout
可以切换到指定分支
shell
git checkout origin/dev
从这个分支我们创建一个可以编辑的本地分支git branch branch-name
shell
git branch dev
然后切换到我们新创建的可编辑分支
shell
git checkout dev
当然我们可以一步创建,从origin/dev分支创建一个可编辑的dev分支,并切换到dev
shell
git checkout -b dev origin/dev
很多时候我们基于dev分支开发了一部分代码,提交了MR但是还没有合并,这个时候可能第二个需求就过来了,如果还在dev上开发可能会污染之前的代码,这个时候就可以再从origin/dev新建一个分支来开发
origin/dev是一个分支
同步最新代码
我们在本地提交了一些commit,这个时候想要把远程的代码同步到本地分支,一种简单办法就是使用rebase命令
shell
git fetch origin dev # 拉取远程的dev分支到本地的origin/dev
git rebase origin/dev # 本地origin/dev分支的commit合并到dev分支
rebase的意思就是变基,原本dev的基是c
,也就是我们在c
后面提交了c5
和c6
,c就是dev的基,我们通过rebase的命令将基变更为origin/dev
,这个时候基就是c3
,我们把后序的提交c5
和c6
嫁接到c3
后面,就是变基。
- 两个分支的最近父节点,这个例子中最近的父节点是c
- 当前dev分支从父节点以后的所有commit存储一个临时文件
- 将当前分支的基准点设置为同步分支(origin/dev)的head节点
- 然后依次引用临时文件中的提交记录
其实我觉得rebase就是将其他的分支的差异化commit同步到本地分支
多个commit合并成一个
本地开发的时候经常会多次提交commit,这些commit可能只是整个需求的一小部分,开发完成之后我们会把所有的代码一次推送到远程,每个需求只有一个commit,这样主分支就会比较干净,使用rebase命令可以将多个commit合并成一个
shell
git rebase -i c # c以后的commit合并成一个
执行后会进入交互界面
shell
p c4 xxx
f c5 xxx
f c6 xxx
f c7 xxx
f c8 xxx
p的意思是最终选取那个commit最为最终的commit,并且选中的commit的message最为此次提交的信息,s
的意思是把这个commit合并掉,并且message也合并到一起,f
的意思是把这次commit合并成一个,但是message丢弃掉。对我们来说只要pick一个commit就可以,其他的commit都改成f或者s
同步某个commit
代码开发过程中经常会拉补丁分支,例如当前开发分支是dev2,而上个版本的分支是dev1,dev2是从dev1拉取的。现网运行的版本的是dev1,跑着跑着发现了个bug,这个时候就需要在dev1上打补丁,并重新出版本
shell
git checkout -b fix_dev1 origin/dev1 # 拉取最新分支
# 修改代码并提交
git commit -s "xxx"
# 推到远程仓库
git push origin fix_dev1:dev1
dev2是从dev1拉取的,dev2回有相同的bug,我们在dev1修改的代码也要同步到dev2上,这个时候就可以用cherry pick
shell
git switch dev2 # 切换dev2分支
git cherry-pick <commitHash>
就是从其他的分支搞一个commit下来