Git 学习笔记(Learn Git Branch整理而成)

本文详细梳理了Git的主要命令,包括基础的commit、branch、merge、rebase操作,以及高级特性如分离HEAD、相对引用、撤销更改、移动提交记录等。此外,还介绍了如何处理远程仓库的push、pull、fetch、merge等操作,深入探讨了团队协作中可能出现的情况。通过实例演示,帮助读者掌握Git的高级用法和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Git 笔记

文章目录


前言

本文是根据Learning Git Branching游戏中学习整理而来的。
本文整体结构就是按照游戏“目录设计”进行安排
同时本人也会加上命令解释、给出使用示例以及给出游戏的最终答案。
不想慢慢玩游戏学习的童鞋,可以看此文章速览全部游戏关于git介绍
虽然这个游戏并不会涵盖所有所有的命令,但是作为入门理解思想是非常到位的!因为这个是可视化git!

正文

开头的一到五章讲解的都是本地仓库的命令,即这些命令都是对本地仓库进行操作。第六章之后才是远程。

一、基础篇(git主要命令)

1. git commit

功能:将增量修改的内容进行提交
示例:(解释:C0、C1是分开的两次提交记录,其中C0 是C1 父分支,即C1是基于C0增量修改提交的,main意思是箭头指向的之处的分支线叫main分支,其标指向的就是该分支最新的提交处,其中*号意思是你目前正在操作的分支,是一个标记。)
在这里插入图片描述
git commit 之后
在这里插入图片描述
此时增加C2提交记录,且是基于C1的,仍然是main分支线上的延申。

游戏答案:
git commit
git commit

2. git branch 分支名 | git checkout 分支名

- git branch 分支名 -
功能 :即在现在的分支线上开辟另一个分支(有点像开一个分叉树枝的芽),在该节点之前的内容都是相同的,之后提交的内容就只能在一个分支上延申。
示例
在这里插入图片描述
git branch newImage
在这里插入图片描述
(解释:我们可以看到现在多了一个newImage分支,但是因为我们只是新建分支,也就是多了一个芽而没有树干,所以两个分支都在C1处。
此时如果我们输入
git commit
在这里插入图片描述
main分支往前一步,当前分支还是main,newImage还是在C1处

- git checkout 分支名 -
功能 :切换当前操作的分支到特定分支名。
示例:(当前是main分支)
在这里插入图片描述
git checkout newImage
git commit
在这里插入图片描述

最后其实还有个快捷键:git checkout -b 分支名 实现创建分支的同时切换该分支为当前操作分支

游戏答案:
git checkout -b bugFix

3. git merge 分支名 | git rebasse 分支名

- git merge 分支名 -
功能:将当前分支和另一个指定分支合并,可能会产生新的结点,也可能不会,看下面示例。
示例
在这里插入图片描述
git merge bugFix
在这里插入图片描述
git checkout bugFix
git merge main
在这里插入图片描述

git merge游戏答案:
git checkout -b bugFix
git commit
git checkout main
git commit
git merge bugFix

git rebase 分支名
作用:即将当前的分支合并到另一分支,但是合并的方式不是多一个结点,而是将当前分支的所有多出来的修改全部加到另一个分支,这时整体上看只有一条线性发展。而不是分开同步运行后合并的视角,而是将并行转化成前后的同步关系
示例
在这里插入图片描述
git rebase main
在这里插入图片描述
git checkout main
git rebase bugFix
在这里插入图片描述

二、高级篇

1. 分离HEAD(git checkout 记录结点名)

作用:分离HEAD,就是我们可以操作的当前位置不再是对分支而是可以对某次记录也就是结点。
解释:HEAD默认就是指向分支名的,即我们看到的*指向的分支,当我们分支commit后,我们HEAD会往前走,分支便也会自动往前走,而如果我们指向具体历史记录commit后,HEAD往前走,分支原地不动,这就是分离HEAD脱离了分支。
即原本 HEAD->main分支->c1结点 变成 HEAD->c1 这就是分离
示例:
在这里插入图片描述
git checkout main
在这里插入图片描述
没有变化,因为HEAD->bugFix->c4,即使git commit两者同步向前
git checkout c4
在这里插入图片描述
HEAD->c4 分离开来
git commit
在这里插入图片描述
HEAD会往前走,但分支不会动

2. 相对引用(git checkout 分支名^ | git checkout 分支名~num)

作用:分离HEAD的时候可以通过当前分支相对的移动,这样我们可以不用记住某结点哈希值(可以通过git log查看)。这里说一说结点哈希值是什么,我们会发现我们之前分支名都是c1之类的,其实c1只是这个结点哈希值的头两个值,但因为具有区分唯一性,所以我们可以只打开头两个字符,全名可能是:c4d2da64c0efc5293610bdd892f82a58e8cbc5d8。所以相对引用就是HEAD的设置不根据哈希值来确定,可以通过相对位置确定。因为分支名字相对于结点名字更加的容易记住和使用。
示例:
在这里插入图片描述
git checkout main^
在这里插入图片描述
第二个例子:
在这里插入图片描述
git checkout c3
git checkout HEAD^
git checkout HEAD^
git checkout HEAD^
在这里插入图片描述
第三个示例:
在这里插入图片描述
git checkout HEAD~4
在这里插入图片描述
第四个示例:
在这里插入图片描述
git branch -f main HEAD~3
相对引用为我们提供了一种简洁的引用提交记录 C1 的方式, 而 -f 则容许我们将分支强制移动到那个位置。
在这里插入图片描述

第一个游戏答案:
gti checkout bugFix^
第二个游戏答案:
git checkout HEAD^
git branch -f main c6
git branch -f bugFix HEAD^

3. 撤销更改 (git reset 结点位置 | git revert 结点位置)

作用:撤销之前提交过的更改,这里要分为两种情况讨论,一个是对于本地而言的更改,一个是针对远程的更改。git reset是针对本地而言,这个撤回向上移动分支,原来指向的提交记录就跟从来没有提交过一样,这里没有提交过是针对远程的协作成员而言,他们不知道你曾经在你的本地撤销过,但其实撤销后记录还在,只是不在暂存区。而对于git revert则是针对远程的撤销这个更改所有人是可见的,怎么可见呢?就是会有个多出来的结点表示撤销了更改。可以看下面示例就清楚了。
示例:
示例1:git reset
在这里插入图片描述
git reset HEAD^
在这里插入图片描述
示例2:git revert
在这里插入图片描述
git revert HEAD~1
在这里插入图片描述
可以看到所谓的撤回还是增加了新的结点让所有人知道你撤回了。

游戏答案:
gti reset HEAD^
gti checkout pushed
gti revert HEAD~1

三、移动提交记录(自由修改树)

1. git cherry-pick 提交号

作用:将一些提交复制到当前所在的位置(HEAD)下面
示例:
在这里插入图片描述
git Cherry-pick c2 c4
在这里插入图片描述
可以看到,此时相对于rebase 来说,最大的特点就是原本的分支不会变,而是将这个“樱桃”给复制过来了。(这里只复制了c2 c4,没有c3)

第一个游戏答案:
gti cherry-pick c3 c4 c7
第二个游戏答案:
git checkout HEAD^
git branch -f main c6
git branch -f bugFix HEAD^

2. 交互式rebase(git rebase -i 分支名^ | git checkout 分支名~num)

作用:cherry-pick需要指定特定的记录,比如某个记录的哈希值,而如果清不清楚的话,这时候就可以使用rebase -interactive,这个命令的意思是将git可视化出现一个UI图,便于我们对UI图进行交互式的操作,(在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。)它提供了三个操作:

  1. 调整提交记录的顺序(通过鼠标拖放来完成)
  2. 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
  3. 合并提交(允许你把多个提交记录合并成一个)

<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值