过来人告诉你,去工作前最好还是学学Git
前言
只有光头才能变强。
文本已收录至我的GitHub精选文章,欢迎Star:https://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快捷键。
我commit和push的时候就喜欢用快捷键。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 -- filenamefilename作为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 --hard  把reset 之后的 commit都给抹杀掉了。找到最近的执行Git命令:git reflog
还原到某个版本了,现在我为了稳健,不想再原来的分支上修改了,再新建一个分支吧(-b 参数把当前分支切换到了要创建的分支上):git checkout -b 分支名
我们把上一次还是”相对稳健“的分支合并到我新建的分支上:git merge 分支
突然想看看现在有多少个分支:git branch -a
新增几个文件了,随手git add一下吧
改得差不多了,随手git commit -m 一下吧,最好还是写好备注,不然以后等改多了,你都不知道你改了什么啦。
改完了,提交到远程吧:git push 
想把远程分支最新的代码给拉下来,然后合并到本地上。我们可以用git fetch和git merge 来实现,也可以通过git pull来实现。一般我用的都是git fetch+git merge ,这样会更加可控一些
有的时候,本地分支在master分支,然后忘了切其他的分支去修改,直接在master改了,然后也push到远程了。等你发现的时候,你会真的想骂自己。
咋办?最简单的办法其实我们还是可以git reset --hard到对应的版本,然后将其修改或者复原,再强制提交到master分支:git push -u origin/master -f

三歪瞎扯
在这篇文章中,我列出的Git常用的命令其实并不多吧。
像很多博客讲的diff、tag、config之类的命令我都没有讲,我这边现实开发时这些命令也没怎么用过...
如果觉得我说漏的,可以在评论区补充,一起学习。
其实现在IDEA也很强大,很多时候都可以配合IDEA给我们提供的Git去做很多事。有的场景敲命令会比较方便,有的时候就直接图形化界面就比较方便。
就diff 这个功能而言, 肯定还是图形界面好用一些吧(至少我是这样认为的
IDEA配合一些快捷键,使用Git也能爽得飞起。Git始终也只是一个工具,如果你有兴趣可以了解它的实现(我觉得大部分人可能不知道它是怎么实现的);
如果没兴趣看它的实现,了解它是怎么使用的,也足够应付日常的开发场景了。
总的来说,现在的互联网公司大多数还是用Git的,Git本身使用上其实不难,只要理解了Git是干嘛的,它有个本地仓库的概念,它可以来回穿梭各种版本,然后将本地的信息提交到远程,跟着教程把常用的命令敲敲也差不多了。
如果实在是不懂,也别慌(我都给你们打了个样了);主动认怂,虚心求教,同事们都不会嫌弃你的。
如果实习之前不知道要准备什么去公司,要是对Git不了解,我觉得Git可以有占一席之位。
更多Git命令和参考资料:
- https://github.com/xjh22222228/git-manual
 - https://juejin.im/post/5edcf3a36fb9a047fa04fbc3
 - https://www.liaoxuefeng.com/wiki/896043488029600
 
各类知识点总结
下面的文章都有对应的原创精美PDF,在持续更新中,可以来找我催更~
- 92页的Mybatis
 - 129页的多线程
 - 141页的Servlet
 - 158页的JSP
 - 76页的集合
 - 64页的JDBC
 - 105页的数据结构和算法
 - 142页的Spring
 - 58页的过滤器和监听器
 - 30页的HTTP
 - 42页的SpringMVC
 - Hibernate
 - AJAX
 - Redis
 - ......
 
涵盖Java后端所有知识点的开源项目(已有8K+ star):
我是三歪,一个想要变强的男人,感谢大家的点赞收藏和转发,下期见。给三歪点个赞,对三歪真的非常重要!
过来人告诉你,去工作前最好还是学学Git的更多相关文章
- 周鸿祎——不要抱着打工心态去工作,而是把工作当创业(附读书笔记) good
		
360周鸿祎反而最为开明,他说“不要抱着打工心态去工作,而是把工作当创业”,就像是,鼓励你拿着公司的工资,锻炼自己的能力,为自己以后创业积累资源和人脉(读书笔记:真是天底下最好的机会,天底下没有比工作 ...
 - .NET入行之工作前
		
时间就像轻风一样,刻意感受的时候几乎把你吹倒,不留意的时候又从你身边轻轻飘走了:长此以后,我怕自己会变得麻木,忘记了原来的样子.所以还是决定给自己留点什么,万一哪天忘记了,还可以再翻起来. 工作两年的 ...
 - erlang工作前新手学习指引路线
		
Erlang学习总结,新手指引 要具体的写erlang入门技术网上有非常多,我写的肯定没有那些大牛写的好,自己也实习了快一个月,也做一个总结,给后erlang初学兴趣者提供些拙见吧 第一步搭建学习环境 ...
 - 60道Python面试题&答案精选!找工作前必看
		
需要Word/ PDF版本的同学可以在实验楼微信公众号回复关键词"面试题"获取. 1. Python 的特点和优点是什么? 答案:略. 2. 什么是lambda函数?它有什么好处? ...
 - 刚开始学java和刚去工作的时候,1.path路径 2.classpath路径   还有JAVA_HOME相当于/dgs这个路径
		
把里面bin文件夹下面的可执行文件都配置到path路径下了,以后只要在Dos窗口输入命令就可以运行 无论是在dos窗口下还是在eclispe中只需要配置这个path变量,不需要配置classpath ...
 - 工作中的 Vim 和 git
		
————————Vim———————— 1. gf 可以转到文件中指明路径的文件. 这样可以实现文件的快速切换. ctrl+o: A -> B, 返回A ctrl+6: A.B之间快速切换 2 ...
 - [Environment Build] 工作中遇到的关于Git的问题
		
修改已经提交的commit中的author, commit git commit --amend --author 'Your Name <Your Email>' git commit ...
 - [No00004E]千万不要“拼命”工作——写在滴滴总裁柳青患癌症之后
		
滴滴快的总裁柳青发内部信,透露自己检查出乳腺癌,她今年才37岁. 9月30日,就是国庆前一天,柳青发了内部信,透露了这个消息,她也说已经做完肿瘤摘除手术,"目前感觉还挺好的".她也 ...
 - ASP.NET页面与IIS底层交互和工作原理详解
		
转载自:http://www.cnblogs.com/lidabo/archive/2012/03/13/2393200.html 第一回: 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是 ...
 
随机推荐
- 基于 abp vNext 和 .NET Core 开发博客项目 - 集成Hangfire实现定时任务处理
			
上一篇文章(https://www.cnblogs.com/meowv/p/12956696.html)成功使用了Redis缓存数据,大大提高博客的响应性能. 接下来,将完成一个任务调度中心,关于定时 ...
 - 像宝石一样的Java原子类
			
十五年前,多处理器系统是高度专业化的系统,通常耗资数十万美元(其中大多数具有两到四个处理器). 如今,多处理器系统既便宜又丰富,几乎主流的微处理器都内置了对多处理器的支持,很多能够支持数十或数百个处理 ...
 - 重磅!阿里P8费心整理Netty实战+指南+项目白皮书PDF,总计1.08G
			
前言 Netty是一款用于快速开发高性能的网络应用程序的Java框架.它封装了网络编程的复杂性,使网络编程和Web技术的最新进展能够被比以往更广泛的开发人员接触到. Netty不只是一个接口和类的集合 ...
 - Linux学习(二):makefile
			
编译命令: gcc -o exefile src.c (将src.c编译,链接为exefile可执行文件) gcc -o obj.o -c src.c (将src.c编译为obj.o目标文件) mak ...
 - 【MOOC操作系统】测试题大题-进程调度 先入先服务算法例题 【某多道程序系统供用户使用的主存为100K,磁带机2台,打印机1台,采用可变分区存储管理,静态方式分配外围设备(进程获得所需全部设备才能进入内容),忽略用户作业的I/O时间。采用动态分区、首次匹配法(从低地址区开始)分配主存,一个作业创建一个进程,且运行中不紧缩内存。作业调度采用FCFS算法,在主存中的进程采用剩余时间最短调度算法。】
			
分析图: 答案: (1) 8 : 00作业1到达,占有资源并调入主存运行. 8: 20作业2和3同时到达,但作业2因分不到打印机,只能在后备队列等待.作业3资源满足,可进主存运行,并与作业1平分CPU ...
 - rpm解决Jenkins安装报错
			
安装Jenkins出现的问题rpm安装新建路径存放地址mkdir /home/jenkins 下载地址https://pkg.jenkins.io/redhat-stable/jenkins-2.20 ...
 - mybatis精讲(七)--动态sql
			
目录 常用标签 if元素 choose元素 trim元素 forearch bind元素 在我们传统的开发中我们会通过拼接sql达到数据库的操作.java中的拼接不仅效率低下而且代码很长不易维护.而M ...
 - Java 第十一届 蓝桥杯 省模拟赛 凯撒密码加密
			
凯撒密码加密 题目 问题描述 给定一个单词,请使用凯撒密码将这个单词加密. 凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文.即a变为d,b变为e,-,w变为z,x ...
 - (Java实现) 整数区间
			
一.题目描述 给n个区间,形式为[a, b],a和b均为整数,且a < b. 求一个最小的整数点的集合,使得每个区间至少2个不同的元素(整数点)属于这个集合. 求这个集合的元素个数. 输入 第1 ...
 - Java实现 LeetCode 704 二分查找(二分法)
			
704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1 ...