pull or fetch
拉取代码的操作有两种方式,git pull
和git fetch
,那么这两种有什么区别呢?
让咱们先来看看一个架构图
图中展现一个完整的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
今后,会显现如下图:
上图显现了长途新增了一个test2
分支,在test
分支上多了个一个提交信息,这时分在.git/refs/remotes/origin
目录下能够看到多了一个test2
分支。
运用git log origin/test
,能够检查具体的提交信息
假如想检查提交的内容是啥,只能经过新建一个分支,
git checkout -b test-origin
git merge test
讲到这儿,相信你现已理解了git pull
和git fetch
的区别了吧。总结一下:
-
git fetch 更安全,更人性化
-
git pull 更急进,破坏性更强
一般的Leader在办理项目的时分都是习惯性的运用git fetch
检查最近新增了哪些分支,做了哪些修正,从而对项目做出更好的把控。
merge or rebase
上面说到的兼并操作,一般咱们直接是经过git merge <分支名>
去兼并某个分支的代码。先看看直接运用git merge
的问题,有一条看着很不顺眼的Merge branch
信息,如下图所示:
下图是兼并后的一个流程图,当咱们在main
分支拉一个dev
进行开发,这时分两个分支都有提交记载,当咱们兼并的时分,正常状况应该是在main的基础上,直接兼并,而不是多了一个C7
的提交信息,也便是上面说到的Merge branch
,这显然是一个很不合理的现象(当然这也不影响git正常作业)。
那如何解决这个现象导致的问题呢?答案便是git rebase
,俗称变基。
下面咱们先来看看变基今后git分支是什么样的了
能够看到,当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