git笔记整理-learnGitBranching
声明
此篇文章内容是本人在 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-pick
和git 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
是表示这个 ref
与 tag
相差有多少个提交记录, 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
分支是比 one
、two
和 three
要多几个提交。出于某种原因,我们需要把 master
分支上最近的几次提交做不同的调整后,分别添加到各个的分支上。
one
需要重新排序并删除 C5
,two
仅需要重排排序,而 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的更多相关文章
- Git 笔记整理3
1,git clone某一个分支 git clone -b <branch> <remote_repo> 2,.git 文件太大 :clone的时候,可以指定深度,如下,为1即 ...
- Git笔记 整理2
补充: 1,如何只克隆git仓库中的一个分支? git clone -b <branch> <remote_repo> eg: git clone -b vivien_dev ...
- Git笔记整理
git 分支: &.创建分支 创建分支很简单:git branch <分支名> &.切换分支 git checkout <分支名& ...
- Git 初学者使用指南及Git 资源整理
Git 资源整理 Git is a free and open source distributed version control system designed to handle everyth ...
- JS第一周学习笔记整理
目录 JS正式课第一周笔记整理 JS正式课第一周笔记整理 webstorm : 代码编辑器 浏览器: 代码解析器: Git : 是一个工具;用于团队协作开发项目管理代码的工具:在工作中用git.svn ...
- NPM 学习笔记整理
NPM 学习笔记整理 阅读 550,2017年06月04日 发布,来源:blog.ihoey.com 什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ru ...
- 布客·ApacheCN 翻译/校对/笔记整理活动进度公告 2020.1
注意 请贡献者查看参与方式,然后直接在 ISSUE 中认领. 翻译/校对三个文档就可以申请当负责人,我们会把你拉进合伙人群.翻译/校对五个文档的贡献者,可以申请实习证明. 请私聊片刻(52981514 ...
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- 从0开始学Swift笔记整理(五)
这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...
随机推荐
- Java中String对象创建机制详解()
一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...
- 使用ganglia 实现监控 hadoop 和 hbase(详细过程总结)
一,环境准备 hadoop 2.8.2 分布式环境(三个节点 安装请参考 hadoop分布式环境安装) hbase 1.2.6 分布式环境(三个节点 ,安装参考hbase分布式环境安装 ) 主节点采 ...
- java--Aop--记录日志
package com.pt.modules.log; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; imp ...
- TCP/IP__TCP协议
1.定位:传输控制协议(Transmission Control Protocol),是一种面向连接的.可靠的.基于字节流的传输层通信协议. 2.原理:应用层向TCP层发送用于网间传输的.用8位字节表 ...
- Flink-v1.12官方网站翻译-P024-Checkpointing
检查点 Flink中的每一个函数和操作符都可以是有状态的(详情请看使用状态).有状态的函数在单个元素/事件的处理过程中存储数据,使得状态成为任何类型的更复杂操作的关键构建模块. 为了使状态具有容错性, ...
- CF-1440C2 Binary Table (Hard Version) (构造,模拟)
Binary Table (Hard Version) 题意 \(n*m(2\le n,m\le 100)\) 的01矩阵,每次可以选择一个宽度为2的子矩阵,将四个位置中的任意3个进行翻转,即0变1, ...
- Codeforces Round #690 (Div. 3)
第一次 ak cf 的正式比赛,不正式的是寒假里 div4 的 Testing Round,好啦好啦不要问我为什么没有 ak div4 了,差一题差一题 =.= 不知不觉已经咕了一个月了2333. 比 ...
- Codeforces Round #654 (Div. 2)
比赛链接:https://codeforces.com/contest/1371 A. Magical Sticks 题意 有 $n$ 根小棍,长度从 $1$ 到 $n$,每次可以将两根小棍连接起来, ...
- int和longlong的范围
unsigned int 0-4294967295 (10位数,4e9) int -2147483648-2147483647 (10位 ...
- hdu5531 Rebuild
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submissi ...