Git

用hexo在github上部署博客,自然少不了git的使用,以下是我学习git的过程。

配置

1.Git定义

git是一种先进的分布式版本控制系统,是linus为了帮助管理 linux 内核开发而开发的一个开放源码的版本控制软件。

2.Git的安装

2.1 在windows下可在官网下载,选择对应的安装包,正确安装后就可以右键出现Git Bush Here和Git GUI Here。

2.2 在linux下相对方便些,直接sudo apt-get install git,注意是ubuntu和debian。

2.3 macos的xcode带有git,可在xcode中添加。

3.绑定github与生成ssh key

1.找到git bush,进行name和email的绑定。 配置如下:

1
2
git config --global user.name "gitHub用户名"
git config --global user.email "gitHub注册邮箱"

2.生成ssh key。配置如下:

1
ssh-keygen -t rsa -C "gitHub注册邮箱"

回车到底,按照提示找到.ssh文件夹中的id_rsa.pub,将密钥复制。

打开github的keys设置页面,新建ssh key。

key

名称随意,把密钥复制进来。确定后在git bush中输入ssh [email protected]

成功

waring可以不用理会,不喜欢可在host中修改。总之,出现如下欢迎页就算是成功了。

这样就将公钥放置到github上,而私钥放置在自己的电脑里了。每一次git都会进行密钥匹配,以保证推送合法。

学习

1.版本库(仓库)

1.1 在合适的地方创建一个文件夹,在文件夹中右键git bush here,通过git init初始化仓库。接下来创建一个txt文档试验一下,这里我命名为test.txt,输入内容。

1.2 通过git add test.txt命令添加至仓库。(这一步没有任何提示信息)

1.3 通过git commit -m "*"将文件提交,其中**是描述,为了方便区分,最好加上。这里的描述为just a test。当然,git commit可以在add所有文件后再执行。比如:

1
2
3
git add test1.txt
git add test2.txt test3.txt
git commit -m "add 3 test."

2.备份与恢复

输入git status可查看仓库的状态,若提示有所变动,则输入git status可查看文件进行了怎样的修改。

2.1 将test.txt文件内容进行修改,add后commit。想知道自己做了什么用git log查看日志。git log --pretty=oneline可相对简略些。

commit后的一串数字是commit id,以SHA1计算。

2.2 图中HEAD指这是当前版本,HEAD^就为上一版本,往上66个版本就为HEAD~66。要回到上一版本,可通过git reset --hard HEAD^实现。但通过git log发现,原来的版本不见了。如果能找到原来版本的id,那么可输入 git reset --hard 8ca8返回,id没必要写全,前几位即可。但找不到id怎么办?可用git reflog找到你的每一次命令。

id就在前面。

3.工作区与暂存区

工作区就是文件夹目录,比如文件夹test。

版本库是工作区中的一个隐藏目录.git,它不算工作区。版本库中有名为stage的暂存区、git自动创建的分支master、指向master的指针HEADgit-repo

git add的作用是将文件添加到暂存区

git commit 的作用是把暂存区的所有内容提交到当前分支

4.管理(修改 撤销 删除)

第一次修改 -> git add -> 第二次修改 -> git commit

上述操作会导致第二次修改无效,它并没有提交到暂存区。

所以要这样操作

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

工作区 –git add–> 暂存区 –git commit–> 版本库

在工作区修改文件后还没有放到暂存区,若需要撤销修改可用

1
git checkout -- test.txt

分为两种情况:

1.test.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库(版本库和暂存区一样)一模一样的状态;

2.test.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之就是把工作区的修改撤销,回到最近一次git add时的状态。

在工作区修改文件后,把文件add到了暂存区,若需修改可用:

git reset HEAD test.txt

这样,就把暂存区的文件撤销,重新放回工作区(回退)。再用git checkout -- test.txt清空工作区。

commit提交到版本库可git reset --hard HEAD^回退。可见git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。

当然,这只是本地版本库。提交到远程版本库就不行了。因为Git是分布式的。

删除一个文件,通常只在文件管理器中删掉即可。这时工作区和版本库就不一致了。

如果确实要删掉它,直接git commit即可。

不小心删除则可用git checkout -- test.txt恢复,可见git checkout其实是用 暂存区里的版本 替换 工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

见解

git rm file并且git commit并不是删除了版本库里的某个版本号,而是对工作目录下的删除操作进行了一个记录,会在仓库里生成一个新的版本号,在该版本下没有该文件。但是可以用git reset –hard commit_id进行版本回退,回退到有这个文件的版本号。而git checkout commit_id file命令是从含有该文件的旧版本号里把该文件拿出来,放到现版本里,版本号不改变。

当你要删除文件的时候,可以采用命令:rm test.txt

这个时候(也就是说这个时候只执行了rm test.txt)有两种情况

第一种情况:的确要把test.txt删掉,那么可以执行 git rm test.txt git commit -m “remove test.txt” 然后文件就被删掉了

第二种情况:删错文件了,不应该删test.txt,注意这时只执行了rm test.txt,还没 有提交,所以可以执行git checkout test.txt将文件恢复。

并不是说执行完git commit -m “remove test.txt”后还能用checkout恢复,commit之后版本库里的文件也没了,自然没办法用checkout恢复,而是要用其他的办法 【git rm】命令来删除的文件,这个命令是删除了Git暂存区的test.txt文件

这样更容易理解吧,暂存区也是维持文件版本的,当git commit后暂存区和分支版本一致。只git add ,没有git commit,此时,暂存区比分支新一个版本。

那么,git checkout – 就是在工作区恢复暂存区版本而已,它只和暂存区打交道。只不过当git commit后,没有再进行git add,此时暂存区和分支版本一致,

看起来是恢复的分支版本,其实还是恢复的暂存区版本。所以只是让文件回到最近一次 git add而已

假设工作区的文件add且commit过一次

然后再进行下面的操作:

  • 在工作区修改了文件, 但是还没有add到暂存区
    执行下面的命令, 可以恢复到与最后的版本一致的状态, 也就是修改前的状态
1
git checkout -- 文件名
  • 已经add到暂存区, 然后在工作区修改了文件
    执行下面的命令, 可以恢复到和暂存区一致的状态
1
git checkout -- 文件名

前面2种情况, 都是在工作区修改了文件, 修改的状态还没有add到暂存区

  • 修改了文件, 又add到了暂存区, 但是还没有commit
    执行下面的命令, 可以将暂存区的文件退回到工作区
1
git reset HEAD 文件名

退回到工作区的文件是被修改过的, 那么再执行下面的命令, 可以恢复到未修改的状态

1
git checkout -- 文件名

1.如果你用的rm删除文件,那就相当于只删除了工作区的文件,如果想要恢复,直接用git checkout – 就可以 2.如果你用的是git rm删除文件,那就相当于不仅删除了文件,而且还添加到了暂存区,需要先git reset HEAD ,然后再git checkout – 3.如果你想彻底把版本库的删除掉,先git rm,再git commit 就ok了

注意这些都是行为!!!

5.远程仓库(推送 克隆)

1.先前已经绑定了ssh key,接下来只需创建远程仓库。在github中创建远程库后,在本地运行

1
git remote add origin [email protected]:coltnagisa/test.git

coltnagisa是账户名,test是仓库名。origin代表远程库,是git的默认叫法。

要想把本地库推送到远程库,可用git push。如下:

1
git push -u origin master

加上-u,在第一次推送时,在推送的同时,还可以把本地与远程关联起来。以后提交只需:

1
git push origin master

2.创建一个新的远程仓库并勾选Initialize this repository with a README,远程仓库建好后就可用git clone克隆一个本地库。如下:

1
git clone [email protected]:coltnagisa/test.git

这个就是ssh的传输,也可以使用https,如下:

git clone https://github.com/coltnagisa/test.git

ssh会快些。