本文小编为大家详细介绍“Gitlab中如何优雅的拉取和合并代码”,内容详细,步骤清晰,细节处理妥当,希望这篇“Gitlab中如何优雅的拉取和合并代码”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
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