社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
之前总结了下Git版本库的创建和基本操作,里面涉及最多的概念,其中理解HEAD和master对于我们后面的远程操作Git远程版本库很有帮助,Git 中很多对象(比如提交、文件内容、tree)等都是用40位的SHA1码表示的,并且都是保存在版本库的objects目录下,可以这么理解每一次的提交都是对应着一个SHA1码,版本库内部也是通过SHA1 互相联系起来的。
下图是Git对象库的内部关系图,通过提交(commit)对象之间的相互关联,可以识别出一条跟踪链,运行git log –pretty=raw –graph
最后一个提交没有parent属性说明这是提交的起点。
//查看该SHA1码的类型-t
git cat-file -t 8e9575d54a4ed54e5e7a45bb
//查看所指向的内容 -p
git cat-file -p 8e9575d54a4ed54e5e7a45bb
每一次提交都会生成一个40位的SHA1码,使用git cat-file -t sha1码查看类型显示为commit则代表某一次提交;显示为tree的则是代表实质的文件内容或者多个文件对应的SHA1码
所有这些对象都是保存在版本库里的objects目录下(id的前2位作为子目录名,后38位作为文件名形如.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a)
先使用cat 命令查看下HEAD的内容
可以看到HEAD 的内容就是指向refs/heads/master,而refs/heads/master的内容又是保存了一个SHA1码,这个SHA1码刚好又是指向最新的提交。HEAD指向的是HEAD指向的是当前版本库的最近一次提交,而 master 指向master分支中的最新提交Id,全称refs/heads/master
在当前版本库下他们的指向是相同的,如下图
所以真实的版本库结构应该如下图
Git版本库中.git/refs 是保存引用命名空间的,其中.git/refs/heads目录下的引用称为分支。
$ git rev-parse master
$ git rev-parse refs/heads/master
$ git rev-parse HEAD
远程操作的第一步——远程仓库克隆一个版本库到本地
/*该命令会在本地主机生成一个目录,与远程版本库同名*/
$ git clone <版本库的网址>
比如,克隆jQuery的版本库。
$ git clone https://github.com/jquery/jquery.git
如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
$ git clone <版本库的网址> <本地目录名>
克隆版本库的时候,所使用的远程版本库自动被Git命名为origin。如果想用其他的版本库名,需要用git clone命令的-o选项指定。
//克隆的时候,指定远程版本库叫做jQuery
$ git clone -o jQuery https://github.com/jquery/jquery.git
git clone支持SSH、Git、本地文件等协议等,其中Git协议下载速度最快,SSH协议用于需要用户认证的场合
$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/
Git要求每个远程版本库都必须指定一个名字。
$git romote//不带选项的时候,git remote命令列出所有远程版本库。
/*使用-v选项,可以查看远程版本库的网址。*/
$ git remote -v
origin git@github.com:jquery/jquery.git (fetch)
origin git@github.com:jquery/jquery.git (push)
上面命令表示,当前只有一个远程版本库,叫做origin和它的网址。
$ git remote show <版本库名>
$ git remote add <版本库名> <网址>
$ git remote rm <版本库名>
$ git remote rename <原版本库名> <新版本库名>
$ git fetch <远程版本库名>
$ git fetch <远程版本库名> <分支名>
比如取回origin版本库的master分支
$ git fetch origin master
所取回的更新,在本地主机上要用”远程版本库名/分支名”的形式读取。比如origin版本库的master,就要用origin/master读取。
git branch命令的-r选项用来查看远程分支,-a选项查看所有分支。
/*
本地主机的当前分支是master,远程分支是origin/master。
*/
$ git branch -r
origin/master
$ git branch -a
* master
remotes/origin/master
取回远程版本库的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。
/*在origin/master的基础上,创建一个新分支newBrach*/
$ git checkout -b newBrach origin/master
也可以使用git merge命令,在本地分支上合并远程分支。
/*
合并origin/master分支到当前分支
*/
$ git merge origin/master
$ git pull <远程主机名> <远程分支名>:<本地分支名>
//取回origin版本库的test分支,与本地的master分支合并
$ git pull origin test:master
//远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin test
Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,即本地的master分支自动”追踪”origin/master分支。Git也允许手动建立追踪关系。
//指定master分支追踪origin/test分支
git branch --set-upstream master origin/test
追踪的作用在于:当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名
//本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
$ git pull origin
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
//当前分支自动与唯一一个追踪分支进行合并。
$ git pull
$ git push <远程主机名> <本地分支名>:<远程分支名>
//将本地的master分支推送到origin的master分支。如果后者不存在,则会被新建
$ git push origin master
$ git push origin :master
这两条命令是等价的,表示删除origin主机的master分支。
$ git push origin --delete master
$ git push
$ git push -u origin master
就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项。
//将所有本地分支都推送到origin主机。
$ git push --all origin
如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机
git checkout [options] <branch>
git checkout [options] [<branch>] -- <file>...
//git checkout命令加上-b参数表示创建并切换
$ git checkout -b newbranch
Switched to a new branch 'newbranch'
等价以下两条命令
$ git branch newbranch
$ git checkout newbranch
Switched to branch 'newbranch'
这相当于是取消掉git add filename 以来(如果做过)的本地修改。而且是悄无声息地对本地工作区的修改,无法确认。
/*这个命令把分支"branchname"合并到了当前分支里面*/
$ git merge branchname
所谓分支,可以看成副本,可以分为远程分支和本地分支,但无论是远程还是本地分支使用都是大同小异的,默认情况下我们没有建立新的分支的时候,Git自动为我们创建的就是master(即分支名为master),所以我们执行的一切操作git add /commit/checkout都是针对当前分支的,但是我们通过git branch -b newBranchName创建并切换到新的分支newBranchName,此时我们git add /commit 操作在没有执行merge之前,都只是针对newBranchName分支的,master的分支并没有改变,简单来说你可以通过git checkout branchName来切换,这样就相当于是有了两个副本。
Fast-forward即这次合并是“快进模式”,也就是直接把master指向dev的当前提交.
当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并
超级简单的操作把本地项目发布到Git远程库进行版本管理,分为两种方式
这种方式就是你的项目开发还未正式开始编码工作,直接把远程库关联到本地,步骤很简单
这种方式就是你把你本地项目关联到远程Git库,纳入项目管理
Git使用https方式进行连接时,默认每次推送时都要输入用户名和密码。 可以使用下面这条命令为当前仓库设置记住密码,设置后,只要在推送一次,以后就不需要用户名和密码了 只要运行后,下次push、pull的时候再输入一次密码,git就会记住啦!
git config credential.helper store
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!