前言
这是 Palind 写给他的朋友 Traceless 的 Git 简明教程 !
Traceless 是北京理工大学的一名优秀的本科生。聊天时,他提到想学习 Git 和 Github。
于是,Palind 想要给他写一份 Git 的简明教程。
本文章将主要按照第二人称 的形式,来为 Traceless 介绍 Git 的最基本的 用法。除了 Traceless,你也可以阅读本文一起学习!笔者也是新手哦,希望读者多多包涵。
参考资料
简介 - Git教程 - 廖雪峰的官方网站(主要参考)
写给 Traceless 的 Git 简明教程
简介
Traceless酱,很高兴能和你一起学习 Git。Git 是 Linus 设计的一种分布式版本控制系统。简单来说,Git是一种可以记录你或他人对某些文件每次进行的修改历史的软件,以此实现多人对文件的管理、开发和历史版本维护。回忆一下你英语课或者其他什么课制作 Pre 的 PPT 的时候,你一定曾多次对 PPT 进行修改。那么,你的英语课文件夹里,可能就会有不少命名为 pre.pptx、pre-副本.pptx、pre-最终版.pptx、pre-最终最终版.pptx
的冗杂文件。通过 Git,你就可以记录文件的改动,而不是手动创建副本了。
而 GitHub 是一个网站,它里面有很多开源项目的 Git 存储。你可以通过 Git 参与 GitHub 上的项目的开发、复刻、维护。
安装
鉴于你是 Windows 系统,你可以点击 Git - Downloads 来下载 Git。安装完成后,你可以在开始菜单里找到 Git 文件夹。点击后,就可以看到 Git Bash。
Git Bash 是一种可以让你的 Windows 系统运行 shell 命令和 Git 命令的命令行工具。现在,你可以把你的电脑当作 Linux 用了。不过,它并不是真正完整的 Linux 环境。
点击 Git Bash 就可以开始进行配置了。你要在 Git Bash 里输入:
1 | $ git config --global user.name "你的名字" |
注意,美元符号$
是自带的,你不用自己打出来。双引号要打出来。
仓库
Git 是以仓库 (Repository)为单位来保存、追踪和管理文件的更改历史的。可以将仓库理解为一个目录,里面的文件的任何修改变化都会被 Git 追踪。(追踪可以精确到行)
一般来说,仓库被程序员们用来放源代码。不过你要是想用 Git 管理别的文本文件也可以。注意,不能(或者说不适合)用 Git 管理你的英语课 Pre 的 PPT ,因为 Git 是被设计用来管理 纯文本文件 的,比如 .txt
、.md
、.py
、.cpp
、.html
这样的源码或文本类文件。而像 PPT 的 .pptx
文件是 二进制文件,Git 对它的更改是无法逐行追踪的(也就是 Git 没法讲清楚你的某版 PPT 改动了什么位置),而只能把它当成一个整体文件来看,即每次改动PPT时,Git 都要存一份完整的新版本 PPT 文件,不能只存“差异”,这就导致仓库越来越大。
创建仓库
我们来动手创建一个仓库。
打开 Git Bash,注意到你现在的路径是一个波浪号~
,它代表你目前所在的路径是c/Users/你的用户名
,这是一个 C 盘的路径。
我们不动 C 盘,而是去 D 盘进行创建仓库的学习。在 Git Bash 中输入(同样的,你不用输入$
符号,它给你在前面写好了):
1 | $ cd d: |
现在,你进入了 D 盘。我们在 D 盘创建一个新目录吧,输入:
1 | $ mkdir learngit |
第一行命令是创建一个名字叫 learngit 的文件夹,第二行命令是进入这个文件夹。
现在,我们已经在目标文件夹里了,我们输入
1 | $ git init |
我们就成功在目标文件夹中创建了一个仓库。现在,你打开 learngit 文件夹,并在“查看”中打开“隐藏的项目”,就能看到刚刚创建的 .git 隐藏文件夹,如图:
这个 .git 文件夹里的东西,就是 Git 用来跟踪管理版本的文件。如果里面的文件损坏,仓库就损坏了。
此外,你会看到你的 Git Bash 中,路径后面跟着一个小括号,写着
这代表你当前在主分支 master 里。
向仓库中添加文件
我们来向仓库中添加一个名为readme.txt
的文件吧。Github 上几乎每个项目都有 readme 文件,它的作用是介绍项目。
首先,在刚刚的 learngit 文件夹里,创建一个readme.txt
文件,在里面随便写上你想写的内容,如图,
保存文件后,我们回到 Git Bash(你刚刚没有关闭它吧?不要关闭,不然路径仓库不正确),输入:
1 | $ git add readme.txt |
现在,你已经把 readme.txt
这个文件添加到了暂存区(Staging Area)。注意这只是告诉 Git:“这个文件是我准备好要提交的,你先记录下来。”
你可以通过这个操作,再向暂存区里添加你需要的文件。之后,你要输入
1 | $ git commit -m "写了一个 readme.txt" |
这个步骤叫提交。提交完成后,Git Bash 会显示:
1 | [master (root-commit) e9…一堆哈希值…a5] 写了一个 readme.txt |
我们来解释一下,你输入的 git commit 的 -m 后面跟着的参数是一个字符串,它是你自己写的,代表这一次提交的简要说明,例如“添加了某某文件”。
Git Bash 的那一堆输出中,第一行是
1 | [master (root-commit) e9…一堆哈希值…a5] 写了一个 readme.txt |
其中,master 代表这次提交是在名为 master 的分支上完成的。Git 默认 master 为主分支。
(root-commit) 代表这次提交是这个仓库的第一次提交,所以它叫“根提交”。
e9…一堆哈希值…a5是 Git 为这次提交生成的提交哈希值(commit hash),用来辨识这个提交。可以理解为,这次提交的名字叫“e9…一堆哈希值…a5”。我们看到的是它的前几位。
写了一个 readme.txt
是你刚刚写的对这一次提交的简要说明。
第二行是
1 | 1 file changed, 3 insertions(+) |
这一行代表在这次提交中,有 1 个文件发生了改动,总共添加了 3 行内容。
第三行是
1 | create mode 100644 readme.txt |
这一行代表 Git 在这次提交中新建了一个文件 readme.txt
,并且它的权限模式是 100644
。
总结一下,添加一个文件,先git add <file>
再git commit -m <message>
。
版本维护
修改文件
你先修改你刚刚的文件,
保存后,再输入
1 | $ git add readme.txt |
现在,输入 git status
来查看当前仓库的状态,会显示
1 | $ git status |
说明没问题,当前没有需要提交的修改,工作目录干净。
版本回退
第一次提交中,我们的 readme.txt 是
1 | 你好!Hello World! |
第二次是
1 | 你好!Hello World! |
我们输入git log
查看,得到输出
1 | $ git log |
我们现在处于修改了 readme 文件的版本,如果想要回退导创建 readme.txt 的版本,可以输入
1 | $ git reset --hard HEAD^ |
或者
1 | $ git reset --hard e9…一堆哈希值…aa |
就会显示
1 | HEAD is now at e9fdaa5 写了一个 readme.txt |
此时,你打开 readme.txt 会惊讶地发现,
回退到了一开始的版本。想要重新回到最新的版本,需要输入
1 | $ git reset --hard 0a9…一堆哈希值…618 |
事实上,这堆哈希值你只需要输入前几位就行了,Git会自己找到的,即输入
1 | $ git reset --hard 0a9b |
就能成功回到最新版本。对于参数--hard
,代表回退到上个版本的已提交状态;如果是--soft
会回退到上个版本的未提交状态,而--mixed
会回退到上个版本已添加但未提交的状态。
此外,使用命令git reflog
可以查看你之前输入的让 HEAD 移动的所有命令,以及输入命令时,HEAD 被移动后处于的版本的ID哈希值。
撤销修改
git checkout -- 文件名
可以丢弃工作区的修改,让这个文件回到最近一次git commit
或git add
时的状态。
git reset HEAD 文件名
可以把暂存区的修改撤销(unstage),并放回工作区。
删除文件
我们在文件夹里直接删除 readme.txt(拖到回收站之类的删除),输入git status
命令,得到输出
如果确实要删除这个文件,就
1 | $ git rm readme.txt |
如果不要删除这个文件,就
1 | $ git checkout -- test.txt |
通过这个命令来用版本库的版本替换工作区的版本。
GitHub(远程仓库托管)
GitHub 可以托管你的仓库,也可以让你拉取别人的仓库。要链接到 Github,你可以选择 HTTPS 或 SSH。我的建议是使用 SSH。
创建 SSH 密钥
① 生成新 SSH 密钥
打开你的 Git Bash,输入
1 | $ ssh-keygen -t ed25519 -C "你的邮箱@地址" |
如果之前没有创建过 SSH 密钥,接下来,你就点回车即可,直到它出现
1 | > Enter passphrase (empty for no passphrase): [Type a passphrase] |
这时,你要为你的 SSH 密钥设置一个密码。
② 将 SSH 密钥添加到 ssh-agent
首先,复制以下行并将其粘贴到 Git shell 中的 ~/.profile
或 ~/.bashrc
文件中:
1 | env=~/.ssh/agent.env |
然后,重新启动 Git Bash,你应该会看到它要求你输入 SSH 的密码。你要正确输入密码后按回车。
现在,以管理员身份运行 powershell,输入
1 | ssh-add c:/Users/你的用户名/.ssh/id_ed25519 |
③将 SSH 公钥添加到 Github 上的账户
按这个文档走就行:新增 SSH 密钥到 GitHub 帐户 - GitHub 文档
添加远程仓库
现在,你希望把本地的仓库与 Github 上托管的仓库远程同步。
打开 Github,点击Create a new repo
,设置你按需设置,然后就创建成功了一个空空的仓库。
打开 Git Bash,通过cd
命令进入你之前创建的本地仓库的路径,然后运行
1 | $ git remote add origin git@github.com:[你的Github用户名]/[你刚刚创建的Github仓库的名字].git |
注意,除了“[”和“]”不用写上,其他的符号都要写上,包括“/”等。
解释一下这行命令,这将远程库的名字命名为 origin,这样符合习惯命名。
接下来,你可以通过git push
,将你本地的仓库推送到 Github 上的远程仓库了,运行
1 | $ git push -u origin master |
这样就把当前分支master
推送到远程仓库了。注意这是第一次push
,所以加上了-u
参数,将本地的master
分支和远程的master
分支关联起来。以后就不需要了,本地做了git commit
提交后,只需要运行
1 | $ git push origin master |
就可以成功推送了。
如果要删除远程库,
1 | $ git remote rm origin |
(本质是删除绑定关系,Github 上的仓库不会被删除)
克隆远程仓库
如果你在逛 Github 的时候,遇到了自己喜欢的项目,想要研究源代码,就先用cd
命令到合适的路径下,再运行
1 | $ git clone git@github.com:你要克隆的项目的作者名字/你要克隆的项目名字.git |
你也可以用 HTTPS 协议,即
1 | $ git clone https://github.com/作者名字/项目名字.git |
贡献开源社区
你可以先fork
别人的仓库,修改fork
来的仓库里的代码后,通过pull request
来请求仓库主人采用你的代码。
分支管理
你可以在这个小游戏中学会 Git 的分支管理:Learn Git Branching
分支管理是 Git 的精髓之一,不过这是简明教程,就不展开讲了。
结语
Traceless酱,希望你能通过这篇文章了解 Git 的简单使用!!