![62e2a770e83f667ee42b49e81ef04f14.png](https://i-blog.csdnimg.cn/blog_migrate/64304afb4e2c7533afa9e0d4b529758c.jpeg)
内容首发
乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech
用代码理解分析解决金融问题
不知道大家有没有这样的经历,不过小管家在写东西的时候,会有非常多的版本
![56fa806bfd9b74a05534d7c45919bcf2.png](https://i-blog.csdnimg.cn/blog_migrate/798a8e5b60fd15eb7ba6dbba65e94f65.jpeg)
这种命名方式非常不好,而且在团队协作中很容易出错。
而且容易打脸。。。
![f9849995770ed61e5a67bba0400c2b5d.png](https://i-blog.csdnimg.cn/blog_migrate/8ef10829a8fb108cd346f842b39deacb.jpeg)
![cc12f20c375800773f4e696a5ee0e80d.png](https://i-blog.csdnimg.cn/blog_migrate/9cb84349e41374b5d04f64a6980e0d03.jpeg)
![7569c6d73b601d22ce4b05b8ca0bddd0.png](https://i-blog.csdnimg.cn/blog_migrate/c34c5e7f47bf518c9ba1ae891be1d497.jpeg)
在经过数次毒打之后,
小管家痛定思痛,决定系统的学习版本控制工具git。
![979ad64c02e562a06f9b7dae985c51e8.png](https://i-blog.csdnimg.cn/blog_migrate/fef2fe71f30d4a1634734ee107009b05.png)
不需要反复创建新文件,通过git跟踪文件夹下的文件,这样每次改动后进行一次提交,可以直接回滚到任何版本,非常方便~
所以今天小管家跟大家分享一个版本控制工具git与其常见操作,每个操作都有相关代码命令与图示,内容较多,建议可以收藏起来慢慢看~
欢迎“分享”,“喜欢”,“收藏”三连,爱你们~
0.git commit进行版本提交
![fdcea2acc30490cb38c5cad75be8adfc.png](https://i-blog.csdnimg.cn/blog_migrate/39ea88f926900ed46881ec097ba9496c.png)
一次git commit提交版本
git commit
![9d973c0302a8a9109b8826b6ce024eeb.png](https://i-blog.csdnimg.cn/blog_migrate/7daf1685ff767d704d84f7bdd33ac651.png)
1.git branch创建分支
![723d8309ac13639ae96883d4c8896d30.png](https://i-blog.csdnimg.cn/blog_migrate/11352f012ac9e0393938047f7e2479b6.png)
创建newImage分支
git branch newImage
![723d8309ac13639ae96883d4c8896d30.png](https://i-blog.csdnimg.cn/blog_migrate/11352f012ac9e0393938047f7e2479b6.png)
提交新branch分支
git commit
![0b138fcea32dd9768ac0d4bcc909c364.png](https://i-blog.csdnimg.cn/blog_migrate/bce137501610cbbd9107a3866e8c9953.png)
这里注意到newImage并没有动,master到下面去了,这证明我们并未切换到newImage这个分支上
在git中,*这个符号代表你现在所在的分支。
于是我们需要——
2.git checkout 切换分支
如果我们目前在master分支,情况如下图:
![0b138fcea32dd9768ac0d4bcc909c364.png](https://i-blog.csdnimg.cn/blog_migrate/bce137501610cbbd9107a3866e8c9953.png)
我们现在需要切换到newImage分支,所以可以
git checkout newImage
git commit
![186c3ab54c1fca6db5ec3fd681e1c14d.png](https://i-blog.csdnimg.cn/blog_migrate/147711158c7d5066e40dab87c735d218.png)
我们就会发现newImage已经到下方了,而且*这个符号正在newImage上面,也就是说目前我们在的分支是newImage。
3.git checkout -b 一次性搞定创建与切换分支
如果你觉得以上创建与切换的方法太麻烦,这里介绍一个小技巧可以一次性搞定
比如目前是
![af6068da0da85740f9fffecbecc84e32.png](https://i-blog.csdnimg.cn/blog_migrate/b36767a321678bc2273bca54e4dc75b2.png)
我们想创建一个bugFix的分支并且切换到bugFix分支上去,可以直接通过
git checkout -b bugFix
![efc92c2395fded7d29f4e335ab90cb1a.png](https://i-blog.csdnimg.cn/blog_migrate/5be49026a961dd796b6331d33b59a3e6.png)
这样我们在bugFix这个分支里面到代码如果写完后,就可以直接提交了
git commit
![d5a765bf767c814e9dde794bad9dab67.png](https://i-blog.csdnimg.cn/blog_migrate/0b990b2f4d3bcc9d35f3610be7439191.png)
这种操作在实际开发中用的非常多,比如程序出现了一个Bug,但是这个Bug并不严重,你可以新开一个bugFix分支进行各种优化与修改,这些修改并不影响整体到master主干代码。
那么如果这个bug修补好了,接下来我们就可以——
4.git merge 合并分支
假设一个这样的情况:我们现在想把已经完成修改的bugFix合并到master
![d5a765bf767c814e9dde794bad9dab67.png](https://i-blog.csdnimg.cn/blog_migrate/0b990b2f4d3bcc9d35f3610be7439191.png)
我们可以输入
git merge bugFix
![7f98ce6e6149570011f9735626775560.png](https://i-blog.csdnimg.cn/blog_migrate/9b3043ab9fbff554eacb8eafd79df2f0.png)
我们可以看到我们现在所在的C4(master*)同时指向了C2(bugFix分支)与C3(原先的master分支),C2与C3又同时指向了C1,C1又指向了C0(也就是最开始的root),也就是说目前的C4(master*)包含了这个repo仓库里面所有的内容了。
当然,我们这种分支合并是比较常见的,但是我们还可以这样做——
5.把master内容合并到分支里面
比如说我们目前是这样的情况
![b1d3a062feb173eaa39d65bb5051465b.png](https://i-blog.csdnimg.cn/blog_migrate/3a381463ca48b40e3ba9163b201336ac.png)
我们不想用master作为我们的主干,我们想直接在bugFix上继续开发,但是需要合并master里面所有的内容,我们可以反过来把master里的内容合并到bugFix分支里面
git checkout bugFix
git merge master
![4ca829d4d51338651fd2de9675746e7c.png](https://i-blog.csdnimg.cn/blog_migrate/ca9cc0f6461bc24d95356ea06b9b5298.png)
注意到这里bugFix其实是master的上一次提交,所以我们如果合并直接就把bugFix与目前master提交的所有内容合并,一次提交就可以了~
当然,不仅仅只有这么一种合并分支的方法,我们接下来看看一个更加简洁清晰的合并方法——
6.git rebase 变基合并
比如我们现在假设面临这样的情况:
![dc010034e2293b22ca389740fa58e03a.png](https://i-blog.csdnimg.cn/blog_migrate/88ceb8c8bf5293cd3a26a3985a001723.png)
注意到我们现在所在的分支是正在解决bug的分支bugFix,我们现在想把目前修复的bug的所有代码合并到主干master分支里面。
我们如果使用
git rebase master
![5af3883122bfe8a5ab94cfd7d5ba5916.png](https://i-blog.csdnimg.cn/blog_migrate/5f00eaa1722b9d6223b0cb30c7572b25.png)
注意到我们目前还是在bugFix分支上,我们需要checkout 到master主干分支上
git checkout master
![de173d0466d14ec1c587a8d134f94dc1.png](https://i-blog.csdnimg.cn/blog_migrate/5d7844fbc1d6bade9aa75ba22d12214f.png)
这个时候我们就可以使用rebase了
git rebase bugFix
![f5dd140204bc8f0810661e4cdd9d1652.png](https://i-blog.csdnimg.cn/blog_migrate/bb997b5e5fb47a3f366724903d55d431.png)
这样我们如果从C3‘往上溯源,有
C3'——>C2——>C1——>C0
这样思路就非常清晰,查看git 历史的时候也可以以线形的思维来整理思路,比较不容易晕掉。
OK,那我们继续看一下更加复杂的git知识点——
8.check out 与 HEAD
我们再来看一个新概念HEAD,HEAD意味着是头部,目前可以简单理解成我们正处于的开发的最新的版本内容。也就是说如果我目前正在C2,如果输入
git checkout C2
有
![75e2ba523a90d946109cb61e71251679.png](https://i-blog.csdnimg.cn/blog_migrate/8f5c0eaef8e6ffc063564d4b2969f8d4.png)
我们把这个问题化简,假设我们只有一个commit
![68538cd41314d1294e9ddfe7bf96a6ab.png](https://i-blog.csdnimg.cn/blog_migrate/33968ac8a9022383eea9ec21bbf9570c.png)
目前的逻辑关系是
HEAD -> master -> C1
但是我们可以Detaching我们的HEAD
我们输入
git checkout C1
有
![ace4adced99ebab3b0232677ff567cd0.png](https://i-blog.csdnimg.cn/blog_migrate/2f8c7135df65a125e472f83ee4795843.png)
也就是逻辑关系变成了
HEAD -> C1
9.通过相对位置^在git树状结构中移动
那么我们既然能够理解HEAD这个概念,我们现在就可以在整个git树状结构中进行任意移动,并且可以任意改变HEAD的位置了。
一种比较好的移动方式就是通过相对位置进行移动。比如我们假设遇到一个这样的问题:
![153b93499d5683ae902b64e156e1e85b.png](https://i-blog.csdnimg.cn/blog_migrate/d2c4cccef8faec8d0e6c69aeec17092f.png)
我们想向上移动,可以使用^
我们输入
git checkout master^
这样我们的HEAD就跳到了上一层级
![26f3adb4f05bbf9d6d7b67831bb60065.png](https://i-blog.csdnimg.cn/blog_migrate/325f24a6eca12020347e1fc97117a8b2.png)
那么我们如果要实现多层级跳转怎么办?
比如我们需要直接跳转到C0
![7a3bec339d7eb19725d91b32f84a85e3.png](https://i-blog.csdnimg.cn/blog_migrate/e67a34f8a23e4539aef8feafda6a5b1f.png)
我们可以连续输入
git checkout C3
git checkout HEAD^
git checkout HEAD^
git checkout HEAD^
这样就跳转到了最上面的C0
![e67ff486eaa5bbc00bde1afc08e7147a.png](https://i-blog.csdnimg.cn/blog_migrate/cccdd13be17d0f46aab571894e0c83ac.png)
10.实际操作中用的较多的强制跳转git branch -f
我们在实际操作过程中可以直接使用git branch -f进行强制跳转,比如
![ad049af2f1b7710d387f36bcd1604f55.png](https://i-blog.csdnimg.cn/blog_migrate/af355b9599450c8d666e458ef1c2e98c.png)
我们假设想向上跳转三个到C1,可以输入
git branch -f master HEAD~3
![126dad8b312a86c5d3c56b271062aa19.png](https://i-blog.csdnimg.cn/blog_migrate/cf9fbef98c168d4af50316032a0dd5ba.png)
这样我们就可以将master强制向上移动三个层级到C1了。
11.git reset重写历史
如果我们能够自由的选择git中的各个版本,我们就可以任意选择一个版本开始“重写历史”了,谁说没有“后悔药”,git在手,我们可以回滚到任意版本。
比如说我们假设处于这样一个场景,但是想回滚上一个版本:
![b2b0d4bb523bfe400980b94e26e6b4cf.png](https://i-blog.csdnimg.cn/blog_migrate/e47889faefab17479b3cf41afbad2367.png)
可以输入:
git reset HEAD~1
![e5237caddde3a6feb6a0ec5140e98904.png](https://i-blog.csdnimg.cn/blog_migrate/6e55c73f8071a4697d0ecaa7e995cfd0.png)
12.如果涉及到远程仓库,使用git revert
虽然git reset非常好用,但是这个命令仅仅在本地的仓库才有效。很多时候我们是在github上有远程仓库,这个时候我们就需要用到git revert命令:
![92a06951cca52fac172f4302e4cf1403.png](https://i-blog.csdnimg.cn/blog_migrate/5f483a78319bd34911c75395105a0d43.png)
因为涉及到远程仓库,我们不仅仅是需要revert改变,还需要将改变分享给其他用户,所以我们使用命令:
git revert HEAD
有
![d2b053228a6058bac4f4db4a0dfe7a53.png](https://i-blog.csdnimg.cn/blog_migrate/fb4a65212815a55bd84176011a925353.png)
我们把这个用法通过一个实际的例子来理解:
![4ab6df83ae592e768a620e32a80bfedc.png](https://i-blog.csdnimg.cn/blog_migrate/0989098adacc83e0c3dc5d264b2d81c7.png)
假设现在咱们想回滚一个版本,并且push到远程仓库
我们可以先输入:
git reset local~1
![a14701c8feec86e9726f1611d3f6f8d6.png](https://i-blog.csdnimg.cn/blog_migrate/f70bcafd18f0fd86201bdbc54c235daf.jpeg)
接着我们进行pushed远程仓库的操作
git checkout pushed
我们可以将远程的版本也进行回滚
git revert pushed
![9466386ae442d9524ed3896ad8477f30.png](https://i-blog.csdnimg.cn/blog_migrate/4805d67aad582a7627fa664ba87639c8.png)
这样我们就掌握了日常使用的80-90%的git相关的操作与原理。在接下来的推送中,我们会继续跟大家分享更加进阶的git操作~
首发
乐学偶得 公众号: 乐学Fintech
用代码理解分析解决金融问题
![8d0600a7067e365a25bf9325826af2d1.png](https://i-blog.csdnimg.cn/blog_migrate/f9c986503f5f54ff9ef35bb37a3fb481.jpeg)