10

过来人告诉你,去工作前最好还是学学Git

 3 years ago
source link: https://zhuanlan.zhihu.com/p/149169595
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

过来人告诉你,去工作前最好还是学学Git

公众号:Java3y

只有光头才能变强。
文本已收录至我的GitHub精选文章,欢迎Starhttps://github.com/ZhongFuCheng3y/3y

之前遇到过很多同学私信问我:「三歪,我马上要实习了,我要在实习前学些什么做准备啊?」

三歪在实习之前也同样问过自己当时的部门老大。

如果再给我一次机会,我会先去花点时间去学学Git

Git我相信大家对它应该不陌生吧?但凡用过GitHub的同学应该多多少少都会了解一下Git

不知道当时大家学Git的时候是看哪个教程的,我看的是廖雪峰老师的Git系列的。

(别看到廖雪峰就以为是广告了啊,哈哈哈哈,这篇纯原创分享)

分享一下三歪的经历

刚实习的时候,一直都忙着看各种东西。有一天,我学长说:我看你也学了一些基础了,我们来看看公司的代码吧,看看我们生产环境是怎么做的。

于是我学长丢了一个Git链接给三歪

https://github.com/ZhongFuCheng3y/3y.git

那三歪做了什么?三歪去IDEA下把这个Git给Clone下来:

我用Clone完了以后,我学长又补了一句:这个项目不是用master分支的哦,你切换一下分支

三歪:啥?切换分支?咋整?我忘了。

我学长看了下我,貌似不咋会切换分支,就说:“我来吧”。

于是在命令行终端一顿操作后,对三歪说:“好了”

三歪:“我对Git不是很熟悉,之前一直都是在IDEA上操作的。你们一般用命令行多还是图形界面的多呀?”

我学长:“这没什么,反正工具这东西,学学就行,不是什么大问题。也没必要说很仔细去学它,就工具嘛”

三歪:“嗯”

时间飞逝,又过了一段时间...

三歪被分配了一个需求,于是就需要新建分支去做这个需求了。所有的标准应用线上走的是master分支,公司通过一个发布系统来控制发布版本、以及整套上下线的流程。

于是我要先在发布系统里边新建Git分支:

完了以后,我就在IDEA界面上选择那个被我新建完的分支

但发现我死活找不到...于是我就问我学长:我在发布系统里边新建了分支,为什么在IDEA上找不到啊?

学长:“怎么会呢,我看看”。

找了一会,他问我:“你fetch 过了吗?”

三歪:“啥?”

于是他拿着我的电脑,打开了终端,又以是命令行的方式敲了一顿,问我:“这是不是你新建的分支?“

三歪点了点头,于是我学长说:”好了,你再看看“。

后来发现,新建完远程分支,如果在IDEA上要能感知到,可以在pull界面上刷新一下,那就能找到了。

也不是说命令行一定会就比界面牛逼,其实IDEA的Git功能也做得挺好的。现在我都是混合使用,一些操作用命令行,一些操作用IDEA快捷键。

commitpush的时候就喜欢用快捷键。command+k和command +shift+k我就感觉比敲命令要快不少。

这些都是个人习惯的问题,也无对错之分,怎么方便怎么来。

其实也不是所有的系统都会走发布系统的(有标准应用,非标准应用)。如果要自己写一个启动的脚本,一般我们会做些什么?无非就是用Git拉最新的代码,然后用maven打个包,然后启动。

理解Git

如果你看过上一篇《三歪给女朋友讲解什么是Git》应该能大概了解什么是Git了。

其实我觉得学Git主要理解工作区 -> 暂存区->仓库 这几个概念。

我们使用Git其实绝大部分的操作都是在本地上完成的,比如说add 和commit

只有我们push的时候,才会把本地完成好的内容推到远程仓库

通过上一篇文章我们知道在每个人的本地都有完整的历史版本,所以我们可以在本地就能穿梭到不同的版本,然后将修改之后的代码再重新提交到远程仓库上。

所谓的工作区实际上就是我们真正的的本地目录

我们在本地添加文件后,需要add到暂存区,文件一旦被add到了暂存区,意味着Git能追踪到这个文件。

当我们修改到一定程度之后,我们会执行一次提交commit,在提交的时候我们会”备注“自己这次的提交修改了什么内容。

一次commit在Git就是一个版本,Git是版本控制的软件,我们可以随意穿梭到任何的版本中,修改代码。

暂存区是这么一个概念呢?

暂存区就像购物车,没到付款的时候你都不确定购物车里的东西全部都是要的。每拿一件商品就付一次款,那麻烦可大了。

从宏观上看,Git其实有本地和远程的概念,只是本地又分了工作区、暂存区、本地仓库。再次强调:我们操作几乎都是在本地完成,每个人的本地都会有所有历史版本信息

我们一般会新建分支去支持每一次的修改。

其实分支这个概念也挺好理解的:我们需要并行开发,同时我们又不关心对方改的是什么内容,改的是什么文件。因此我们需要在自己的专属环境下去修改内容,只要把最终修改完后的内容合并到一个主分支就OK了。

假设三歪做完了,经过校验通过后,把自己的代码merge(合并)到origin/master分支后,然后就发布上线啦。

随后,鸡蛋也做完了,自己的分支校验完了以后,他此时也想把自己的代码合并到origin/master。不料,他改的代码跟三歪改的代码有冲突了(Git不知道选择谁的的代码),那鸡蛋只能手动merge了。

综合来看,我们使用Git大多数的场景就是各自分支开发,然后各自在本地commit(提交),最后汇总到master分支。

所以,我们学Git大多数就学怎么实现分支的增删改、切换以及版本的穿梭

学习Git的小tips:
Unix/Linux 命令中,- 后一般跟短命令选项(通常是单字母,也有一些命令是例外的),-- 后一般跟长命令选项。如果只有一个单独的--,后面不紧跟任何选项,则表示命令选项结束,后续的都作为命令的参数而不是选项。
例如:git checkout -- filename filename作为git checkout 的参数,而不是选项。

日常Git使用场景

、如果这个项目的代码我们在本地还没有,我们先去GitLab里边找对应的Git地址,然后Clone到本地:

git clone https://github.com/ZhongFuCheng3y/3y.git

、接到了新的需求,我们要新建一个分支,然后基于这个分支去开发:

git checkout -b feature/sanwaiAddLog

在开发的时候,我们肯定会有两个操作:

  • 在原来的基础上添加新的文件
  • 在原有的文件上修改

、不管怎么样,等我们做到一定程度了,我们都会提交代码。如果我们添加了新的文件,我们需要先add,然后再commit

git add .
git commit  -m "try to commit files to GitHub, i am java3y"

、假设我们一切顺利,在没人打扰的情况下已经写好了代码了,然后我们会把自己的分支push到远程仓库

git push

、假设我们写到一半,其他小伙伴已经把他的代码merge到主分支了,我们也需要把他最新的 代码给pull拉取下来(可以 git fetch + git merge 替代)。

git pull

如果没有冲突,那git就会把他的代码给merge到我当前的分支上。如果有冲突,Git会提醒我去手动解决一下冲突。

、假设我们写到一半了,现在工作区的代码都已经commit了。此时同事说要不帮忙一起排查一个问题,同事一般用的是自己分支,于是就得问他:你用的哪个分支啊?于是得把他的分支给拉下来,看看他的代码哪儿有问题

git fecth -- 手动拉取远程仓库更新的信息
git checkout  分支名   -- 切换到他的分支

现在切换到他的分支,相当于你的环境跟他的环境是一模一样的,于是就可以愉快地一起看Bug了。

、假设我们写到一半了,现在工作区的代码还没commit。现在有同事说要排查问题或者一个新的Bug被发现了,要紧急切换到其他的分支。现在我又不想commit(我就写了一半,编译还报着错误,没理由让我commit吧)。

这时,我会把工作区的代码先stash到暂存区给保存起来,然后就可以愉快地切换其他的分支了。

git stash

等我解决完另一个bug或者帮别人看完问题了,我再把刚刚保存在暂存区的代码给捞出来,继续干活

git stash pop

、我一直在修Bug,现在的分支已经被我搞得人摸鬼样了,我非常难受,甚至不知道自己在这个过程中改了多少东西了。

思路已经完全被打乱了,我想回到一个稳定的commit重新出发,重来吧(通过下面的命令,把工作区的代码都改成对应commit的代码了)。

git reset --hard  版本号

那我怎么找到版本号呢?Git也是有日志的:

git log --pretty=oneline

常用的Git命令

查看Git工作区、暂存区的变更情况(可以知道哪些没有commit、哪些没有被Git追踪):git status

拉取远程最新的变更到本地:git fetch

切换分支:git checkout 分支名

将代码还原到某个版本(包括工作目录):git reset --hard 版本号

查看Git的提交(commit)记录:git log

将代码还原到某个版本后,后悔了,想重新回去,但在提交记录已经找不到了。git reset --hardreset 之后的 commit都给抹杀掉了。找到最近的执行Git命令:git reflog

还原到某个版本了,现在我为了稳健,不想再原来的分支上修改了,再新建一个分支吧(-b 参数把当前分支切换到了要创建的分支上):git checkout -b 分支名

我们把上一次还是”相对稳健“的分支合并到我新建的分支上:git merge 分支

突然想看看现在有多少个分支:git branch -a

新增几个文件了,随手git add一下吧

改得差不多了,随手git commit -m一下吧,最好还是写好备注,不然以后等改多了,你都不知道你改了什么啦。

改完了,提交到远程吧:git push

想把远程分支最新的代码给拉下来,然后合并到本地上。我们可以用git fetchgit merge来实现,也可以通过git pull来实现。一般我用的都是git fetch+git merge,这样会更加可控一些

有的时候,本地分支在master分支,然后忘了切其他的分支去修改,直接在master改了,然后也push到远程了。等你发现的时候,你会真的想骂自己。

咋办?最简单的办法其实我们还是可以git reset --hard到对应的版本,然后将其修改或者复原,再强制提交到master分支:git push -u origin/master -f

在这篇文章中,我列出的Git常用的命令其实并不多吧。

像很多博客讲的difftagconfig之类的命令我都没有讲,我这边现实开发时这些命令也没怎么用过...

如果觉得我说漏的,可以在评论区补充,一起学习。

其实现在IDEA也很强大,很多时候都可以配合IDEA给我们提供的Git去做很多事。有的场景敲命令会比较方便,有的时候就直接图形化界面就比较方便。

diff这个功能而言, 肯定还是图形界面好用一些吧(至少我是这样认为的

IDEA配合一些快捷键,使用Git也能爽得飞起。Git始终也只是一个工具,如果你有兴趣可以了解它的实现(我觉得大部分人可能不知道它是怎么实现的);

如果没兴趣看它的实现,了解它是怎么使用的,也足够应付日常的开发场景了。

总的来说,现在的互联网公司大多数还是用Git的,Git本身使用上其实不难,只要理解了Git是干嘛的,它有个本地仓库的概念,它可以来回穿梭各种版本,然后将本地的信息提交到远程,跟着教程把常用的命令敲敲也差不多了。

如果实在是不懂,也别慌(我都给你们打了个样了);主动认怂,虚心求教,同事们都不会嫌弃你的。

如果实习之前不知道要准备什么去公司,要是对Git不了解,我觉得Git可以有占一席之位。

更多Git命令和参考资料:

各类知识点总结

下面的文章都有对应的原创精美PDF,在持续更新中,可以来找我催更~

涵盖Java后端所有知识点的开源项目(已有8K+ star):

如果大家想要实时关注我更新的文章以及分享的干货的话,微信搜索Java3y

PDF文档的内容均为手打,有任何的不懂都可以直接来问我(公众号有我的联系方式)。



我是三歪,一个想要变强的男人,感谢大家的点赞收藏和转发,下期见。给三歪点个赞,对三歪真的非常重要!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK