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

简介: pull or fetch 拉取代码的操作有两种形式,git pull和git fetch,那么这两种有什么区别呢? 让我们先来看看一个架构图 图中展示一个完整的git流程,为了更清晰的了解每个区域,

pull or fetch

拉取代码的操作有两种形式,git pullgit 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 pullgit 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
相关文章
|
6月前
|
运维 Java Devops
阿里云云效操作报错合集之在进行GitLab代码分支迁移时遇到报错,一般是什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
6月前
|
持续交付 开发工具 git
阿里云云效产品使用问题之在云效代码域中gitlab使用docker安装的,迁移时遇到“获取企业信息失败”,是什么原因
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
6月前
|
敏捷开发 Kubernetes 测试技术
阿里云云效产品使用问题之代码关联能关联自建的gitlab吗
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
6月前
|
运维 Serverless 开发工具
函数计算产品使用问题之通过GitLab仓库来部署代码,该如何配置GitLab仓库
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
7月前
|
数据安全/隐私保护
解决使用SourceTree下载GitLab服务器上的代码每次都需要输入密码问题
解决使用SourceTree下载GitLab服务器上的代码每次都需要输入密码问题
137 2
|
7月前
|
jenkins 持续交付 API
上传gitlab代码后jenkins自动进行发布的配置
上传gitlab代码后jenkins自动进行发布的配置
84 1
|
7月前
|
jenkins 持续交付 开发工具
gitlab远程库代码版本回滚方法
gitlab远程库代码版本回滚方法
282 1
|
7月前
|
运维 Devops Shell
云效产品使用报错问题之在codeup上创建的代码分支或者代码变动,同步到gitlab失败如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
7月前
|
JavaScript Go 项目管理
云效常见问题之使用gitlab仓库将代码合并评审环节集成到云效如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
207 1
|
7月前
|
运维 数据中心 数据安全/隐私保护
【Terraform实现云服务基础设施既代码(IaC)案例实战-3】:Terraform+Docker+Portainer+Gitlab+GitlabRunner搭建Tree项目
前言树苗科技公司业务上云2年有余,随着技术的不断发展。运维团队支持业务变更配置、开资源、删资源等过程加班到深夜一两点已是家常便饭。为了进一步提升工作效率,运维总监张三决定对当前业务交付路径进行统一梳理,借助IaC的理念和Terraform自动化工具逐步实施运维生产自动化,改善组内成员频繁加班且重复劳...
330 0
【Terraform实现云服务基础设施既代码(IaC)案例实战-3】:Terraform+Docker+Portainer+Gitlab+GitlabRunner搭建Tree项目