您的位置:首页 > 其它

Git的基本命令及原理

2015-11-11 18:34 253 查看
Git是一个分布式版本控制系统,它的优越性在于跟踪并管理的是修改,而非文件;同时是分布式的,在本地工作完全不需要考虑远程库的存在,不联网也可以正常工作,当有网络的时候,再把本地提交推送一下就完成了同步。比集中式版本控制系统如svn方便了许多。

[1]建目录

 (a)选择一个合适的地方,创建一个空目录:$ mkdir mygit

 (b)通过git init命令把这个目录变成Git可以管理的仓库:$ git init

 瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),当前目录下多了一个.git的隐藏目录,这个目录是Git来跟踪管理版本库的。

[2]提交文件(必须放在创建的仓库目录或子目录下)

 (a)git add 把文件添加到仓库:$ git add readme.txt   

 (b)git commit把文件提交到仓库:$ git commit -m "wrote a readme file"

  可反复多次使用,添加多个文件;一次提交。

  原理:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。如图:



git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

$ git commit -m "understand how stage works"

[master 27c9860] understand how stage works

 2 files changed, 675 insertions(+)

 create mode 100644 LICENSE

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:

$ git status

# On branch master

nothing to commit (working directory clean)

[3]撤消修改

Git中每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。注意--后有一空格

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时

 (a)用命令git reset HEAD file,就回到了场景1

 (b)按场景1操作。

场景3:从暂存区提交到了版本库,但还没有把自己的本地版本库推送到远程,版本回退

(a)查看历史记录:$ git log,显示从最近到最远的提交日志

(b)加参数: $ git log --pretty=oneline 只显示版本号和说明

 说明:版本号是一个SHA1计算出来的十六进制数。因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,为防止冲突,不用1,2,3……作为版本号。

  在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上第N个版本写成HEAD~N

(c)回退到上一个 $ git reset --hard HEAD^

(d)撤消回退/或者跳转到其它历史版本 $ git reset --hard 版本号 

   版本号只显示前几个就可以

   要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本

原理:

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向上一个版本:

[4]删除文件

当文件管理器中的文件删除后,工作区和版本库不一致

 (a)从版本库中删除该文件 $ git rm file

 (b)把工作区误删的文件恢复到最新版本$ git checkout -- file

  git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。但只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

[5]远程仓库

  GitHub是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

  由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,需设置:

第1步:创建SSH Key。打开Shell(Windows下打开Git Bash),输入

$ ssh-keygen -t rsa -C "youremail@example.com"

之后可在用户主目录里找到.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文件的内容:

点“Add Key”,你就应该看到已经添加的Key:

原理:GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。GitHub允许你添加多个Key。但在GitHub上免费托管的Git仓库,不加密任何人可见。

解决方法一:用收费服务,让GitHub把公开的仓库变成私有的。

方法二:搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。

[6]关联远程库

关联一个远程库,$ git remote add origin git@server-name:path/repo-name.git;

关联后,$ git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,用$ git push origin master推送最新修改;

[7]克隆

要克隆一个仓库,首先必须知道仓库的地址,然后使用$ git clone 仓库地址

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息