声明

此篇文章内容是本人在 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. hadoop(集群)完全分布式环境搭建

    一,环境 主节点一台: ubuntu desktop 16.04 zhoujun      172.16.12.1 从节点(slave)两台:ubuntu server 16.04 hadoop2  ...

  2. RIDE对应驱动下载

    https://blog.csdn.net/apollolkj/article/details/75408237

  3. IPSec 专题----转自华为文档

    参考链接:https://support.huawei.com/enterprise/zh/doc/EDOC1000122878?section=j004 IPSec 特性全景 1.介绍 由于IP报文 ...

  4. 一周精彩内容分享(第 1 期):"世纪逼空大战"

    这里记录过去一周,我看到的值得分享的东西. 一方面是整理记录一下自己一周的学习,另一方面也是期待自己有更多的输出,有更多的价值. 周刊开源(Github:wmyskxz/weekly),欢迎提交 is ...

  5. 最好的IDEA debug长文?看完我佛了

    前言 你好,我是A哥(YourBatman). 最近写了几篇IntelliJ IDEA系列的文章,反响蛮好.我想了下,因为并非是分享什么破解方法.推荐插件.主题这种蛋炒饭式哗众取宠的文章,而是真实对工 ...

  6. Left join查询为空

    这两个查询,上面查询返回空,下面能正常返回记录 两个表结构: left join 没有匹配上得到的b.dates,b.game_id和b.uid都是null值,在按b.dates=20200317 a ...

  7. NCD 2019 H. Mr. Hamra and his quantum particles

    题意:给你n个数,有m次操作,每次使得两个数相连接,询问q次,问某两个数是否连接在一起. 题解:这其实是一道并查集的裸题,这里就不再多说了,写个路径压缩的find函数即可. 代码: #include ...

  8. Power Strings POJ - 2406 后缀数组

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  9. SpringSecurity简单使用

    什么是SpringSecurity? Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置 ...

  10. [RabbitMQ]01. 在 Win10 下通过 Docker 安装

    目录 win10家庭版 win10专业版和企业版 1. 开启Hyper-v 2. 安装Toolbox工具 3. 运行安装文件 4. 启动docker 5. 安装rabbitmq 6. 网页访问rabb ...