pull or fetch

拉取代码的操作有两种方式,git pullgit fetch,那么这两种有什么区别呢?

让咱们先来看看一个架构

Gitlab上手指南(五)|如何优雅的拉取和合并代码

图中展现一个完整的git流程,为了更明晰的了解每个区域,咱们下来解释一下他们的功能:

  • 作业区(working directory), 简言之便是你作业的区域。关于git而言,便是的本地作业目录。
  • 暂存区(stage area, 又称为索引区index), 是把修正提交版别库前的一个过渡阶段。在作业目录下.git的目录里面有个index文件,存储着关于暂存区的内容。git add指令将作业区内容添加到暂存区。
  • 本地库房(local repository), 版别控制系统的库房,存在于本地。当执行git commit指令后,会将暂存区内容提交到库房之中。.git/objects目录中寄存了每一个提交的记载,而在.git/refs目录下寄存的是分支信息和tag信息。
  • 长途版别库(remote repository), 与本地库房概念根本共同,不同之处在于一个存在长途,可用于长途协作,一个却是存在于本地。经过push/pull可完成本地与长途的交互;
  • 长途库房副本, 能够理解为存在于本地的长途库房缓存。当运用git fetch拉取长途代码库房的时分,就相当于在本地有一个长途库房的副本,你能够挑选把这个副本兼并到本地库房中。

从图中能够看出来,当咱们运用git pull拉取代码的时分,是直接兼并到了本地分支,而运用git fetch拉取代码的时分,会先在本地生成一个长途库房的副本,然后运用git merge或许git rebase兼并到本地分支。

既然能直接git pull何须屡次一举呢?试想一个场景,当你想兼并他人的代码,又不知道人家改了什么东西,是否能够跟你代码兼并到一起,这时分经过git fetch就能很容易的完成。git fetch今后实践并不会立马跟本地分支立马兼并,在git fetch今后,会显现如下图:

Gitlab上手指南(五)|如何优雅的拉取和合并代码

上图显现了长途新增了一个test2分支,在test分支上多了个一个提交信息,这时分在.git/refs/remotes/origin目录下能够看到多了一个test2分支。

运用git log origin/test,能够检查具体的提交信息

Gitlab上手指南(五)|如何优雅的拉取和合并代码

假如想检查提交的内容是啥,只能经过新建一个分支,

git checkout -b test-origin
git merge test

讲到这儿,相信你现已理解了git pullgit fetch的区别了吧。总结一下:

  • git fetch 更安全,更人性化

  • git pull 更急进,破坏性更强

一般的Leader在办理项目的时分都是习惯性的运用git fetch检查最近新增了哪些分支,做了哪些修正,从而对项目做出更好的把控。

merge or rebase

上面说到的兼并操作,一般咱们直接是经过git merge <分支名>去兼并某个分支的代码。先看看直接运用git merge的问题,有一条看着很不顺眼的Merge branch信息,如下图所示:

Gitlab上手指南(五)|如何优雅的拉取和合并代码

下图是兼并后的一个流程图,当咱们在main分支拉一个dev进行开发,这时分两个分支都有提交记载,当咱们兼并的时分,正常状况应该是在main的基础上,直接兼并,而不是多了一个C7的提交信息,也便是上面说到的Merge branch,这显然是一个很不合理的现象(当然这也不影响git正常作业)。

Gitlab上手指南(五)|如何优雅的拉取和合并代码

那如何解决这个现象导致的问题呢?答案便是git rebase,俗称变基。

下面咱们先来看看变基今后git分支是什么样的了

Gitlab上手指南(五)|如何优雅的拉取和合并代码

能够看到,当dev分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢掉。

示例操作

上面讲了这么多,现在让咱们来实践操作一下。

场景:长途有一个main分支上有内容更新,现在咱们需要把更新的内容兼并到本地dev分支上,然后push到长途dev分支,当时分支真实dev分支。

简略完成(便是很朴实无华):

# 拉取main分支代码
git fetch origin main
# 兼并到dev
git rebase origin/main

上面的git rebase还有个方便的操作,直接一行指令搞定

# 拉取test分支代码兼并到dev
git pull --rebase origin test

假如你不想每次都添加rebase,能够在终端中输入下面的指令:

git config --global pull.rebase true

这个配置便是告知git在每次pull前先进行rebase操作

其他指令参考

# 检查本地分支
git branch
# 检查长途分支
git branch -r
# 检查一切分支
git branch -a
# 拉取一切长途分支代码
git fetch 
# 拉取origin源上一切分支代码
git fetch origin
# 拉取orign源上main分支代码
git fetch origin main
# 拉取长途分支到新建的一个本地分支并
git checkout -b newBrach origin/master
# 兼并长途分支到本地
git pull --rebase origin master
# 检查提交日志
git log --oneline
# 检查某个人提交的日志
git log --author=xiumubai --oneline
# 检查某个文件提交的记载
git blame README.md
# 检查某次提交的内容
git show <commitid>
# 检查最近几次的提交
git log -p -n