续接上篇文章
以上是我们将本地已有的工作目录创建仓库,还有一个创建的方式就是对已有仓库的克隆,命令如下:
git clone 网址
由于本书在GitHub上建立了远程仓库,因此读者也可以使用克隆的方式将远程仓库复制到本地。在Github网站上任何一个项目你都可以找到克隆的网址,如图1.4.2-6所示:
git clone git@github.com:nigo81/IT-Audit.git
使用git clone
命令完成克隆后,就可以在本地学习、修改、运行代码。
1.4.3 记录文件修改
「显示更改信息」
对于每一次文件的修改更新都可以用git add
添加到暂存区,再用git commit
完成提交。这两个命令是最简单和常用的,下面介绍下对于文件修改过程中可能用到的命令。
git diff
git diff
用来查看修改后与已存入暂存区的版本的差异。现在我们在创建的仓库中audit.txt添加一行文字'第二行文档',再执行git diff命令,如图1.4.3-1所示:
如果使用的时候有中文乱码,通过执行如下命令,修改core.quotepath参数即可:
git config --global core.quotepath false
「删除文件」
git rm 文件名
对于已经提交的文档,如果我删除,如果直接删除在使用git status
的时候还是会显示出该文件。那么我们就需要使用git rm
来删除该文件。
「移动文件」
git mv 旧文件名 新文件名
当我们想将某个文件移动到仓库里中的路径的时候,需要使用git mv
命令,当然修改文件名也是用这条命令。
对于文件的新增、修改、删除的记录我们都已经掌握了,那么当我在写文档的时候,发现这些修改我想要了,怎么回退到以前的版本呢?由于Git的文件分为未记录到暂存区、已记录到暂存区、已提交三种状态,因此我们需要掌握这三种状态下的版本回退。
「未记录到暂存区」
刚才我们在"audit.txt"里添加了一行,并用git diff
查看了修改的差异。现在我们还没有用git add
记录到暂存区,现在我想放弃修改。首先我们用git status
查看下文档状态 。
$ git statusOn branch masterChanges not staged for commit: (use "git add ..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: audit.txt
这里我们可以看到系统提示我使用git restore
来放弃修改。那么我们通过执行:
git restore audit.txt
就回退到我们修改前的版本。
❝注:有些git版本是使用
❞git checkout 文件名
来放弃修改,具体看系统提示。
「已记录到暂存区」
我们对"audit.txt"文档添加一行,并git add .
将其添加到暂存区,现在我们执行git status
:
$ git statusOn branch masterChanges to be committed: (use "git restore --staged ..." to unstage) modified: audit.txt
可以看到系统提示我们使用git restore --staged
来放弃添加到暂存区。由此也可以看出,我们并不需要一开始记住那么多命令,系统会提示我们。
「已提交」
git log
当我们提交过多次的时候,可以使用git log
来查看历史提交的版本:
$ git logcommit d6a60f80169d019675953c08d0f9a857b8846e8b (HEAD -> master)Author: auditor <452548582@qq.com>Date: Thu Feb 6 19:05:55 2020 +0800 添加第二行commit 6e8e0545ebd86fca1faa8d78f48a331f90d64886Author: auditor <452548582@qq.com>Date: Thu Feb 6 00:08:11 2020 +0800 init my docoment
可以看到现在我的仓库里有两个版本,包含了SHA-1值、作者、日期、commit描述信息。这里也可以看出开始我们使用git commit -m "描述"
需要添加你自己的描述的作用,能够方便你知道这个版本的是做了什么修改。
当我们commit次数很多过后,使用git log
展示历史所有的信息就会很冗长,为了限制查看的版本数,我们可以使用:
git log -2
这里是显示最近两个版本,当然数字你可以随便修改。如果我们在显示版本的时候,还想看出每个版本做了哪些修改,我们可以使用命令:
git log -p -2
-p
参数能够显示每个版本的具体修改内容。
好了,接着刚才回退的话题,如果我想退回到"init my document"这个版本,我们可以使用命令:
git reset SHA-1值
这里的SHA-1值就是我们执行git log
的时候显示的字符串。比如这里我想回退到最初始的版本,那么就执行:
git reset 6e8e
这里的SHA-1值我们不需要输入完整,输入前面几个字符就可以。这个时候我们就已经回到了初始的版本。如果我只有一个文件需要回退到之前的历史版本,其他文件的修改还想保留,那么我们如下使用git reset
:
git reset SHA-1值 -- 文件名
假如我是一个善变的人,我改变主意了,又想恢复到之前的版本怎么办?这里我们需要使用git reflog
查看引用日志。当你在工作时, Git 会在后台保存一个引用日志(reflog),引用日志记录了最近几个月你的 HEAD 和分支引用所指向的历史。
$ git reflog6e8e054 (HEAD -> master) HEAD@{0}: reset: moving to 6e8ed6a60f8 HEAD@{1}: commit: 添加第二行6e8e054 (HEAD -> master) HEAD@{2}: reset: moving to HEAD6e8e054 (HEAD -> master) HEAD@{3}: reset: moving to 6e8ebffdeb6 HEAD@{4}: commit: 添加一行文字6e8e054 (HEAD -> master) HEAD@{5}: commit (initial): init my docoment
这里可以看到我们回退前的版本SHA-1值为d6a60f8,我们继续使用git reset
命令回到回退前的版本。
git reset d6a60f8
1.4.4 分支的使用
有时候我们需要对文档进行较大幅度的修改,甚至是尝试一条新创作方向,但是最终是否成功我们并不知道,如果把之前的创作道路比作主路的话,那么现在我想创建一个分支,来进行尝试新的道路,如果失败了,我还能重新切换到主路去。
git branch dev
现在我创建了一个'dev'分支。我们可以使用git branch
查看当前所有分支:
$ git branch dev* master
我们可以看到显示出了两个分支master和dev,master是我们主分支,前面的星号代表现在我们还停留在master分支上。我想切换到dev分支就可以用命令:
git checkout dev
当然我们可以使用git checkout -b
命令将创建分支、合并分支两个步骤一条命令执行完:
git checkout -b dev
比如现在我新建一个tax.txt文档,添加并提交。现在我们在dev分支下就有三个文件:
$ lsaccount.txt audit.txt tax.txt
现在我们切换回master分支:
$ lsaccount.txt audit.txt
用ls
可以看到本地只有两个文件,这说明master和dev分支是完全独立的,我们再也不需要像以前那样先复制整个文件夹后再进行修改,并且不用担心文档的混乱。假如dev分支的修改我想合并到master分支上,我们只需要git checkout master
后,使用git merge dev
合并dev分支:
$ git merge devUpdating 037cb60..194b41dFast-forward tax.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 tax.txt
合并成功后,dev分支的修改都保存在了master分支上了。如果dev分支不再需要你可以使用git branch -d
命令来删除:
git branch -d dev
对于分支的使用我们初学者掌握到这里就差不多了,如果有更多需求可以查看《Pro Git》文档。
1.4.5 添加远程仓库
前面所有过程都是在本地的,也就是说我们使用Git进行版本控制可以不需要网络。但是如果我们有多台工作设备或者需要和他人协作,那么只存在自己电脑就不行了,我们需要托管到远程仓库。远程仓库是指托管在因特网或其他网络中的你的项目的版本库。而Github 就是最知名的免费远程仓库了,我们可以将我们本地的版本库托管到上面。
当我们注册好Github账号后,如图1.4.5-1所示新建一个空项目,填写好项目名称,描述信息,选择公开或私有。
创建后,网站会给你一个远程仓库的网址以及和远程仓库连接的命令,如图1.4.5-2所示。
「添加远程仓库」
git remote add origin https://github.com/nigo81/IT.git
我们将本地的IT项目添加远程仓库后,就可以使用git push
命令将本地的仓库推送到远程:
「推送到远程仓库」
git push -u origin master
第一次推送到远程仓库的时候需要用-u
参数,其中origin是我们使用git remote add
时对远程仓库的命名,默认是origin,如果有多个远程仓库,我们可以分别有不同命名。master是主分支。
这个时候,终端会让输入github上的名称和密码。如果我不想每次用git push
都输入用户名、密码怎么办?这个时候可以在git remote add
命令的中的远程仓库网址添加上用户名密码。我们先把前面添加的origin远程仓库删除。
「删除远程仓库」
git remote rm origin
「免密码添加远程仓库」
git remote add origin https://USERNAME:PASSWORD@github.com/username/reponame.git
这里我们只需要在前面的网址格式上添加上用户名和密码,这样后续的推送就不需要再输入了。
当然,如果是一个新项目,我们可以在github上新建后直接git clone
下来,这是对于初学者最方便的方式。对于这种方式,我们可以使用SSH协议传输,不用每个新建的项目都去建立与远程仓库的连接并且不用每次输入密码。
在图1.4.5-2中我们可以看到远程仓库的网址是https协议的,我们点击SSH后,可以得到‘git@github.com:nigo81/IT.git’的网址,如果我们需要使用SSH协议传输,就用git clone
这个网址。为了以后每次上传不输入用户名、密码,我们需要生成一对SSH的公钥、私钥,将公钥文本设置到GitHub中。
「生成SSH密钥」
ssh-keygen -t rsa -C "youremail@example.com"
在终端输入命令后,在提示中一直按回车键,会在C盘(c/Users/yourname/.ssh)生成.ssh文件夹,这里的yourname是你当前的windows系统用户名。如果是Ubuntu系统路径为“~/.ssh”。文件夹里有公钥id_rsa.pub和私钥id_rsa两个文件。我们记事本打开公钥id_rsa.pub复制所有文本内容。打开GitHub网站上“setting->SSH and GPG keys”,将复制的公钥文本粘贴上去,如图1.4.5-3所示:
完成添加后,GitHub上有公钥,而我们本地电脑有私钥,这样就可能安全的通信,git push
的时候也不用再输入密码。
1.4.6 推送和拉取代码
「push」
git push
将本地分支推送到远程仓库对应分支。
「fetch」
git fetch
将远程仓库拉取到本地。
git pull
将远程仓库拉取到本地并与本地版本合并。
「pull requst」
当我们克隆了别人的项目,我有一些非常好的修改,怎么能让原项目作者采纳呢?这也是开源项目的魅力所在,所有人都可以做贡献,同时所有人都能够受益。我们以本书在GitHub上的项目IT-Audit 为例进行说明。
如图1.4.6-1所示,我们找到一个开源项目,点击“Fork”,克隆到自己的远程仓库。
如图1.4.6-2所示,找到你Fork后的项目网址,使用git clone
到你电脑本地,切换到dev分支(你也可以使用master分支),你可以帮助作者修改一些错别字或者Bug。
git clone https://github.com/auditor81/IT-Audit.gitgit checkout -b dev
修改完成后,提交并推送修改:
git add .git commit -m 'test'git push
如图1.4.6-3所示,在自己(不是原作者)的GitHub上切换到dev分支,并点击“New pull request”。填写好描述信息后,点击“Create pull reqeust”,如图1.4.6-5所示。
这样你就的“pull request”请求作者就能看见,如果作者觉得你的修改很不错就merge到他的分支上,这样大家就一起完成了一次协作。
❝作业:
1.Fork本书所在的GitHub项目,创建一个分支,发现并修改一些错误后提交
pull request
。2.遇到疑惑查看Pro Git,或者通过搜索引擎寻找答案。
❞
结语
整个写作过程我将发布在github上,大家可以在下面的网址中随时查看。
IT Audit
涉及到具体操作演示的,我会录制视频,发布在bilibili上,大家可以免费观看(B站上搜索nigo81)。
在写具体章节的时候,我会尽量以一个小作业供大家练习,这种以解决问题的方式应该是学起来最快的。
这个小作业,后面我会在知识星球发出,有疑问的会在里面和大家一起探讨。