Git分布式版本控制工具

文章目录

  • Git分布式版本控制工具
    • 1 目标
    • 2 概述
      • 2.1 开发中的实际场景
      • 2.2 版本控制器的方式
      • 2.3 SVN
      • 2.4 Git
      • 2.5 Git工作流程图
    • 3 Git 安装与常用命令
      • 3.1 Git环境配置
        • 3.1.1 下载与安装
        • 3.1.2 基本配置
        • 3.1.3 为常用指令配置别名
          • 3.1.3.1 通过`.bashrc`配置别名
          • 3.1.3.2 通过`.gitconfig`配置别名
        • 3.1.4 解决GitBash乱码问题
      • 3.2 获取本地仓库
      • 3.3 基础操作指令
        • 3.3.1 *查看修改的状态(status)
        • 3.3.2 *添加工作区到暂存区(add)
        • 3.3.3 *提交暂存区到本地仓库(commit)
        • 3.3.4 *查看提交日志
        • 3.3.5 版本回退
        • 3.3.6 添加文件至忽略列表
        • 3.3.7 命令使用示例
      • 3.4 分支
        • 3.4.1 查看本地分支
        • 3.4.2 创建本地分支
        • 3.4.3 *切换分支
        • 3.4.4 *合并分支
        • 3.4.5 删除分支
        • 3.4.6 解决冲突
        • 3.4.7 开发中分支使用原则与流程
        • 3.4.8 命令使用示例
          • 3.4.8.1 示例1
          • 3.4.8.2 示例2——解决冲突
    • 4 Git远程仓库
      • 4.1 常用的托管服务
      • 4.2 注册码云
      • 4.3 创建远程仓库
      • 4.4 配置SSH公钥
      • 4.5 操作远程仓库
        • 4.5.1 添加远程仓库
        • 4.5.2 查看远程仓库
        • 4.5.3 推送到远程仓库
        • 4.5.4 本地分支与远程分支的关联关系
        • 4.5.5 从远程仓库克隆
        • 4.5.6 从远程仓库中抓取和拉取
        • 4.5.7 解决合并冲突
      • 4.6 命令使用示例
        • 4.6.1 远程仓库添加_查看_推送
        • 4.6.2 克隆_抓取和拉取
        • 4.6.3 解决冲突
    • 5 在Idea中使用Git
      • 5.1 在Idea中配置Git
      • 5.2 在Idea中操作Git
        • 5.2.1 创建项目远程仓库(参照4.3)
        • 5.2.2 初始化本地仓库
        • 5.2.3 设置远程仓库
        • 5.2.4 提交到本地仓库
        • 5.2.5 推送到远程仓库
        • 5.2.6 克隆远程仓库到本地
        • 5.2.7 创建分支
        • 5.2.8 切换分支及其他分支相关操作
        • 5.2.9 解决冲突
      • 5.3 IDEA常用GIT操作入口
      • 5.4 Tips
    • 6 Git知识补充
      • 6.1 rebase和merge
        • 6.1.1 HEAD的理解
        • 6.1.2 fast-forward 与 —no-ff 的区别
        • 6.1.3 merge操作
        • 6.1.4 rebase操作
      • 6.2 强制拉取到本地仓库
      • 6.3 远程分支合并

1 目标

  • 了解git基本概念
  • 能够描述git工作流程
  • 能够使用git常用命令
  • 熟悉git代码托管服务
  • 能够使用idea操作git

2 概述

2.1 开发中的实际场景

场景一:备份
场景二:代码还原
场景三:协同开发
场景四:追溯问题代码编写人和编写时间

2.2 版本控制器的方式

a. 集中式版本控制工具集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。举例:SVN和CVS
b.分布式版本控制工具:分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需要联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的修改了。举例:Git

2.3 SVN

2.4 Git

 Git是分布式的,Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。特点:1.速度2.简单的设计3.对非线性开发模式的强力支持4.完全分布式5.有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

2.5 Git工作流程图

命令如下:1. clone(克隆): 从远程仓库中克隆代码到本地仓库
2. checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
3. add(添加): 在提交前先将代码提交到暂存区
4. commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
5. fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
6. pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于fetch+merge
7. push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库

3 Git 安装与常用命令

本教程里的git命令例子都是在Git Bash中演示的,会用到一些基本的linux命令,在此为大家提前列举:

ls/ll 查看当前目录
cat 查看文件内容
touch 创建文件
vi vi编辑器(使用vi编辑器是为了方便展示效果,学员可以记事本、editPlus、notPad++等其它编辑器)

3.1 Git环境配置

3.1.1 下载与安装

下载地址: https://git-scm.com/download

下载完成后可以得到如下安装文件:

双击下载的安装文件来安装Git。安装完成后在电脑桌面(也可以是其他目录)点击右键,如果能够看到如下两个菜单则说明Git安装成功。

  • Git GUI:Git提供的图形界面工具
  • Git Bash:Git提供的命令行工具(可以使用linux的命令)

3.1.2 基本配置

当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息。

  • 设置用户信息

    git config --global user.name "XXX" # 设置用户名,注意引号前的空格
    git config --global user.email "XXXX" # 设置邮箱,注意引号前的空格
    
  • 查看配置信息

    git config --global user.name
    git config --global user.email
    

3.1.3 为常用指令配置别名

3.1.3.1 通过.bashrc配置别名

有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。

1.打开用户目录,创建.bashrc文件,打开gitbash,执行

touch ~/.bashrc

2.在.bashrc文件中输入如下内容:

#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'

注:vi退出编辑时,按esc,输入冒号(英文),然后切换到最后一行模式,最后一行模式决定是否保存文件。例如输入wq保存并退出。

3.打开Gitbash,执行

source ~/.bashrc
3.1.3.2 通过.gitconfig配置别名
  • 每个仓库内部的配置文件,基本都放在项目根目录.gitconfig文件中,如下:

    [core]repositoryformatversion = 0filemode = falsebare = falselogallrefupdates = truesymlinks = falseignorecase = truehideDotFiles = dotGitOnly
    [remote "origin"]url = http://gitlab.com/demo/testfetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]remote = originmerge = refs/heads/master
    [alias]st = status br = branch
    
  • 当前用户目录下有一个全局的git配置文件.gitconfig,配置如下:

    [alias]st = status
    [user]name = yournameemail = 123456@qq.com
    [push]default = matching
    

如果想要增加别名,就可以在[alias]下边添加,一行对应一个别名。如果通过命令行配置的别名有误,想修改,则可以通过删除.gitconfig文件[alias]中对应的行,再重新通过命令配置或者直接修改配置文件。

  • 常用别名配置

    [alias]st = statuscm = commit -mck = checkoutcb = checkout -bba = branch -abr = branchbd = branch -Dpbd = push origin --deletemg = merge --no-ff -mclog = log --graph --pretty=oneline --abbrev-commitpo = push originpl = pull originpm = pull origin masterpts = push --tagsrp = remote prune origin
    # git push origin tagname
    # git push --tags
    # git remote prune origin  清除已经删除的远程分支的本地记录
    

tips:如果用vs code编辑一定要点保存,不能点关闭

3.1.4 解决GitBash乱码问题

配置后才能输入中文,否则输入中文将会出现乱码

  1. 打开GitBash执行下面命令

    git config --global core.quotepath false
    
  2. ${git_home}/etc/bash.bashrc 文件最后加入下面两行(即Git的安装目录)

    export LANG="zh_CN.UTF-8"
    export LC_ALL="zh_CN.UTF-8"
    

3.2 获取本地仓库

要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
1)在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库
2)进入这个目录中,点击右键打开Git bash窗口
3)执行命令git init
4)如果创建成功后可在文件夹下看到隐藏的.git目录。

3.3 基础操作指令

Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git的命令而发生变化。

本章节只要讲解如何使用命令来控制这些状态之间的转换:

  1. git add (工作区到暂存区)
  2. git commit (暂存区到本地仓库)

3.3.1 *查看修改的状态(status)

  • 作用:查看修改的状态(暂存区、工作区)
  • 命令形式:git status

3.3.2 *添加工作区到暂存区(add)

  • 作用:添加工作区一个或多个文件的修改到暂存区
  • 命令形式:git add 单个文件名(也可以用通配符.)
  • 将所有修改加入暂存区 git add .

3.3.3 *提交暂存区到本地仓库(commit)

  • 作用:提交暂存区内容到本地仓库当前分支
  • 命令形式:git commit -m “注释内容”

3.3.4 *查看提交日志

在3.1.3中配置的别名git-log就包含了这些参数,所以后续可以直接使用指令git-log

  • 作用:查看提交记录
  • 命令形式:git log [option] 或者 git-log
    • —all 显示所有分支
    • —pretty=oneline 将提交信息显示为一行
    • —abbrev-commit 使得输出的commitId更简短
    • —graph 以图的形式显示

由于之前3.1.3已经为它们设置好别名,所以直接使用git-log就可以达到上面所有效果,使用git log则显示detail。

3.3.5 版本回退

  • 作用:版本切换
  • 命令形式:
git reset --hard commitID # commitID 可以使用 git-log 或 git log 指令查看
# 在命令行中直接选中即可复制,ctrl+c表示结束;粘贴直接按住滚轮
#git reflog 可以查到所有历史记录

3.3.6 添加文件至忽略列表

一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。

项目通常有统一的.gitignore文件,复制即可。

3.3.7 命令使用示例


  • 创建文件并提交
  1. 利用上面初始化好的本地仓库test,新建一个文件file01.txt,并用status查看状态:
touch file01.txt
git status
  1. 添加到暂存区
git add file01.txt
# 或者
git add .
  1. 提交至本地仓库并查看状态
git commit -m "commit file01.txt"#注释
git status
  1. 查看日志
git log
#或已配置的指令
git-log

  • 修改文件并提交
  1. 修改file01.txt文件内容并查看状态

  2. 添加至暂存区并查看状态

git add file01.txt
#或者
git add .
  1. 提交至本地仓库
git commit -m "commit file01.txt"#注释
  1. 利用git-log查看提交日志,并回退至第一个版本
git-log
git reset --hard XXXXX

点击打开file01.txt,发现其中内容没有了。同样,可以再次回到第二个版本。


  • 创建.gitignore并修改

新建文件file02.txt,加入.gitignore

touch file02.txt
touch .gitignore
vi .gitignore # 添加内容: file02.txt

.gitignore内容

file02.txt
#也可以使用通配符,例如
*.txt
*.iml
...

3.4 分支

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。

3.4.1 查看本地分支

git branch

3.4.2 创建本地分支

git branch 分支名

3.4.3 *切换分支

git checkout 分支名

我们还可以直接切换到一个不存在的分支(创建并切换):

git checkout -b 分支名

3.4.4 *合并分支

一个分支上的提交可以合并到另一个分支

git merge 分支名

先checkout到A分支,然后merge B分支表示把B分支合并到A分支上。

3.4.5 删除分支

不能删除当前分支,只能删除其他分支

git branch -d 分支名 # 删除分支时,需要做各种检查
git branch -D 分支名 # 不做任何检查,强制删除

3.4.6 解决冲突

当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:

  1. 处理文件中冲突的地方
  2. 将解决完冲突的文件加入暂存区(add)
  3. 提交到仓库(commit)

3.4.7 开发中分支使用原则与流程

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。

在开发中,一般有如下分支使用原则与流程:

  • master (生产) 分支:线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
  • develop(开发)分支:是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
  • feature/xxxx分支:从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支,之后该分支可以删除。
  • hotfix/xxxx分支:从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支。

还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等
等。

3.4.8 命令使用示例

3.4.8.1 示例1
  1. 查看分支,并新建分支dev01
git branch
git branch dev01

其中HEAD指向的是当前工作区所处的分支,例如此时处在master的分支上。

  1. 将当前分支切换到dev01
git checkout dev01
  1. 新建文件file02.txt

  2. 提交记录内容为:add file02 on dev

git add .
git commit -m 'add file02 on dev'
  1. 切换到master分支,并将dev01的提交合并到master上
git checkout master
git merge dev01
  1. 删除dev01分支
git branch -d dev01
3.4.8.2 示例2——解决冲突
  1. 删除分支dev01,创建并切换到分支dev上。此时masterdev分支上的file01.txt文件中内容都为update_count = 1
git branch -d dev01
git checkout -b dev
  1. dev分支上修改file01.txt文件内容为update_count = 2,并提交

  2. master分支上修改file01.txt文件内容为update_count = 3,并提交

  3. dev分支合并到master分支上,发现报错。查看file01.txt内容

git merge dev
  1. 解决冲突:将file01.txt提示冲突的地方修改成我们想要的内容,例如再次修改成update_count = 3,并再次提交即可。

4 Git远程仓库

4.1 常用的托管服务

前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。

  • GitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名GitHub
  • 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于 GitHub,码云速度会更快
  • GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。

4.2 注册码云

4.3 创建远程仓库

仓库创建完成后可以看到仓库地址,如下图所示:

4.4 配置SSH公钥

  • 生成SSH公钥
ssh-keygen -t rsa

不断回车,如果公钥已经存在,则自动覆盖。

  • Gitee设置账户共公钥

    • 获取公钥
    cat ~/.ssh/id_rsa.pub
    

    • 验证是否配置成功
    ssh -T git@gitee.com
    

4.5 操作远程仓库

4.5.1 添加远程仓库

此操作是先初始化本地库,然后与已创建的远程库进行对接

  • 命令:

    • 远端名称:默认是origin,取决于远端服务器设置
    • 仓库地址:从远端服务器获取此url
git remote add <远端名称> <仓库地址>

例如:

git remote add origin git@gitee.com:czbk_zhang_meng/git_test.git

4.5.2 查看远程仓库

  • 命令:
git remote

4.5.3 推送到远程仓库

git push [-f] [--set-upstream] [远端名称] [本地分支名][:远端分支名]
  • 命令:

    如果远程分支名和本地分支名相同,则可以只写本地分支名

    git push origin master
    

    PLAINTEXT

    • -f表示强制推送,一般在公司内没有这个的使用权限,否则容易冲掉远程仓库的所有代码

    • --set-upstream 推送到远端的同时,建立起和远端分支的关联关系,用于第一次推送时。

    • 如果当前分支已经和远端分支关联,则可以省略分支名和远端名

    • git push 将master分支推送到已关联的远端分支

4.5.4 本地分支与远程分支的关联关系

  • 命令:
git branch -vv #-vv表示详细信息

4.5.5 从远程仓库克隆

如果已经有一个远端仓库,我们可以直接clone到本地。

  • 命令:
git clone <仓库地址> [本地目录]

本地目录可以省略,会自动生成一个目录

4.5.6 从远程仓库中抓取和拉取

远程分支和本地的分支一样,我们可以进行merge操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。

  • 抓取命令:

    • 抓取指令就是将仓库里的更新都抓取到本地,不会进行合并
    • 如果不指定远端名称和分支名,则抓取所有分支。
git fetch [remote name] [branch name]
  • 拉取命令:

    • 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
    • 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
git pull [remote name] [branch name]

4.5.7 解决合并冲突

在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。

A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支,如下图所示。

在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。

远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同,在此不再赘述。

**本地比远端新push,本地没有远端新pull,本地与远端冲突,解决冲突文件vi,本地新push **

4.6 命令使用示例

4.6.1 远程仓库添加_查看_推送

  1. 初始化本地库(例如使用上一节创建的本地仓库test),然后与已创建的远程库(例如创建将好一个远程仓库git_test)进行对接
git remote add origin git@gitee.com:zengyiming/git_test.git
  1. 查看对接好的远程仓库
git remote
  1. 推送到远程仓库
git push origin master

因为本地分支名master和远程分支名master同名,所以省略了远程分支名,完整的指令如下:

git push origin master:master
  1. 查看本地分支与远程分支的绑定关系
git branch -vv

此时尚未有绑定关系

  1. 将本地分支master和远程分支master绑定关系
git push --set-upstream origin master:master

发现本地分支master已经和远程分支master绑定成功

  1. 此时本地分支master若要推送到远程分支master上,则可直接使用命令:
git push

4.6.2 克隆_抓取和拉取

  1. 克隆刚才的远程仓库git_test,放在目录git_test
git clone git@gitee.com:zeng-yiming/git_test.git git_test
  1. 查看克隆仓库的日志

  2. 在本地仓库test中新建一个文件file04.txt并提交和推送

发现由于快进模式,远端分支master也进入到了和本地仓库test的master分支相同的位置。

  1. 本地仓库git_test从远端仓库抓取
git fetch
  1. 发现远端分支master比本地分支master的版本更新,因此进行合并
git merge origin/master

步骤4和5的指令可用一条指令完成:

git pull

4.6.3 解决冲突

  1. 在本地仓库testgit_test中同时修改文件file01.txt,并提交,但是test首先推送至远端

  2. test推送后,git_test`进行合并,提示冲突

  3. 解决冲突:将file01.txt的内容改成我们想要的,例如就改成5,之后提交并推送即可

5 在Idea中使用Git

5.1 在Idea中配置Git

安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。选择File→Settings打开设置窗口,找到Version Control下的git选
项:

点击Test按钮,现在执行成功,配置完成

5.2 在Idea中操作Git

场景:本地已经有一个项目,但是并不是git项目,我们需要将这个放到码云的仓库里,和其他开发人员继续一起协作开发。

5.2.1 创建项目远程仓库(参照4.3)

5.2.2 初始化本地仓库

5.2.3 设置远程仓库

5.2.4 提交到本地仓库

5.2.5 推送到远程仓库

5.2.6 克隆远程仓库到本地

5.2.7 创建分支

  • 最常规的方式

  • 最强大的的方式

5.2.8 切换分支及其他分支相关操作

5.2.9 解决冲突

  1. 执行merge或pull操作时,可能发生冲突

  1. 冲突解决后加入暂存区
    右键选中文件,add

  2. 提交到本地仓库

  3. 推送到远程仓库

5.3 IDEA常用GIT操作入口

  1. 第一张图上的快捷入口可以基本满足开发的需求。

  1. 第二张图是更多在IDEA操作git的入口。

5.4 Tips

切换分支前先提交本地的修改

6 Git知识补充

6.1 rebase和merge

6.1.1 HEAD的理解

HEAD 指向当前所在的分支,类似一个活动的指针,表示一个「引用」。

HEAD 既可以指向「当前分支」的最新 commit,也可以指向历史中的某一次 commit (「分离头指针」的情况)。归根结底,HEAD 指向的就是某个提交点。

当我们做分支切换时,HEAD 会跟着切换到对应分支。

6.1.2 fast-forward 与 —no-ff 的区别

假如有一个场景:有两个分支,master 分支和 feature 分支。现在,feautre 分支需要合并回 master 分支。

  • fast-forward 合并方式是条件允许的情况,通过将 master 分支的 HEAD 位置移动到 feature 分支的最新提交点上,这样就实现了快速合并。这种情况,是不会新生成 commit 的。(快进模式)
git checkout master # 先切换到master分支
git merge feature # 将feature分支合并到当前分支上(master)
  • --no-ff 的方式进行合并,master 分支就会新生成一次提交记录。
git checkout master # 先切换到master分支
git merge --no-ff feature # 将feature分支合并到当前分支上(master)

如果条件满足时,merge 默认采用的 fast-forward 方式进行合并,除非你显示的加上 --no-ff 选项;而条件不满足时,merge 也是无法使用 fast-forward 合并成功的!

6.1.3 merge操作

git merge 操作是区分上下文的。当前分支始终是目标分支,其他一个或多个分支始终合并到当前分支。这个注意点记住了,方便记忆!所以,当需要将某个分支合并到目标分支时,需要先切到目标分支上

条件满足的含义

快进模式能够进行的条件是:源分支和目标分支之间没有分叉。下图则是无法通过 HEAD 的快速移动实现分支的合并。

如果执行合并操作,默认会尝试 fast-forward 的方式进行合并,但是因为分叉了,所以此时会采用 no-ff 的方式进行合并,有新的 commit 生成了。最终的结果图如下:

git checkout master # 先切换到目标分支
git merge feature

6.1.4 rebase操作

rebase 合并往往又被称为 「变基」。这里的「基」就是一个「基点」、「起点」的意思。git rebase 命令通常称为向前移植(forward porting)。

「变基」就是改变当前分支的起点。注意,是当前分支! rebase 命令后面紧接着的就是「基分支」。与merge操作相反。

  • 执行命令:
git checkout feature # 切换到当前分支,或待变基分支
git rebase master # 变基# 可合并为下面的语句
git rebase master feature
  • 解释:rebase,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了E而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)

推荐使用场景

  • 往公共分支上合代码的时候,推荐使用merge。
  • 拉公共分支最新代码的时候,推荐使用rebase,也就是git pull -rgit pull --rebase,但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛。

图示

从Develop分支分出两个分支,分属两个人员进行开发。F1分支开发完毕后,push到总分支。F2分支开发到F2_5时需要拉取最新代码。

  • 如果F2分支采用git pull拉取最新代码:

    • F1分支的视角(F1分支的commit记录):
    • F2分支的视角:这将会把F1分支的修改直接拉下来于本地代码merge,且产生一个commit F2_5,也就是merge commit
  • 如果F2分支采用git pull --rebase 拉取最新代码:
    • F1分支视角不变
    • F2分支视角:

6.2 强制拉取到本地仓库

有些时候本地仓库提交管理混乱,需要从远程仓库强制拉取,以刷新本地仓库,覆盖所有add和commit操作。可执行以下代码:

git fetch --all
git reset --hard origin/master
git pull

6.3 远程分支合并

该项职责由git管理员来完成。例如当开发分支Develop上的所有功能已经完成时,需要合并到master上时:

  • 代码clone到本地仓库
git clone
  • 在本地创建dev分支并与远程dev分支对应
git checkout -b dev origin/dev
  • 切换到master分支
git checkout master
  • 本地的dev合并到master上(遇到冲突解决完后再次提交)
git merge dev
  • 推送到远程的master上(执行这项操作时,需要有操作远程master分支的权限)
BASH
git push origin master

释放权限:

操作结果:

Git分布式版本控制工具相关推荐

  1. Git分布式版本控制工具【IDEA版】【安装和使用以及上传代码到Gitee】(一篇文章精通系列)

    一.目标 了解Git基本概念 能够概述git工作流程 能够使用Git常用命令 熟悉Git代码托管服务 能够使用idea操作git 二.Git概述 1.开发中的实际场景 场景一:备份 小明负责的模块就要 ...

  2. Git分布式版本控制工具(Git命令基本操作)

    1.目标 了解Git基本概念 能够概述git工作流程 熟悉Git代码托管服务 能够使用Git常用命令 能够使用idea操作git 了解Git标签 了解SSH协议传输数据 2.概述 2.1 .开发中的实 ...

  3. Git 分布式版本控制工具01:Git介绍+下载+安装

    1. 前言 1.1 什么是Git Git 是一个分布式版本控制工具,通过Git 仓库来存储和管理源代码文件文件. 在IDEA开发工具中可以集成Git: 集成后在IDEA中可以看到Git相关图标: 可以 ...

  4. 分布式版本控制工具Git的安装

    git分布式版本控制工具 本地仓库,远程仓库(github,gitee) 下载地址:https://git-scm.com/ 速度超级慢-23k/s 换成Git下载国内镜像地址 https://npm ...

  5. 分布式版本控制工具:git与Mercurial(zz)

    分布式版本控制工具:git与Mercurial [收藏此页] [打印] 作者:cyfdecyf  2007-12-26 内容导航: 第1页 [IT168 技术文档]    说到版本控制工具,很多人可能 ...

  6. Git(分布式版本控制工具)

    [标注]:该笔记是转载自黑马Git教程,里面是包含自己做的笔记,黑马笔记开放共享,不存在侵权的问题,文章最后给出了资料的网盘链接 Git的学习是不依赖我们前面学习的知识,就算没有学习java也可以学习 ...

  7. 【尚硅谷Java笔记+踩坑】Git(分布式版本控制工具)

    用于复习快速回顾 目录 1.Git 1.0.提交项目到GitHub简洁版 1.2.版本控制 1.3.版本控制工具 1.4.Git简史 1.5.Git工作机制 1.6.Git和代码托管中心 2.Git安 ...

  8. Linux | 分布式版本控制工具Git【版本管理 + 远程仓库克隆】

    文章目录 一.前言 二.有关git的相关历史介绍 三.Git版本管理 1.感性理解 -- 大学生实验报告 2.程序员与产品经理 3.张三的CEO之路 -- 版本管理工具的诞生 四.如何在Linux上使 ...

  9. 分布式版本控制工具----git

    分布式版本控制工具 版本控制 版本控制的功能 版本控制分类 git简介 git优势 git安装 git结构 代码托管中心 代码托管模式 git操作 git 分支(45minutes) 分支操作 git ...

最新文章

  1. nodejs 中间件 反向代理 接口转发
  2. 人工智能六十年技术简史
  3. 第十四章:springboot 定时任务
  4. [转载] 七龙珠第一部——第063话 悟空大反击
  5. python绘制条形图 中文横坐标_Pyhon绘制数据范围条形图
  6. active-class属于Vue哪一个modules,有什么作用
  7. Android APP
  8. 企业搜索 Solr7 安装部署
  9. 3d ListView翻译
  10. matlab绘图坐标显示不全的解决方法
  11. php+mysql任务网源码
  12. 如何正确安装驱动程序
  13. 录制计算机网课,电脑怎么录制网络课程?简单专业的录制方法分享
  14. Apache Felix HTTP Service
  15. 预言机理解:A Scalable Architecture for On-Demand, Untrusted Delivery of Entropy
  16. CLIP Learning Transferable Visual Models From Natural Language Supervision (文本和图像的对比学习)--文献翻译和笔记
  17. 闻道有先后,术业有专攻
  18. Python小游戏:BMI指数的计算
  19. Unity警告 Trying to Invoke method: PlayManager.ReturnTheMainMenu couldn‘t be called.
  20. 给Date日期加上时分秒

热门文章

  1. 百度地图之九如何在一个地图上显示多条导航路线
  2. (图解)神经网络之CNN与RNN的关系
  3. 软件工程基础——个人项目——数独(1)
  4. 蓝牙App系列漏洞原理分析与漏洞利用
  5. Python如何从私钥创建以太坊钱包地址!
  6. 操作系统内核知识介绍
  7. VC++ 获取Revit元素的几何信息
  8. php怎么在线建excel,PHP中创建和编辑Excel表格的方法
  9. Unity3D 关于模型变形技术代码实现
  10. 20230219英语学习