动画图解Git命令

​Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版本管理工具

尽管Git是一个非常强大的工具,但我认为大多数人都会同意我的说法,即它也可以是。。。彻头彻尾的噩梦😐 一直觉得在脑海中想象使用Git时发生的事情非常有用:当我执行某个命令时,分支是如何交互的,它将如何影响历史?国外来自英属哥伦比亚的程序媛 Lydia Hallie《CS Visualized: Useful Git Commands》。在这篇文章里面,她通过生动形象的动画,以更加直观的方式,向开发者展示 Git 命令中的 merge、rebase、reset、revert、cherry-pick 等常用骚操作的具体原理

1.Git | Merging (git merge)

- Fast-forward (--ff)

当当前分支与正在合并的分支相比没有额外提交时,可能会发生快速向前合并,Git首先尝试执行最简单的选择 Fast-forward 模式合并不会创建新的提交,而是合并当前分支中合并的分支上的提交

现在,在dev分支上所做的所有更改都在master分支上可用。那么,No-fast-foward 是怎么回事?

- No-fast-foward (--no-ff)

如果您当前的分支与要合并的分支相比没有任何额外的提交,那就太好了,但不幸的是,这种情况很少发生!如果我们在当前分支上提交了要合并的分支没有的更改,git将执行No-fast-foward 合并。使用No-fast-foward合并,Git在活动分支上创建一个新的合并提交。提交的父提交指向活动分支和要合并的分支!

合并冲突修复的过程 ,动画演示如下:

完美的合并!🎉 主分支现在包含我们对dev分支所做的所有更改

2.Git | Rebasing (git rebase)

尽管Git擅长于决定如何合并分支并添加对文件的更改,但它不能总是独自做出这个决定;当我们试图合并的两个分支在同一文件的同一行上有更改,或者如果一个分支删除了另一个分支修改的文件,等等,都可能发生这种情况。 在这种情况下,Git将要求您帮助决定我们要保留的两个选项中的哪一个!假设在两个分支上 当尝试合并分支时,Git将显示冲突发生的位置。我们可以手动删除不想保留的更改,保存更改,再次添加更改的文件,并提交更改 我们刚刚看到了如何通过执行git合并将更改从一个分支应用到另一个分支。将更改从一个分支添加到另一个分支的另一种方法是执行git rebase。 ![](https://img2020.cnblogs.com/blog/1837087/202004/1837087-20200430220707113-449163643.gif) 与合并相比,一个很大的区别是Git不会试图找出要保留和不保留哪些文件。我们正在重新调整的分支总是有我们想要保留的最新更改!这样就不会遇到任何合并冲突,并保持良好的线性Git历史记录 此示例显示主分支上的重新调整。然而,在更大的项目中,你通常不想这样做。 当您正在处理一个特性分支,并且主分支已经更新时,重新调整是非常好的。您可以获得分支上的所有更新,这将防止将来的合并冲突! > git rebase还提供了 6 种操作模式: - reword:修改提交信息 - edit:修改此提交 - squash:将当前提交合并到之前的提交中 - fixup:将当前提交合并到之前的提交中,不保留提交日志消息 - exec:在每一个需要变基的提交上执行一条命令

drop:删除提交

以 drop 为例:


或者,如果我们想将多个提交压缩在一起以获得更清晰的历史记录,没问题!

以 squash 为例:

交互式重定基可让您对试图重定基址的提交有很大的控制权,即使在当前活动的分支上也是如此!

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

- Hard reset硬重置

硬重置时:无需保留提交已有的修改,直接将当前分支的状态恢复到某个特定提交下。需要注意的是,硬重置还会将当前工作目录(working directory)中的文件、已暂存文件(staged files)全部移除!如下图所示:

4.Git | Reverting (git revert)

举个例子,我们在 ec5be 上添加了 index.js 文件。之后发现并不需要这个文件。那么就可以使用 git revert ec5be 指令还原之前的更改。如下图所示:

5.Git | Cherry-picking(git cherry-pick)

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

6.Git | Fetching (git fetch)

使用 git fetch 指令将远程分支上的最新的修改下载下来。

7.Git | Pulling (git pull)

git pull 指令实际做了两件事:git fetch 和 git merge。
如下图所示:

8.Git | Reflog (git reflog)

git reflog 用于显示所有已执行操作的日志!包括合并、重置、还原,也就是记录了对分支的一切更改行为。

如果,你不想合并 origin/master 分支了。就需要执行 git reflog 命令,合并之前的仓库状态位于 HEAD@{1} 这个地方,所以我们使用 git reset 指令将 HEAD 头指向 HEAD@{1}就可以了。


作者:码农架构
本文版权归作者和博客园共有,欢迎转载,欢迎关注微信公众号"码农架构"-专注于系统架构、高可用、高性能、高并发类技术分享。

posted @ 2020-04-30 22:10  码农架构  阅读(178)  评论(0编辑  收藏