<
查看: 2055| 回复: 3
收起左侧

[经验总结] 【开心果原创】Git新手入门教程

   
pistachioguoguo | 显示全部楼层
本楼:   👍  15
100%
0%
0   👎
全局:   103
100%
0%
0

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

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

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中提交。加入到暂存区的文件状态为stagedTracked包括committed staged,其他的文件则为untracked,这是在git status命令中会显示的文件状态。

Git Diagram copy.png

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

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入门佳作(狗头)。


在我之前的自学过程中总是为找到靠谱的资源而烦恼,现在工作两年可以说代码刚入一点门儿,已经能从各式各样的资源中找到自己需要的信息,不再依赖于某一位风趣的老师,某一篇精美的文档,也在尝试由一名接收者到输出者的转变,简单来说就是我不要你觉得,我要我觉得,以统一视角和标准去看待问题,思考问题,阐释问题。真理和代码是客观的,个人理解总是夹带主观的,会错会偏颇,都是再正常不过的事情,如有纰漏还请不吝指正,也非常期待和各位朋友在评论区交流。. Χ


. ----. .и

评分

参与人数 16大米 +29 收起 理由
chg420 + 1 赞一个
kylofive + 1 很有用的信息!
甜梨的酸橙儿 + 1 给你点个赞!
YKCN + 2 很有用的信息!
Oscarz + 1 给你点个赞!

查看全部评分


上一篇:EE转码求建议求交流
下一篇:大四毕设走什么方向
goldsail 2023-9-11 15:31:11 | 显示全部楼层
本楼:   👍  2
100%
0%
0   👎
全局:   922
95%
5%
44
补充1:要学好Git,首先要认同「代码定义万物」的理念,从而爱上「代码库的版本控制=记录历史」这一点。

补充2:初学者容易理解错的一点是,每一个Git commit记录的都是那一刻整个代码库的快照(snapshot),而不是记录改动的增量(diff)。正因为如此,一个commit可以有不止一个parent commit(当merge branch的时候),其相对每一个parent,都各自有一个diff。
回复

使用道具 举报

 楼主| pistachioguoguo 2023-9-11 12:15:35 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   103
100%
0%
0
诶我去,这编辑器说好的支持Markdown格式,编辑了半天,编辑器里一点问题没有,出来就这样了,真的无语hhh
回复

使用道具 举报

李不理 2023-9-11 19:52:07 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   124
98%
2%
2
挺有意思的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

Advertisement
>
快速回复 返回顶部 返回列表