dev用不了_惊艳!小姐姐用动画图解 Git 的 10 大命令,这也太秀了吧!
原文地址:https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif
原文作者:Lydia Hallie
前言
尽管 Git
是一款非常强大的工具。
我发现在使用 Git
时,在头脑里可视化地想象它会非常有用:当我执行一个特定命令时,这些分支会如何交互,又会怎样影响历史记录?
为什么当我在 master
上执行硬重启,force push
到原分支以及 rimraf
我们的 .git
文件夹时,我的同事哭了?
我觉得创建一些最常用且最有用的 Git
命令的可视化示例会是一个完美的用例!
下面我将介绍的很多命令都有可选参数——你可以使用这些参数来改变对应命令的行为。
而我的示例只会涵盖命令的默认行为,而不会添加(或添加太多)可选配置!
合并中 Merging
拥有多个分支是很方便的,以使新变更彼此分离,并确保您不会意外将未经批准或破损的变更推到生产中。
但一旦这些修改得到了批准许可,我们就可以将其部署到我们的生产分支中了!
将更改从一个分支转移到另一个分支的一种方法是执行 git merge
! Git
可以执行两种类型的合并:fast-forward
和 no-fast-forward
现在这可能没有多大意义,所以让我们看一下差异!
Fast-forward(--ff
)
在当前分支相比于我们要合并的分支没有额外的提交(commit
)时,可以执行 fast-forward
合并。
Git 很懒,首先会尝试执行最简单的选项:fast-forward
!这类合并不会创建新的提交,而是会将我们正在合并的分支上的提交直接合并到当前分支。
完美!现在,我们 dev
可以在分支上获得对 master
分支所做的所有更改。
那么 no-fast-forward
又是什么意思呢?
No-fast-foward (--no-ff
)
如果你的当前分支相比于你想要合并的分支没有任何提交,那当然很好,但很遗憾现实情况很少如此!
如果我们在当前分支上提交我们想要合并的分支不具备的改变,那么 git
将会执行 no-fast-forward
合并。
使用 no-fast-forward
合并时,Git
会在当前活动分支上创建新的 merging commit
。
这个提交的父提交(parent commit
)即指向这个活动分支,也指向我们想要合并的分支!
没什么大不了的,完美的合并!
现在,我们在 dev
分支上所做的所有改变都合并到了 master
分支上。
合并冲突 Merge Conflicts
尽管 Git
能够很好地决定如何合并分支以及如何向文件添加修改,但它并不总是能完全自己做决定。
当我们想要合并的两个分支的同一文件中的同一行代码上有不同的修改,或者一个分支删除了一个文件而另一个分支修改了这个文件时,Git
就不知道如何取舍了。
在这样的情况下,Git
会询问你想要保留哪种选择?假设在这两个分支中,我们都编辑了 README.md
的第一行。
如果我们想把 dev
合并到 master
,就会出现一个合并冲突:你想要标题是 Hello! 还是 Hey!?
当尝试合并这些分支时,Git
会向你展示冲突出现的位置。
我们可以手动移除我们不想保留的修改,保存这些修改,再次添加这个已修改的文件,然后提交这些修改。
完成!尽管合并冲突往往很让人厌烦,但这是合理的:Git
不应该瞎猜我们想要保留哪些修改。
变基(Rebasing)
我们刚看到可通过执行 git merge
将一个分支的修改应用到另一个分支。
另一种可将一个分支的修改融入到另一个分支的方式是执行 git rebase
。
git rebase
会将当前分支的提交复制到指定的分支之上。
完美,现在我们在 dev
分支上获取了 master
分支上的所有修改。
变基与合并
有一个重大的区别:Git
不会尝试确定要保留或不保留哪些文件。我们执行 rebase
的分支总是含有我们想要保留的最新近的修改!这样我们不会遇到任何合并冲突,而且可以保留一个漂亮的、线性的 Git
历史记录。
上面这个例子展示了在 master
分支上的变基。但是,在更大型的项目中,你通常不需要这样的操作。git rebase
在为复制的提交创建新的 hash
时会修改项目的历史记录。
如果你在开发一个 feature
分支并且 master
分支已经更新过,那么变基就很好用。你可以在你的分支上获取所有更新,这能防止未来出现合并冲突。
交互式变基(Interactive Rebase)
在为提交执行变基之前,我们可以修改它们!我们可以使用交互式变基来完成这一任务。交互式变基在你当前开发的分支上以及想要修改某些提交时会很有用。
在我们正在 rebase
的提交上,我们可以执行以下 6 个动作:
reword
:修改提交信息;edit
:修改此提交;squash
:将提交融合到前一个提交中;fixup
:将提交融合到前一个提交中,不保留该提交的日志消息;exec
:在每个提交上运行我们想要rebase
的命令;drop
:移除该提交。
很棒!这样我们就能完全控制我们的提交了。如果你想要移除一个提交,只需 drop
即可。
如果你想把多个提交融合到一起以便得到清晰的提交历史,那也没有问题!
交互式变基能为你在 rebase 时提供大量控制,甚至可以控制当前的活动分支。
重置(Resetting)
当我们不想要之前提交的修改时,就会用到这个命令。也许这是一个 WIP 提交或者可能是引入了 bug
的提交,这时候就要执行 git reset
。
git reset
能让我们不再使用当前台面上的文件,让我们可以控制 HEAD
应该指向的位置。
软重置
软重置会将 HEAD
移至指定的提交(或与HEAD
相比的提交的索引),而不会移除该提交之后加入的修改!
假设我们不想保留添加了一个 style.css
文件的提交 9e78i
,而且我们也不想保留添加了一个 index.js
文件的提交 035cc
。但是,我们确实又想要保留新添加的 style.css
和 index.js
文件!这是软重置的一个完美用例。
输入 git status
后,你会看到我们仍然可以访问在之前的提交上做过的所有修改。这很好,这意味着我们可以修复这些文件的内容,之后再重新提交它们!
还原(Reverting)
另一种撤销修改的方法是执行 git revert
。通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交。
假设 ec5be
添加了一个 index.js
文件。但之后我们发现其实我们再也不需要由这个提交引入的修改了。那就还原 ec5be
提交吧!
完美!提交 9e78i
还原了由提交 ec5be
引入的修改。在撤销特定的提交时,git revert
非常有用,同时也不会修改分支的历史。
拣选(Cherry-picking)
当一个特定分支包含我们的活动分支需要的某个提交时,我们对那个提交执行 cherry-pick
!对一个提交执行 cherry-pick
时,我们会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。
假设 dev
分支上的提交 76d12
为 index.js
文件添加了一项修改,而我们希望将其整合到 master
分支中。我们并不想要整个 dev
分支,而只需要这个提交!
现在 master
分支包含 76d12
引入的修改了。
取回(Fetching)
如果你有一个远程 Git
分支,比如在 GitHub
上的分支,当远程分支上包含当前分支没有的提交时,可以使用取回。比如当合并了另一个分支或你的同事推送了一个快速修复时。
通过在这个远程分支上执行 git fetch
,我们就可在本地获取这些修改。这不会以任何方式影响你的本地分支:fetch
只是单纯地下载新的数据而已。
现在我们可以看到自上次推送以来的所有修改了。这些新数据也已经在本地了,我们可以决定用这些新数据做什么了。
拉取(Pulling)
尽管 git fetch
可用于获取某个分支的远程信息,但我们也可以执行 git pull
。git pull
实际上是两个命令合成了一个:git fetch
和 git merge
。当我们从来源拉取修改时,我们首先是像 git fetch
那样取回所有数据,然后最新的修改会自动合并到本地分支中。
很好,我们现在与远程分支完美同步了,并且也有了所有最新的修改!
Reflog
每个人都会犯错,但犯错其实没啥!有时候你可能感觉你把 git repo
完全搞坏了,让你想完全删了了事。
git reflog
是一个非常有用的命令,可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含你对你的分支所做的任何修改。
如果你犯了错,你可以根据 reflog
提供的信息通过重置 HEAD
来轻松地重做!
假设我们实际上并不需要合并原有分支。当我们执行 git reflog
命令时,我们可以看到这个 repo
的状态在合并前位于 HEAD@{1}
。那我们就执行一次 git reset
,将 HEAD
重新指向在 HEAD@{1}
的位置。
我们可以看到最新的动作已被推送给 reflog
。
Git有很多有用强大的命令,我希望我能掌握所有!
我知道我现在还没有介绍其他有用的命令:让我知道您最喜欢/最有用的命令是什么,我可能会在另一篇文章中介绍它们!
和往常一样,随时与我联系!
最后
译者:夜尽天明
笔者博客地址:https://github.com/biaochenxuying/blog/issues/65
外国友人技术博客的语言表达的方式和风格、与国人的还是有很大差别的啊。
姐妹篇:
- 惊艳!可视化的 js:动态图演示 - 事件循环 Event Loop
- 惊艳!可视化的 js:动态图演示 Promises & Async/Await 的过程!
支持一下下
dev用不了_惊艳!小姐姐用动画图解 Git 的 10 大命令,这也太秀了吧!相关推荐
- git merge 冲突_卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!
公众号关注 "GitHubDaily" 设为 "星标",每天带你逛 GitHub! 大家好,我是小 G. 在座的各位应该都知道,Git 作为居家必备.团队协作之 ...
- git指令如何葱master转到dev_小姐姐用动画图解Git命令,一看就懂!
「 点击图片获取最近两年爆款好文 」 无论是开发.运维,还是测试,大家都知道Git在日常工作中的地位.所以,也是大家的必学.必备技能之一.之前公众号也发过很多git相关的文章: Git这些高级用法,喜 ...
- 惊艳的HTML5粒子动画特效
转自:http://geek.csdn.net/news/detail/201487?ref=myread HTML5确实非常强大,很多时候我们可以利用HTML5中的新技术实现非常炫酷的粒子动画效果, ...
- html5 粒子动画效果制作,8款惊艳的HTML5粒子动画特效
原标题:8款惊艳的HTML5粒子动画特效 HTML5确实非常强大,很多时候我们可以利用HTML5中的新技术实现非常炫酷的粒子动画效果,粒子动画在HTML5应用中也是比较消耗本地资源的,尤其是CPU,但 ...
- html5粒子效果,8款惊艳的HTML5粒子动画特效
[导读] HTML5确实强大,很多时候我们可以利用HTML5中的新技术实现非常炫酷的粒子动画效果,粒子动画在HTML5应用中也是比较消耗本地资源的,尤其是CPU,但是有些HTML5粒子效果确实能给用户 ...
- 11款惊艳的HTML5粒子动画特效
HTML5确实非常强大,很多时候我们可以利用HTML5中的新技术实现非常炫酷的粒子动画效果,粒子动画在HTML5应用中也是比较消耗本地资源的,尤其是CPU,但是有些HTML5粒子效果确实能给用户带来不 ...
- 仪表盘刻度调整_惊艳了我的仪表盘 那些年我遇到最美的“面孔”
文| G哥 汽仪表盘上的信息可以让车主们了解自己座驾的状况,出彩的仪表盘设计甚至能让消费者购车时对这款车一见倾心,回顾过往曾经惊艳到我们的那些酷炫仪表盘,那些面孔你是否还依稀还记得-- 汽车的什么地方 ...
- qq浏览器插件_惊艳与吐槽:QQ浏览器升级到 Chromium70 内核以后
腾讯的UI设计一如既往的漂亮 在此之前,因为几个槽点迟迟未能解决,一度对QQ浏览器卸了又装装了又卸.比如它的收藏夹,N年前我将建议过,一定要改为下拉弹出式菜单,他们的态度是虚心接受坚决不改. 这几天闲 ...
- html 字体特效在线,盘点那些惊艳的HTML5文字动画特效,不敢相信这些都是CSS+JS实现的!...
本文小设哥将给大家介绍十个 「"惊人"」 的文字动画效果,希望小设哥精心录制的十个 Gif 动画能让大家感到 「"惊艳"」,当然更希望这些特效能给大家实现文字动 ...
最新文章
- 使用迭代查找一个list中最小和最大值,并返回一个tuple。
- 公积金联名卡——提取公积金用,用身份证即可办理
- Bochs调试加载符号文件的问题
- boost::spirit模块使用 phoenix 进行实际表达式评估的语法和语义操作的测试程序
- [Stardust]星尘分布式全链路监控
- docker hub push_Docker系列-(2) 镜像制作与发布
- java break(),Java BreakIterator last()用法及代码示例
- java 中缀式转后缀式
- 【深入理解JVM】运行时数据区域:java虚拟机栈
- python入门教程基础语法_python入门教程13-02 (python语法入门之库相关操作)
- 要点初见:用Python进行微观交通模型仿真——基于SUMO的伯克利开源项目Flow Project初探与拓展
- 如何做出3blue1brown的动画视频
- 2020腾讯秋招笔试编程题--压缩算法
- 用户画像项目两大核心内容之一“one_id”(含SQL实现代码)
- 计算机硬件类的相关课程,计算机硬件类课程,hardware course,音标,读音,翻译,英文例句,英语词典...
- 关于cookie的跨域(一级域)
- 七、jsp基础(七)-- 总结
- 【C++实现yolov5的OpenVINO部署_2】
- java如何引用文件_java 中如何引用json文件
- 月历(从星期一开始)