想象一下你正在玩超级马里奥, 你今晚的目标是通过所有关卡, 不然就不睡觉. 经过千辛万苦, 你拿到了最后一关, 就要看到成功的曙光的时候, 你竟然失手了! 你悲痛欲绝, 滴血的心在呼喊着, "为什么上天要这样折磨我? 为什么不让我存档?"
人生就像不能重玩的马里奥, 但软件工程领域却并非如此, 它有一套"版本控制系统", 能够让你在过去和未来中随意穿梭, 避免这样的悲剧降临你的身上.
没听说过版本控制系统就完成实验, 艰辛地排除万难, 就像游戏通关之后才知道原来游戏可以存档一样, 其实玩游戏的时候进行存档并不是什么丢人的事情.
Git
就是“神奇的版本控制系统”.
在项目开发过程中,代码会不断被修改、更新,许多码农通常将代码储存到一个(共有/私有)仓库,它为项目提供了一种结构化的方式来管理代码、历史记录和协作开发。而 Git 就是用于管理仓库的工具,它可以存储项目的所有代码文件以及每次的变更记录、在不同的时间点保存项目的多个版本,开发者可以在这些版本间自由切换、回溯,that's cool!
下面简单介绍如何使用 git
.
1.安装与设置
安装 Git 的命令如下:
$ sudo apt-get update //非必须
#安装git工具
$ sudo apt-get install git
安装完成后可以进行一些配置:
git config --global user.name "Zhang San" # your name
git config --global user.email "zhangsan@foo.com" # your email
git config --global core.editor vim # your favourite editor
git config --global color.ui true
上述四行用来配置 Git 提交的一些信息,其中 --global表示全局有效,若只想要对某个仓库有效,可以在某仓库的目录下进行设置,并去掉 --global,详细解释如下:
git config --global user.name "Zhang San"
指定你在 Git 提交中的用户名,它会被嵌入到每次提交记录中,表示这个提交是由谁创建的。
git config --global user.email "zhangsan@foo.com" # your email
指定你在 Git 提交中的用户邮箱,它会被嵌入到每次提交记录中,表示这个提交的用户邮箱。
git config --global core.editor vim
这个配置项用于指定 Git 在需要用户编辑信息时(如提交信息、合并冲突时)使用的默认文本编辑器。这里将 vim
设置为 Git 的默认文本编辑器。每当 Git 需要你输入文本(例如提交信息时),它会打开 vim
让你编辑。你也可以设置其他文本编辑器。
git config --global color.ui true
启用 Git 颜色显示。它使 Git 在输出状态、差异(diff)、日志等命令时,Git 会使用颜色对输出内容进行高亮显示,方便你更好地查看和理解输出的内容,如果你不想让 Git 显示颜色,可以将 color.ui
设置为 false。
2.基本操作
(1)克隆仓库
#克隆仓库
$ git clone <仓库URL>
<仓库URL>
:是远程仓库的地址,支持多种协议(如 HTTPS、SSH 等)。你可以从 GitHub、GitLab、Bitbucket 等平台上获取仓库的 URL 。可以理解为仓库的网址。
克隆页面如下:
克隆完成后当前目录下会多出一个新的文件夹。
克隆时,若未指定克隆的分支与克隆到的目录,默认克隆全部分支,克隆到当前目录。
若你想要克隆到指定目录/克隆指定分支,那么你可以采用以下命令:
#将仓库克隆到指定目录
$ git clone <仓库URL> <目标目录>
#克隆仓库的指定分支
$ git clone -b <分支名> <仓库URL>
(2)查看存档信息
使用:
git log
查看目前为止所有的存档.
使用git log 会显示HEAD -> master(举例而已,并非一定是master),头指针指向master,代表你当前所在位置,位于master分支。同时你还可以看到你的仓库目前为止所有的提交信息。
使用:
git reflog
也可以查看版本信息,但它只显示你提交、回溯过的版本,以及进行分支切换的信息。
使用:
git status
可以得知, 与当前存档相比, 哪些文件发生了变化.
显示的信息很详细,它显示你目前处于pa1分支,各个文件的修改以及未跟踪的文件(指你在仓库中新建的文件/文件夹)。
如果你希望查看更详细的信息 ,使用:
git diff
它可以更详细的看到,你对某个文件的修改(哪些行被添加,哪些行被删除):
VScode玩家更加便捷, 点击红色方框内的选项即可:
它可以将你现在的代码与你上一版 提交的代码进行一个对比,更加直观的看出代码的修改情况。
(3)存档
你可以像以前一样编写代码,等到你的开发取得了一些阶段性成果, 你应该马上进行"存档"。
首先你需要使用 git status
查看是否有新的文件或已修改的文件未被跟踪, 若有,则使用 git add
将文件加入跟踪列表,例如
git add file.c
会将 file.c
加入跟踪列表。 如果需要一次添加所有未被跟踪的文件,你可以使用
git add -A
但这样可能会跟踪了一些不必要的文件,例如编译产生的 .o
文件,和最后产生的可执行文件。 事实上,我们只需要跟踪代码源文件即可。为了让 git
在添加跟踪文件之前作筛选,你可以编辑 .gitignore
文件(你可以使用 ls -a
命令看到它), 在里面给出需要被 git
忽略的文件和文件类型。
把新文件加入跟踪列表后,使用 git status
再次确认,确认无误后就可以存档了,使用
git commit
提交工程当前的状态。执行这条命令后,将会弹出文本编辑器,你需要在第一行中添加本次存档的注释,例如"fix bug for xxx". 你应该尽可能添加详细的注释,将来你需要根据这些注释来区别不同的存档。编写好注释之后,保存并退出文本编辑器,存档成功。你可以使用 git log
查看存档记录,你应该能看到刚才编辑的注释。
(4)读档
如果你遇到了上文提到的让你悲痛欲绝的情况,现在你可以使用 Git 来救你一命了。首先使用 git log
来查看已有的存档, 并决定你需要回到哪个过去, 每一份存档都有一个hash code(哈希码), 例如 b87c512d10348fd8f1e32ddea8ec95f87215aaa5
,你需要通过hash code来告诉 git
你希望读哪一个档。使用以下命令进行读档:
git reset --hard b87c
其中 b87c
是上文hash code的前缀: 你不需要输入整个hash code。 这时你再看看你的代码, 你已经成功地回到了过去!如果你只是从过去的版本查看一些代码,查看后想要回到你回退之前的版本,任然可以通过git reflog,查看你提交的版本信息,进行回退。
但事实上, 在使用 git reset
的hard模式之前, 你需要再三确认选择的存档是不是你的真正目标。 如果你读入了一个较早的存档, 那么比这个存档新的所有记录都将被删除! 这意为着你不能随便回到"将来"了。
(5)分支切换
当然还是有办法来避免上文提到的副作用的,这就是 git
的分支功能。使用命令
git branch
查看所有分支。 其中 master
是主分支,使用 git init
初始化仓库之后会自动建立主分支。
读档的时候使用以下命令:
git checkout b87c
而不是 git reset
。这时你将处于一个虚构的分支中,你可以
- 查看
b87c
存档的内容 - 使用以下命令切换到其它分支(改版本下的其他分支)
git checkout 分支名
- 对代码的内容进行修改,但你不能使用
git commit
进行存档,你可以使用:
git checkout -B 分支名
把修改结果保存到一个新的分支中, 如果分支已存在, 其内容将会被覆盖
不同的分支之间不会相互干扰, 这也给项目的分布式开发带来了便利. 有了分支功能, 你就可以像第三视角那样在一个世界的不同时间(一个分支的不同存档), 或者是多个平行世界(多个分支)之间来回穿梭了。
3.结语
(1)推荐一个方法:添加自定义命令。
查看存档信息时,我通常使用:
git log --all --graph
它提供了更丰富、更结构化的历史信息,特别是在查看分支结构和代码历史时更直观。
但是它有点长,我每次都需要输入这么多单词,想“偷懒”怎么办?(~ ̄▽ ̄)~
修改Bash shell 的配置文件!
终端输入,打开shell 配置文件:
vim ~/.bashrc
(此处我使用的 vim 编辑器进行编辑,你也可以采用其他编辑器.)
找到“ # some more ls aliases ”注释的位置,大概在90行的样子。(vim 配置行号点这里)
前三个是系统自带的,咱们可以照葫芦画瓢,我添加了 glap 作为“git log --all --graph”命令的展开,这样,我就可以直接在终端输入 glap ,达到和 git log --all --graph 一样的效果。
不信可以试一下哦 ε≡٩(๑>₃<)۶
这里以 greprn 为例( greprn 展开是 正则表达式 搜索) :
我输入greprn 相对于输入 grep -rn --binary-files=without-match,是不是特别方便 (。・ω・。)
(2)推荐一个工具
如果你不希望在自己的仓库练习git,万一玩坏了可咋整,那么你可以自己建立一个新仓库,在里面可以疯狂玩耍,大不了玩坏了就删除仓库(毕竟只是练习用的,没有克隆有用的源码)。
如果你觉得建立个仓库麻烦,那么!墙裂推荐一个工具:Learn Git Branching
里面有丰富的动画,可以帮助练习 git ,理解 git 的各种操作,不久后你将成为 git 大佬 ( • ̀ω•́ )✧