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 | git config --global user.name "gitHub用户名" |
2.生成ssh key。配置如下:
1 | ssh-keygen -t rsa -C "gitHub注册邮箱" |
回车到底,按照提示找到.ssh文件夹中的id_rsa.pub,将密钥复制。
打开github的keys设置页面,新建ssh 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 | git add test1.txt |
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
的指针HEAD
。
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 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 –
注意这些都是行为!!!
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会快些。