Bootstrap

git基础操作

入门介绍

在这里插入图片描述
可以看到有4个区域,remote就是远程仓库,workspace则是本地可以编辑的代码分支, repository就是本地的仓库,存储者远程代码分支,也存储者本地代码分支

拉取远程分支到本地

假如远程仓库有三个分支master,dev,bugfix,我们想要拉取dev分支进行开发,最简单的就是git clone一份代码到本地git clone

git clone https://github.com/xxx/yyy.git

这样直接拉取的是master分支,通过git branch命令可以看到本地只有一个master分支

$ git branch
* master

使用git branch -a可以看到远程分支有哪些

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/bugfix

需要注意的是remotes/origin/xxx的这些分支是不可以编辑的,你可以认为这些分支就是为了同步远程代码使用的。

创建指定分支

直接clone后本地只有一个master分支是可以编辑的,如果想要编辑其他的分支则需要自己创建,例如我们想要在dev分支上进行开发,则需要先将远程的dev分支拉取下来,通过git fetch可以拉取最新的分支到本地,

git fetch origin dev

git fetch抓取到新的远程跟踪分支时,本地的工作区(workspace)不会自动生成一份可编辑的副本,抓取结果是直接送到版本库(Repository),其实也就是我们看到的remotes/origin/dev
通过git checkout可以切换到指定分支

git checkout origin/dev

从这个分支我们创建一个可以编辑的本地分支git branch branch-name

git branch dev

然后切换到我们新创建的可编辑分支

git checkout dev

在这里插入图片描述
当然我们可以一步创建,从origin/dev分支创建一个可编辑的dev分支,并切换到dev

git checkout -b dev origin/dev

很多时候我们基于dev分支开发了一部分代码,提交了MR但是还没有合并,这个时候可能第二个需求就过来了,如果还在dev上开发可能会污染之前的代码,这个时候就可以再从origin/dev新建一个分支来开发

origin/dev是一个分支

同步最新代码

我们在本地提交了一些commit,这个时候想要把远程的代码同步到本地分支,一种简单办法就是使用rebase命令

git fetch origin dev # 拉取远程的dev分支到本地的origin/dev
git rebase origin/dev # 本地origin/dev分支的commit合并到dev分支

在这里插入图片描述
rebase的意思就是变基,原本dev的基是c,也就是我们在c后面提交了c5c6,c就是dev的基,我们通过rebase的命令将基变更为origin/dev,这个时候基就是c3,我们把后序的提交c5c6嫁接到c3后面,就是变基。

  1. 两个分支的最近父节点,这个例子中最近的父节点是c
  2. 当前dev分支从父节点以后的所有commit存储一个临时文件
  3. 将当前分支的基准点设置为同步分支(origin/dev)的head节点
  4. 然后依次引用临时文件中的提交记录

其实我觉得rebase就是将其他的分支的差异化commit同步到本地分支

多个commit合并成一个

本地开发的时候经常会多次提交commit,这些commit可能只是整个需求的一小部分,开发完成之后我们会把所有的代码一次推送到远程,每个需求只有一个commit,这样主分支就会比较干净,使用rebase命令可以将多个commit合并成一个

git rebase -i c # c以后的commit合并成一个

执行后会进入交互界面

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上打补丁,并重新出版本

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

git switch dev2 # 切换dev2分支
git cherry-pick <commitHash>

在这里插入图片描述

就是从其他的分支搞一个commit下来

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;