声明

此篇文章内容是本人在 github上寻找到Peter Cottle的项目 https://github.com/pcottle/learnGitBranching.git 中学习git相关命令时所做的笔记,目的是方便复习时查看相关内容。

大家也可以直接打开下面的链接进行学习

链接:https://learngitbranching.js.org/?gist_level_id=a84407351f9c9f0cb241&locale=zh_CN

在此致敬大佬!


基础篇

1:Git Commit

创建一个新的提交记录

git commit -m "[消息体]"

2:Git Branch

使用分支的意义:我想基于这个提交以及它所有的父提交进行新的工作。

显示所有分支

git branch

创建新的分支

git branch [branch_name]

创建并切换到新的分支

git checkout -b [branch_name]

3:合并分支

3.1:Git Merge

在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:” 我要把这两个父节点本身以及他们所有的祖先都包含进来。“

把当前分支与目标分支(branch_name)进行合并,会产生一个新的提交记录,这个记录包含合并之前两个分支的最新记录,然后当前分支指向这个记录。

git merge [banch_name]

示例:

git merge bugFix

3.2:Git Rebase

Rebase 实际上就是取出一系列的提交记录,”复制“他们,然后再另外一个地方逐个的放下去,

特点:更加线性,使代码库的提交历史变得异常清晰。

将当前分支里的工作直接移到目标分支(branch_name)上

git rebase [branch_name]

git rebase master

高级篇

1:在提交树上移动

HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。

HEAD 总是指向当前分支上最近一次提交记录。

HEAD 通常情况下是指向分支名的。

查看HEAD 指向:cat .git/HEAD (如果HEAD指向的是一个引用则可以用:git symbolic-ref HEAD)

git checkout [objeck_pos]	(切换HEAD指向目标位置(object_pos))

示例:

git checkout c1


2:相对引用(^,~)

  • 使用 ^ 向上移动一个提交记录
  • 使用 ~ 向上移动多个提交记录,如 ~3

示例:

git checkout master^	(git checkout master~1)


3:强制修改分支位置

移动分支到目标位置:

git branch -f [branch_name] [object_pos]

示例:

git branch -f bugFix master~3

git branch -f master c6	(c6是提交记录的哈希值,可以通过 git log 命令来查看)


4:撤销变更

撤销变更:

  • 底层部分(暂存区的独立文件或者片段)

  • 上层部分(变更到底是通过哪种方式被撤销的)组成。

4.1:Git Reset

git revert [分支名/记录哈希值/HEAD~<num>]	(只能跟一个参数)

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

缺点:只能在本地分支中使用,对远程分支无效

示例:

git reset HEAD~1

4.2:Git Revert

git revert [param1] [param2] ...	(后面可以跟多个参数(分支名/记录哈希值/HEAD~<num>))
  • 远程分支上可以使用

示例1:

git revert HEAD

解释:新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

  • revert 之后就可以把你的更改推送到远程仓库与别人分享啦。

示例2:

git reset local^

git checkout pushed
git revert pushed local


移动提交记录

1:Git Cherry-pick

将一些提交复制到当前所在的位置(HEAD

  • git cherry-pick <提交号>...

  • git rebase类似

示例:

git cherry-pick c2 c4

2:交互式 rebase

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。

特点:不清楚提交记录的哈希值时使用比较方便

当 rebase UI界面打开时, 你能做3件事:

  • 调整提交记录的顺序(通过鼠标拖放来完成)
  • 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
  • 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。

示例:

git rebase -i HEAD~4

注意!:实际上并不是此画面。

代码测试:

$ git log
commit 1839f3c00d6407c594d6f575872f743eed82195e (HEAD -> master)
Author: rainMist <------------> #此处横杠代表我的邮箱
Date: Sun Jan 10 23:51:19 2021 +0800 changed the b.html commit e2ef072ca6121a2ecb2b1f0170ce18f5999fa3fe
Author: rainMist <------------> #此处横杠代表我的邮箱
Date: Fri Jan 8 22:19:07 2021 +0800 修改代码 commit 6e74ece9436503f52efed4ec99d54bcebc53faaa
Author: rainMist <------------> #此处横杠代表我的邮箱
Date: Fri Jan 8 12:38:31 2021 +0800 new file b.html
$ git rebase -i master~3
hint: Waiting for your editor to close the file...

执行命令后会打开文件(此处打开notepad++是因为我安装Git时配置的)


杂项

1:本低栈式提交

2:提交的技巧 #1

示例:

git rebase -i HEAD~2

git commit --amend

这句命令可以用下面两句代替:

  • git branch caption c2
  • git rebase c3'

git rebase -i HEAD~2

git branch -f master caption


3:提交的技巧 #2

主要利用 git cherry-pickgit checkout命令。

git checkout c1

git cherry-pick c2

git checkout master

git cherry-pick c2 c3


4:Git Tag

永远指向某个提交记录的标识,不会随着新的提交而移动,也不能检出到某个标签上面进行修改提交

  • git tag [tag_name][record]
  • 第一个参数 - 标签名
  • 第二个参数 -提交记录(即需要标签的位置)

注意:如果不指定提交记录,Git 会用 HEAD 所指向的位置。


5:Git Describe

  • 描述离你最近的锚点(也就是标签)

  • Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时

语法:

git describe <ref>

<ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。

它输出的结果是这样的:

<tag>_<numCommits>_g<hash>

tag 表示的是离 ref 最近的标签, numCommits 是表示这个 reftag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。

ref 提交记录上有某个标签时,则只输出标签名称


高级话题

1:多分支 rebase

示例:

git checkout another
git rebase side

git rebase bugFix

git rebase master

git branch master another


2:两个父节点

操作符 ^~ 符一样,后面也可以跟一个数字。

但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个 父提交

示例:

git branch -f bugWork HEAD~^2~

此步相当于以下步骤组合:

  • git branch bugWork #创建分支bugWork
  • git branch -f bugWork HEAD~ #强制移动分支到 c6 提交记录
  • git branch -f bugWork HEAD^2 #强制移动分支到 c6 的第二个父提交 -c5 提交记录
  • git Branch -f bugWork HEAD~ #强制移动分支到 c2 提交记录


3:纠缠不清的分支

现在我们的 master 分支是比 onetwothree 要多几个提交。出于某种原因,我们需要把 master 分支上最近的几次提交做不同的调整后,分别添加到各个的分支上。

one 需要重新排序并删除 C5two 仅需要重排排序,而 three 只需要提交一次。

git checkout one
git cherry-pick c4 c3 c2

git checkout two
git cherry-pick c5 c4 c3 c2

git branch -f three c2

到此结束!

git笔记整理-learnGitBranching的更多相关文章

  1. Git 笔记整理3

    1,git clone某一个分支 git clone -b <branch> <remote_repo> 2,.git 文件太大 :clone的时候,可以指定深度,如下,为1即 ...

  2. Git笔记 整理2

    补充: 1,如何只克隆git仓库中的一个分支? git clone -b <branch> <remote_repo> eg:  git clone -b vivien_dev ...

  3. Git笔记整理

    git 分支:   &.创建分支      创建分支很简单:git branch <分支名>       &.切换分支      git checkout <分支名& ...

  4. Git 初学者使用指南及Git 资源整理

    Git 资源整理 Git is a free and open source distributed version control system designed to handle everyth ...

  5. JS第一周学习笔记整理

    目录 JS正式课第一周笔记整理 JS正式课第一周笔记整理 webstorm : 代码编辑器 浏览器: 代码解析器: Git : 是一个工具;用于团队协作开发项目管理代码的工具:在工作中用git.svn ...

  6. NPM 学习笔记整理

    NPM 学习笔记整理 阅读 550,2017年06月04日 发布,来源:blog.ihoey.com 什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ru ...

  7. 布客&#183;ApacheCN 翻译/校对/笔记整理活动进度公告 2020.1

    注意 请贡献者查看参与方式,然后直接在 ISSUE 中认领. 翻译/校对三个文档就可以申请当负责人,我们会把你拉进合伙人群.翻译/校对五个文档的贡献者,可以申请实习证明. 请私聊片刻(52981514 ...

  8. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  9. 从0开始学Swift笔记整理(五)

    这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...

随机推荐

  1. Language Guide (proto3) | proto3 语言指南(八)未知字段和任意类型

    未知字段和任意类型篇幅较少,因此将他们合并到本文进行描述. Unknown Fields - 未知字段 未知字段是格式良好的协议缓冲区序列化数据,表示解析器无法识别的字段.例如,当一个旧二进制代码解析 ...

  2. 十一:SpringBoot-事务管理

    SpringBoot-事务管理 1.事务管理简介 1.1 特性:ACID 1.2 隔离问题 1.3 隔离级别 2.Spring事务管理 2.1 顶级接口 2.2 事务状态 2.3 事务定义 1.事务管 ...

  3. Java 集合框架()

    一概述 二Collection接口 List Set Queue 三Map接口 HashMap LinkedHashMap TreeMap 四其它集合类 Vector Stack HashTable ...

  4. Spark程序使用Scala进行单元测试

    Spark程序使用Scala进行单元测试 1.Rdd测试 2.无返回值方法测试 3.测试私有方法 原文作者:大葱拌豆腐 原文地址:Spark程序进行单元测试-使用scala 1.Rdd测试 spark ...

  5. 36.Samba 文件共享服务1--安装及配置参数解释

    1.Samba 服务程序现在已经成为在Linux 系统与Windows系统之间共享文件的最佳选择. 1)安装: [root@localhost ~]#yum install samba Loaded ...

  6. 区域之间PA、FortiGate内网互联专线、IPSec互备方案

    网络拓扑: 现状描述: 办公区和IDC之间有防火墙互联的点对点专线实现内网互通,现需要两地防火墙构建IPSec VPN作为专线的热备链路. 解决方案: 飞塔侧 1.按照阶段一.阶段二建立IPSec V ...

  7. 2015 Multi-University Training Contest 10(9/11)

    2015 Multi-University Training Contest 10 5406 CRB and Apple 1.排序之后费用流 spfa用stack才能过 //#pragma GCC o ...

  8. zoj2112 Dynamic Rankings (主席树 || 树套树)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  9. 2019牛客多校 Round1

    Solved:4 Rank:143 A Equivalent Prefixes 题意:求一个最大的r满足在A,B两个数组中1,r里所有的子区间RMQ相等 题解:单调队列秒 #include <b ...

  10. hdu4339 Query

    Problem Description You are given two strings s1[0..l1], s2[0..l2] and Q - number of queries. Your t ...