上篇博客说到了Git是什么以及搭建基本的Git环境,这篇就说说其基本使用
提交
上一篇写到了,你有个README.txt需要提交
$ git add README.txt ## 将需要提交的文件保存到缓存区
$ git commit -m "ADD README" ## 将缓存区的提交到本地仓库,"ADD README" 是注释信息**
$ git status ## 查看状态
此时的结果大概是这样的:
我的ubutu系统是中文的,大家如果看到英文的跟这个也是一个意思的
此时我们修改下README.txt,加入新的一行”Day 3”,查看下此时的状态
$ git status
显示的是,README.txt已经被修改,但是没有被提交到缓存区更没有提交到本地仓库
现在我们想看看自己到底修改了什么,怎么看?
$ git diff README.txt
显示添加了一行”Day3”
此时我们提交:
版本回退
现在咱们再给README.txt修改下,讲”Day3”改为”Day of light”:
很明显,此时的git应该是这样的结果:
提交到版本库:
git commit -m "Alert Day3"
查看历史版本:
git log
结果是:
以上显示的就是历史版本信息,通过git commit -m 添加的提示信息此时就会很有用
或者可以换个显示的方式:
git log --pretty=oneline
每一行上黄色字体显示的是版本的ID信息,后面绿色的显示的是你的提示信息,我们之后要版本回退就是根据这些黄色的ID信息
现在我们想回退到上一个版本,可以有两种方法:
HEAD
使用命令:
git reset --hard HEAD^
,即可
HEAD代表最新的版本,HEAD^^表示上个版本的上个版本,依次类推
可以看到此时的版本已经回退到上一个版本(大家可以对比上一张图片),此时查看下README.txt的内容 应该是上个版本的内容了
版本号
OK,现在我们已经回退了,突然发现这个不是我们想要的,我们要修改的是在最新的那个版本上修改,这时我们已经进行了版本回退,该怎么办呢?
git reflog
## 获取修改的历史操作
git reset --hard 版本号
## 使用版本号进行回退
通过reflog得到命令历史,可以得到版本号,之后通过版本号进行回退即可,需要注意的是版本号不一定要写全,像我的例子就是没有写完,git会自动匹配到最接近的
工作区与缓存区(stage)
上面我一直说,git add将文件加入到缓存区,git commit讲其提交到本地仓库,下面就说说工作区与缓存区
工作区:
除了.git不属于工作区,你看到的目录都是工作区缓存区(stage/index):
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
我们进入.git目录下查看:
现在我们明白,使用Git提交文件到版本实际是有两步:
第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到缓存区
第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上
撤销修改
撤销修改使用:
git checkout -- FILENAME
这个命令会见缓存区中的文件和工作区的文件进行对比,返回到缓存时的状态,比如:
(1) 你在工作区的修改没有add到缓存区
毫无疑问,此时checkout的一定是缓存区中的文件,相当于丢弃工作区的内容
(2) 你在工作区的修改已经add到缓存区
之后你再对文件进行修改,不使用add,checkout的结果一定是缓存区中的,相当于丢弃第一次add之后所做的更改
示范:
我们先对README.txt进行修改,增加一行”Check Test”,第一次没有进行add操作:
此时使用 git checkout -- README.txt
此时的”Check Test”就没了
这时候我们讲修改的进行提交,再次进行修改操作,再次撤销看看结果如何:
可以看到所做的修改被撤销
删除文件
假设此时我们新建了个test.txt,然后add到缓存区并提交
$ touch test.txt
$ vi test.txt
$ git add test.txt
$ git commit -m "Add test.txt"
假设我们不小心在工作区删除了test.txt,此时有两种选择:
(1) 希望恢复test.txt
使用命令
git checkout -- test.txt
因为此时缓存区有你的test.txt,结合我们说的checkout是对比缓存区与工作区的,自然就会将缓存区test.txt拉回来
(2) 希望缓存区也删除test.txt
git rm test.txt
## 将缓存区的test.txt也删除
默认情况下,git rm file 会将文件从缓存区和你的硬盘中(工作目录)删除
如果你要在工作目录中留着该文件,可以使用 git rm --cached
如果此时你发现test.txt还是要的,需要将它变回来,这个怎么办???
相信大家已经想到,就是版本回退嘛
git reset --hard ID
这样的话,大家已经看到test.txt已经回退回来了
移动文件
现在假设你想重命名文件,重命名磁盘上的文件,然后再执行 git add 把新文件添加到缓存区,可以使用下面的命令:
git mv FILENAME NEWFILENAME
看看到现在为止的历史操作
使用Github
到现在我们只是在本机上玩玩git,并没有涉及到真正的分布式存储,使用github可以创建我们的远程仓库可供别人fork下来修改然后提交给你,或者你自己进行修改
注册github
Github官网,自己注册去吧
创建一个仓库(reposity)
查看HTTP和SSH的仓库地址:
图上我标红的就是
由于我使用的是SSH,所以:
安装SSH
sudo apt-get install openssh-server
将本地SSH公钥添加到Github上
<1>生成公钥
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
产生的位置在~/.ssh
中,id_dsa.pub
就是公钥
在setting
中打开SSH-keys
添加ssh key就可以了
本地的版本库与远程关联
咱们在开始创建的工作区再创建个文件夹testGit
,并在tetsGit
文件夹下创建文件README.ttx
和test.txt
接下来将远程仓库和本地进行关联:
git remote add origin git@github.com:GavinZhou2014/testgit.git
此时的状态是:
表示testGit
需要提交
本地添加并提交
将项目添加到本地仓库并进行提交
$ git add testGit
$ git commit -m "Version 1.0 testGit"
远程推送
之前我们已经将远程的Github仓库和本地进行关联,现在只需要进行推送就可以了
git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
之后你再做修改的话,需要进行远程提交直接就是:
git push origin master
, 不需要加上-u
参数
此时进入咱们的GitHub项目上看看是什么效果:
可以看到,成功创建一个远程的GitHub项目
clone远程仓库到本地
咱们现在要克隆一个别人的代码下来,先找到地址,比如:
SSH地址明显是:git@github.com:whtsky/WeRoBot.git
使用命令:
git clone URI
,就可以clone下来
$ git clone git@github.com:whtsky/WeRoBot.git
就会在当前目录下创建项目名称WeRoBot
这个文件夹,里面就是代码
GitHub其它操作
还有很多的操作没有写,比如创建分支等等,有兴趣的可以看看这篇博客HERE
写的很不错,简单易懂,可供参考