乐趣区

过来人告诉你去工作前最好还是学学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 快捷键。

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 --hard reset 之后的 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 命令和参考资料:

  • 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):

  • GitHub
  • Gitee 访问更快

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

退出移动版