活跃农民
- 积分
- 398
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-10-7
- 最后登录
- 1970-1-1
|
注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
.1point3acres
大家好,本人两年前自学转码工作后才开始正式接触Git,觉得这是一个非常重要的却容易被忽略的工具,总结了一些新手容易困惑的概念和误区,以及自己工作中95%常用的命令,比方比较贴近生活,通俗易懂,欢迎对Git感到迷茫或不熟的同学看看。
如果觉得分享得还不错,也欢迎去我的个人微信公众号“一只大果果”查看原文,并转发给需要的朋友,先谢谢了哈哈。下面马上开始~
. 1point3acres
. 1point 3acres
1. 开始之前-baidu 1point3acres
Git是当今最广为使用的分布式版本控制系统,于Linus Torvalds 2005年创建。什么是版本控制(version control),简单来说就是支持自由切换版本、多人协作等一系列软件工程实用操作的一套工具。好比游戏存档,错了能及时回去,想尝试新玩法不必从头再来。总之,将来想写好代码,想在不同项目间游刃有余,那么Git没商量,必学且趁早,否则代码复杂了你都不敢大改,一改就炸,而且回不去。人会越来越怕,屎山越堆越大,水平也就那样了。当然不仅限于代码,如有其他类型的文件比如文档、设计稿、制图、游戏存档频繁版本变更需求也都可以使用Git进行通用的高效版本控制。
.
为什么这么好用的东西学校里大部分专业不要求呢,主要是Git的门槛,工具支持的功能越多上手也会越复杂,一个人如果不会就没法用,会的人多也不需要我写。看完本文如果觉得Git还怪通俗易懂的请不要误会,多半是我写的好,还请帮忙转发支持哈哈~. 1point3acres.com
. Χ
和GitHub的关系 GitHub/Bitbucket/GitLab是在线代码托管平台,类似百度、阿里网盘,是商业公司,提供存储服务,整合了界面可视化工具等许多功能,用户可以上传下载代码;但版本控制用的核心仍然是安装在本地的Git开源软件。你安装的应该是Git,而不是像读研时的我一样装傻瓜式的GitHub Desktop。
命令行 初学者一定老老实实敲命令实现Git操作,不要想着走捷径用图形界面。其一,编写图形界面费时费力,支持的几个功能充其量是阉割版的Git,关系像计算机和计算器。其二,依赖图形界面会严重影响学习效果,基本命令都不熟没法学习高级的,属于自断前程。其三,一换环境就麻爪,一没界面就废,而生产环境用Linux只有命令行。
. ----
2. 基本概念 ..
分支(Branch)
. Χ
Git允许你任意创建互不干扰的平行分支,可以在不同分支上解决不同的问题,或用不同的方法解决同一问题,分支之间可以相互合并(merge),分头行动再会合的模式提供了极高的自由度,这使得多人协作非常方便。
Git项目初始化时会有一条默认的主分支(master),实际生产中,每个问题一般都会从主分支切出(checkout)新分支 → 解决问题 → 汇入(merge)主分支,打上tag生成新的版本,再投入生产环境;如果贸然直接在主分支上测试并提交,那么有问题的代码会波及到所有人的后续工作。
git-branches-merge.png
Source: https://www.nobledesktop.com/learn/git/git-branches
. 1point3acres.com
提交(Commit)
. .и
每个分支都由一连串节点组成。在单一分支上,一个节点称作一次commit,可以理解为你手动选择存档的时刻。Commit不是越多越好,太频繁你以后不知道该回哪个点,太少的话出问题了没存档也是GG,而且直接一口气太多代码也不方便别人review。. 1point3acres.com
个人习惯是在关键点上提交,没啥问题几百行提交一次,函数tricky可能几行代码就提交一次。也不必担心过多的commit,后面我们会谈到用命令把几个节点squash到一个,这样就可以既保证不会错过关键点,又不造成干扰。把握commit的尺度是一个熟练度的问题,提交多了自然就知道哪些点合适,开始上手时不妨提交得频繁些。. Waral dи,
.. Commit命令与流程 回到开篇提到的分布式,Git的组成一部分在本地(local),一部分在远端(remote)。Pull和push的本质都是本地和远程repository(repo,代码仓库)的同步,方向不同:git pull 将最新的代码拽到本地, git push 将本地的更新怼到远端。 ..
进行commit时,git add 将文件中的修改提交到staging area(暂存区),git reset 将文件从暂存区撤下。git commit 将暂存区代码提交到本地仓库;提交后,git log 可查看日志。
暂存区的引入允许灵活选择若干文件,并将它们的变更在一个commit中提交。加入到暂存区的文件状态为staged。Tracked包括committed 和staged,其他的文件则为untracked,这是在git status命令中会显示的文件状态。
Git Diagram copy.png
Source: https://support.nesi.org.nz/hc/e...Git-Reference-Sheet
. From 1point 3acres bbs其实微信发朋友圈又何尝不是人生中的一次次commit呢?选择添加照片就好比git add/reset,文字就是message,等到编辑完毕后,点击发送就相当于git commit + git push,下拉刷朋友圈相当于git pull。只不过人生只有单一的master branch,没有平行世界,没有reset,如果有,我肯定回到本科把git和CS学了(狗头)
3. 上手实战
. Waral dи,
所有的工具都是用会的,我们马上开始实战。这里我们略去安装Git和注册配置Github环节,学东西自己的动手能力还是必要的。我的平台选择的是Bitbucket,Github主要托管开源代码,Bitbucket的主要是企业私有代码,二者大同小异。. 1point3acres.com
3.1 初始化
-baidu 1point3acres
如果代码文件夹在本地, 可以通过 git init 初始化,运行后Git会在目录下自动创建.git隐藏文件夹用于储存你的git信息,这时git已可以在本地运行,但由于尚未设置remote无法同步。托管平台中新建repo,通过 git remote add origin <url> 设置远端,此后需要时便可以同步。
如果代码已经在Github你的repo中,运行git clone命令将repo复制到本地。和Remote同步时按提示输入用户名密码登录,如不想每次重复输入,可以启用git config --global credential.helper cache 来缓存或设置SSH登录,我采用的是SSH,具体可以搜索对应平台设置方法。
```
mkdir git_test
cd git_test
git init . # Initialized empty Git repository
git remote add origin git@bitbucket.org:pguoguo/git_test.git
```
. Waral dи,
如果git默认编辑器是vim且不熟悉vim,可以通过git config --global core.editor "nano"将默认编辑器设为nano,对于新手来讲虽然这俩卧龙凤雏,但nano好歹多个命令提示,好上手一些。
3.2 分支命令和stash.1point3acres
. 1point 3acres
上面步骤完成后输入git branch查看当前所在分支,默认为master分支。git checkout -b <branch>新建并切换到分支,git checkout <branch>在不同分支间左右横跳。git branch -D <branch>删除分支。
有时我们写码心切,经常写着写着才发现在错的分支上,试图切换分支会报错。这时我们需要通过git stash将已有的更改暂时全部收起来,切换到新分支后运行git stash pop再把收起来的东西释放出来。
. check 1point3acres for more.
.google и
在合并分支时,我们通常不在本地进行,git push到remote后会生成链接问你想merge到哪个分支,在你选择后你想汇入的分支(一般是master)后就会形成一个pull request (PR),通过可视化界面你可以清楚看到代码哪些地方做了变更,代码的负责人会负责审查(peer review),提出修改意见,通过后按按钮merge。如果非想在本地比较两个分支,可以用git diff查看;而本地合并的git merge我基本不用。. 1point3acres.com
```. .и
echo hello > README.md
git add .
git commit -m "init repo".
git checkout -b TEST-01-learn-branch
git branch
git checkout -b TEST-01-learn-branch-2. 1point 3acres
echo hi >> README.md # modify tracked files
git stash
git checkout TEST-01-learn-branch
git stash pop
```
. check 1point3acres for more.
3.3 commit流程
. From 1point 3acres bbs
切换到新分支后,照常写代码,到关键点时,一般git add .将当前目录下所有文件加入暂存区,git commit -m <message>提交commit。填message时尽量写清楚这个commit做了哪些事情,方便所有人将来知道每步都干了什么。这样commit后,该分支串上就又多了一个节点。git log 查看日志,git status查看暂存区,git reset <file>将文件从暂存区移除。 ..
有时我们本着简约的原则,想提交新内容却不想新增节点,在add之后可以通过 git commit --amend 将内容补充增订到最后的commit中,该过程还会允许你修改commit message。对于amend后的节点其信息会发生变更,如果变更前的branch已经被push到remote,则需要git push -f 强制推上去。当然如果其他人和你在同一branch上工作我们要尽量避免-f,因为会造成冲突。. From 1point 3acres bbs
关于squash,如果不是仅仅想修改最后一个节点,而是想回到之前的任意一个节点,将后面所有的commit压缩成一个commit,解决方案是:- 首先通过git log锁定你想到的节点的哈希值
- git reset <commit_sha>,这时再git log你会发现后面所有的commit历史都没了,但工作目录中修改过的内容没有变
- 像之前一样add 然后 commit。
值得一提的是,如果reset后没有新增变动,因为内容不变所以不会取消peer review中的approval,所以适用于merge前的squash让节点更简洁。
-baidu 1point3acres
```
# write something to file1, file2
git add file1 file2
git status. Waral dи,
git reset file2. 1point3acres
git commit -m "TEST-01: learn commit"
git log
# write something. Waral dи,
git add .. 1point 3acres
git commit --amend
git push . ----
# 如果忘记设置remote,会自动提示 fatal: No configured push destination.#.--
git remote add <name> <url>
# 如果remote没有该branch,会自动提示以下. From 1point 3acres bbs
git push --set-upstream origin TEST-01-learn-branch
```3.4 rebase
. Waral dи,. Waral dи,
git在分支时都会基于分支上的最新节点,假设你分支时master上有两个节点 A-B, 在你的分支上你的工作在新的节点D,这时你的分支为 A-B-D;而就在你工作期间同事在master上merge了新的节点C,主支变为A-B-C,这时你想merge回主支,git发现两个分支存在分歧便会拒绝。解决方案将你的分支rebase到更新后的master,重新设定基准,让你的分支变为A-B-C-D,这样git就会明白你的工作是在原来的基础上新增了D节点。
-baidu 1point3acres
我们通常 git checkout master -> git pull -> git checkout your_branch -> git rebase master,这样一通操作后再看git log你就会发现原本主支的新节点平移到你的branch上。偶尔会有自动解决不了的conflict,留下你想要的部分并删除分割线和多余的部分,按照git的提示一步步做即可。
Rebase.png
.1point3acres
Source: [url=https://www.blog.duomly.com/git-rebase-tutorial-and-comparison-with-git-merge/3.5]https://www.blog.duomly.com/git-...erge/[b]3.5[/url] 其他常用命令
. ----
revert
. .и
有时某一个commit造成了问题,我们想剔除它或者rollback,这时需要用到git revert <commit_sha>命令。我们依然需要通过git log锁定commit的hash。revert后git log查看。如果以后发现这个commit没问题,我们可以再重新revert那个revert commit,这样内容就又回来了,是不是很好玩呢。. 1point3acres
tag
. Waral dи,
当我们准备release代码时,这样的关键点会用tag标注。平常我们见到的版本号比如微信7.9.1,8.0.0都是tag。一般tag可以在托管平台进行,在查验无误测试通过后且会合CI/CD整合,打上标签后流水线自动build新的软件包用于生产。如需删除标签,可以git tag -d <tag> 删除本地,然后 git push origin -d <tag> 删除远端。
reset.google и
.
. ----
git reset <commit_sha> --<mode> 设置reset模式,默认--mixed模式,不会动当前工作目录的更改,但会动暂存区;如果不想更改暂存区可用--soft模式;如果代码陷入混乱,想强制丢掉工作目录中的更改,使之与commit完全一毛一样,可用--hard模式。
如果代码reset到之前的节点后又想撤回到后面的节点,通过git reflog调用reference log,找到对应的commit hash,git reset <commit_hash> --hard 回来。至此你已掌握了在一条分支上随意穿梭游走的本领。
``` ..
git reset af4a039877d92f0f1502ff58df506dafcd5dbe76
git log # TEST-01: init repo
git reflog
git reset 09ff118 --hard # HEAD is now at 09ff118 TEST-01: file1 and file2
```.gitignore文件. Waral dи,
. .и
. .и
.gitignore文件可以忽略目录下特定类型的文件,避免Git track不需要的大文件,浪费本地和远端存储空间,以下是先拉黑全部再一一允许的白名单模式举例。! 表示不忽略某个或某类文件,不加则表示忽略(默认为黑名单模式)。.google и
```
# Ignore everything
*.
# Except .gitignore
.--!.gitignore. 1point 3 acres
# Except python.--
!*.py
. Waral dи,```
其他命令
以上提到的可能不到Git所有命令加选项的5%,理解加熟练使用却可能cover日常95%的case,剩下的5%在你掌握前面的基础上,也能很轻松自己找到答案。
4 后记. .и
国内传统的本科教育和实际应用中往往存在脱节,就像外面电钻已经普及而学校还在只教手动拧螺丝,基础知识固然重要,但论生产效率、产出质量,没有和时代接轨的工具肯定会在以后的竞争中处于劣势地位。年轻人学习不能只想着作业绩点,还要有未来意识和大格局。
Git对于初学者几大困扰点一是平时低强度的代码难justify其worthness,二是晦涩的概念和繁多的命令会让人产生畏难情绪,至少我当时是那样的,三是难找靠谱的教程,比如有的一上来就罗列命令,还有的底层实现挖的云里雾里,这些都不适用于初学者。
.1point3acres
所以在我的分享中一上来就开宗明义,什么人必学,为什么必须用命令行,砍掉多余的干扰,想走弯路都没有;对于难懂的概念联系生活类比,使它们更易于被理解,对于常用命令的讲解结合自身使用场景进行归类,原理和实际结合,覆盖全面,详略得当,既有提示又读者留出操作空间,是一篇不可多得的Git入门佳作(狗头)。
在我之前的自学过程中总是为找到靠谱的资源而烦恼,现在工作两年可以说代码刚入一点门儿,已经能从各式各样的资源中找到自己需要的信息,不再依赖于某一位风趣的老师,某一篇精美的文档,也在尝试由一名接收者到输出者的转变,简单来说就是我不要你觉得,我要我觉得,以统一视角和标准去看待问题,思考问题,阐释问题。真理和代码是客观的,个人理解总是夹带主观的,会错会偏颇,都是再正常不过的事情,如有纰漏还请不吝指正,也非常期待和各位朋友在评论区交流。. Χ
. ----. .и
|
上一篇: EE转码求建议求交流下一篇: 大四毕设走什么方向
|