百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

git命令的进阶和复习(带动图效果)

wptr33 2024-11-06 20:33 22 浏览

码个蛋(codeegg) 第 974 次推文

作者:老郑的技术杂货铺链接:https://juejin.im/post/5e9e49356fb9a03c917fe7fd

1. 学习途径

个人学习途径主要以下几个:

  • learnGit在线学习

  • 猴子都能懂的git

  • 小姐姐用动画图解Git

个人比较推荐第二个Git学习网站猴子都能懂的git,图文结合,简单明了,本文将介绍一些常用 Git 指令,作为一个学习总结

  • git rebase

  • git merge

  • git reset

  • git revert

  • git cherry-pick

  • git fetch

  • git pull

  • git reflog

2. 分支的合并(merge)

对于merge而言,又有两个合并策略:

  • fast-forward

  • no-fast-forward

假设bugfix分支是从master分支分叉出来的,以这个图作为初始分支状态

2.1 fast-forward

git merge默认采用fast-forward的方式,执行git merge等同于执行git merge --ff,–ff是fast-forward的简写。特点:

快进操作:只更新指针的指向,不会创造一个新的commit节点。

缺点:一旦删除分支或者分支指针往前走,会丢掉分支信息(原来这个分支的做了什么在log中体现不出来)

触发时机:合并 bugfix分支到master分支时,如果master分支的状态没有被更改过,这样的合并被称为fast-forward(快进)合并

2.2 no-fast-forward

--no-ff 指的是强行关闭fast-forward方式,使得每一次的合并都创建一个新的commit记录。完整的命令如下

//即在合并分支命令加入 --no-ff 后缀的方式运行$ git merge --no-ff -m "merge with no-ff" dev
  • 如何设置默认为no-fast-forward模式


//第一种方案:全局设置禁用fast-forwardgit config --global --add merge.ff false//第二种方案:某个分支单独禁用fast-forwardgit config branch.【分支名】.mergeoptions "--no-ff"

触发时机:比如master分支的历史记录有可能在bugfix分支分叉出去后有新的更新。

此时如果把bugFix合并到master,合并两个修改会生成一个提交。这时,master分支的HEAD会移动到该提交上。

3. 变基(rebase)

reabse和merge其实都可以看作为合并操作,rebase 的优势就是可以创造更线性的提交历史,还是以这张图为列

执行以下命令:

//rebase bugfix分支到master分支? ~ git:(master) ? git rebase bugfix

现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。rebase之后,唯一的问题就是 master的HEAD位置还没有更新。所以需要【将master的HEAD移动到bugfix的HEAD

~ git:(bugFix) ? git checkout master~ git:(master) ? git merge bugFix 或者git rebase bugFix

由于篇幅原因,有兴趣的可以在了解下交互式变基,交互式变基修改commit,如commit的合并、顺序调整、commit的提交日志修改。

4. 重置(reset)

撤销变更方式有两种。其中一种就是git reset(控制当前分支回撤到某次提交时的状态。),这个部分这篇文章小姐姐用动画图解Git讲的相对好一些

4.1 软重置

最大的特点:撤回到特定提交之后,已有的修改会保留

以下图为例:9e78i 提交添加了 style.css 文件,035cc 提交添加了 index.js 文件。使用软重置,我们可以撤销提交记录,但是保留新建的 style.css 和 index.js 文件。

4.2 硬重置

最大的特点:无需保留提交已有的修改,直接将当前分支的状态恢复到某个特定提交下,,硬重置还会将当前工作目录(working directory)中的文件、已暂存文件(staged files)全部移除

使用 git status 查看,发现当前操作空间空空如也。Git 丢弃了 9e78i 和 035cc 两次提交引入的修改,将仓库重置到 ec5be 时的状态

5. 还原(revert)

虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的,所以要使用revert

最大的特点:用于还原某次提交的修改时,会创建一个包含已还原更改的 新提交记录

比如:我们在 ec5be 上添加了 index.js 文件。之后发现并不需要这个文件,可以执行git revert ec5be指令还原之前的更改

新的提交记录 9e78i 还原了 ec5be 引入的更改。git revert 可以在不修改分支历史的前提下,还原某次提交引入的更改

6. 检出提交(cherry-pick)

如果某个分支上的某次提交的修改正是当前分支需要的,那我们可以使用 git cherry-pick命令检出某次的提交更改,作为新的提交添加到当前分支上面

//命令形式为:git cherry-pick <提交号>...

比如:dev 分支上的 76d12 提交添加了 index.js 文件,我们需要将本次提交更改加入到 master 分支,那么就可以使用 git cherry-pick 76d12单独检出这条记录修改。

7 git fetch

比如:你和你的同事在master分支上工作,如果你的同事将他做的更改提交到了远程分支上(orgin/master),而这些提交是你本地没有的,此时,就要使用git fetch指令将远程分支上的最新的修改下载下来

git fetch 指令并没有影响本地分支,即head指针位置未改变

8. 拉取(pull)

git pull指令实际做了两件事:git fetchgit merge这里,相当于在get fetch基础上,移动了Head指针。这里就不具体阐述了

9. Reflog

git reflog 是一个非常有用的命令,用于显示所有已执行操作的日志!包括合并、重置、还原:基本上记录了对分支的任何更

使用场景:假设你不小心使用 git reset 命令硬重置仓库到某个提交。后面突然想到,重置导致了一些已有的正常代码的误删

demo 我们不想合并 origin/master 分支了。执行 git reflog 命令,我们看到合并之前的仓库状态位于 HEAD@{1} 这个地方,我们使用 git reset 指令将 HEAD 头指向 HEAD@{1}

10. 补充

10.1 commit --amend

可以更新先前的commit的提交信息,并且本地仓库中并不会产生一个新的commit

10.2 squash merge

可能你遇到过想要合并多个 commit 为一个,这时候就可以用squash merge把某个分支上的所有提交都合并成一个提交

git merge --squash 分支名
  • 如果郭德纲是个互联网人

  • 仿小红书长图片自动循环滚动效果实现 (附完整源码)

  • 读书能享受到时间的复利吗

你有没有总结过这些命令?

相关推荐

Linux高性能服务器设计

C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...

独立游戏开发者常犯的十大错误

...

学C了一头雾水该咋办?

学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...

C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?

上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...

C语言实战小游戏:井字棋(三子棋)大战!文内含有源码

井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...

C++语言到底是不是C语言的超集之一

C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...

在C++中,如何避免出现Bug?

C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...

ESL-通过事件控制FreeSWITCH

通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...

物理老师教你学C++语言(中篇)

一、条件语句与实验判断...

C语言入门指南

当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...

C++选择结构,让程序自动进行决策

什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...

C++特性使用建议

1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...

C++程序员学习Zig指南(中篇)

1.复合数据类型结构体与方法的对比C++类:...

研一自学C++啃得动吗?

研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...

C++关键字介绍

下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...