git
git下对暂存区的所有更改,都需要commit后才会真正影响版本库的内容。
创建版本库
在想要创建库的目录下键入
git init
一个空库就创建好了,并且有一个.git文件
git只能跟踪文本文件的变动,例如添加了“hello”,删除了“world”;git是无法跟踪图片、视频这些二进制文件的,只能跟踪他们大小的变化,具体更改了什么无从考证。
所以使用git进行版本控制,我们要使用文本文件。
添加、提交修改
git add readme.txt
git commit -m "first commit"
我们可以多次add新文件,最终一次commit提交这些文件,提交后文件就写入到仓库当中
如果新建的文件从没有add过,那么在git中显示的是untracked状态,说明git还没有跟踪该文件的变化
-m "somewords"后的字符串用来记录每一次提交的备注
在仓库里创建的文件,必须add之后,git才会管理该文件。
每一次修改文件之后必须先add,再commit才能真正提交修改的内容
查看库当前状态
git status
该命令能够让我们看到当前库的状态
查看修改文件的修改
git diff readme.txt
能够显示当前版本中文件内容和这次文件尚未add的内容的区别,得出修改了什么

查看历史记录
git log
显示从近到远的提交记录。
若只想显示每次commit的commit id:
git log --pretty=oneline

commit ID是SHA1计算出来的一个值,避免commit ID冲突。可以使用commit ID来回退到某个修改位置。
版本回退
git reset --hard HEAD^
回退到上一次的版本,HEAD是一个指针,指向了某个分支的某个版本

版本恢复
git reset --hard 02e1d
02e1d是commit ID的前面几个字符,不需要给全,git会自动去寻找,但给太少可能会出现冲突。只要知道commit ID就能回退,若还在当前命令窗口,只要能找回之前打印显示的commit ID就会指定恢复到某个版本,若找不到或退出了窗口可以使用:
git reflog
来查看每一次的命令,每一行也有一个commit ID,便可恢复。

前面的字符串是commit ID的前缀,是当时执行完后面的命令后所在的版本。
工作区、暂存区
我们创建版本库的本地仓库的目录,被称为工作区。在我们git init之后生成的隐藏目录.git,叫做版本库。
版本库里有一个叫做stage的暂存区,还有我们的分支和一个HEAD指针。

我们的add操作就是把一个修改,一个新文件添加到暂存区中,commit实际上是把暂存区中的修改提交到当前分支。
一旦我们提交了暂存区的修改,并且没有对工作区进行任何修改,那么我们的工作区就是干净的:

每次的提交都是提交暂存区的修改,如果一个文件修改一次后add到暂存区后,又在工作区修改了,但是这次没有add到暂存区,然后commit了,第二次的修改并没有被提交,git跟踪的是修改,并非是文件。
只有add到了暂存区的文件才会被commit到最新版本库中
撤销修改
git checkout -- filename
该命令使得工作区中文件回退到该文件最后一次add或者commit的状态。
注意必须要加--,因为checkout命令可用于切换分支
可用于撤销工作区的修改,回到与暂存区或版本库的版本。
在add之后,commit之前,可以将add的操作回退
git reset HEAD filename
执行该命令后,filename文件从暂存区中取消,这时再执行checkout命令,便可回到之前的版本。
删除文件
如果在工作区删除了一个文件,且该文件已经被添加到版本库了,那么git会跟踪该文件的改变,git status当前就不是clean的;如果想要在版本库中也删除这个文件,执行:
git rm filename
该指令和git add一样,都更改了暂存区的状态,需要commit才会对版本库进行更改。
如果删除后想要恢复,可使用git checkout -- filename 命令恢复。
如果一个文件没有被添加到版本库中,此时工作区直接删除文件是无法恢复的,只有被跟踪的文件才能恢复。
远端仓库
使用git可以把自己本地的修改推送到远端服务器,也可以从远端服务器拉取文件到本地,在此之前,必须配置好ssh key,因为git使用ssh进行验证,确保是你在读写你有权限的库。
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
我们可以在GitHub的同一个账号上,添加多个key,例如我们可以将不同的电脑都添加到GitHub的ssh key中,我们就可以在这些任意一个电脑上进行git操作远端库。
添加远端库
在远端例如GitHub上建立了一个库后,可以将本地文件推导该库中:
git remote add origin address
address是远端库的http地址或ssh地址
添加后,远端库的名字就叫origin,这是git的默认叫法,也可以改成别的名字,但origin具有一般标识含义,以看就知道是远端库。
这里所谓的远端库名字origin是该库在本地的标识。
下一步就可以把本地的内容推送到远端库上
git push -u origin master
平时推送的命令就是git push,但是在第一次初始化远端库时,库时空的,并没有master分支,我们需要加上-u参数,git不但会把本地master分支的内容推到远端的master下,还会把本地master和远端master关联起来,在以后的推送和拉取下就可简化命令。
从现在开始,只要本地做了修改,就可以通过命令
git push origin master
把本地master分支的内容推到远端库中
在第一次push或者clone操作时,git会给出一个警告,这是一个SSH警告,让我们确认ssh key的信息是否真的来自远端服务器,输入yes回车即可,这样git会输出一个警告,告诉自己已经把服务器的key添加到信任列表里了,以后就不会再出现这个警告了。(一个双端的确认,首先在GitHub上添加本地的ssh key,然后第一次push/clone时确认对端信息)
如果实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
从远端库克隆
我们可以从一个远端库,把其所有内容都克隆到本地
git clone address
address可以是http的,也可以是ssh的,ssh的会更快些,克隆后,在本地就有该远端库的一个拷贝。
如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了,每个人在自己主机的修改再push到远端库即可。
从远端库克隆后,本地生成了一个版本库,可以进行后续git操作;要与普通的下载内容区分开,git clone除了下载了文件,还是一个版本库。
git常用命令
git add 文件 : 追踪指定文件
git add . :追踪所有的文件
git commit -m "注释" : 提交报本地仓库
git push : 推送远程仓库
git pull : 拉取
git status : 查看当前的提交状态
.gitignore : 忽略文件夹
git checkout -b xiao_a : 创建xiao_a分支,并且切换到xiao_a分支
git branch 分支名 : 创建分支,不切换
git checkout 分支名 : 切换到某个分支
git branch: 查看分支
git branch -d 分支名 : 删除分支
git merge 要合并的分支名称 : 合并分支
git reset HEAD test2 : git add 后 撤销文件
git reflog : 查看所有操作的日志
git reset --hard HEAD : 版本回退
git stash : 讲文件放入暂存区
git stash list : 查看缓存区文件
git stash applly 缓存区id : 将指定的文件从缓存区拿出来
git stash pop : 将文件从缓存区拿出来,并删除缓存区的文件
git stash clear : 清除缓存区
git diff 文件名: 比较的事工作目录和暂存区的不同
git diff --cached 文件名 : 比较暂存区还远程仓库的不同
git diff commitID 文件名: 比较工作目录和远程仓库的不同
git stash branch 分子名称: 暂存区创建分支
git tag -a 标签名称 -m "注释" : 创建标签
git tag : 查看标签
git push origin 标签名称 : 推送标签到远程仓库
git push origin --tags : 推送所有的标签到远程仓库
git pull origin master --allow-unrelated-histories //把远程仓库和本地同步,消除差异