Git学习笔记(四)——分支管理和远程操作 - Go语言中文社区

Git学习笔记(四)——分支管理和远程操作


引言

之前总结了下Git版本库的创建和基本操作,里面涉及最多的概念,其中理解HEAD和master对于我们后面的远程操作Git远程版本库很有帮助,Git 中很多对象(比如提交、文件内容、tree)等都是用40位的SHA1码表示的,并且都是保存在版本库的objects目录下,可以这么理解每一次的提交都是对应着一个SHA1码,版本库内部也是通过SHA1 互相联系起来的。

一、Git对象库

1、Git对象之间的联系

这里写图片描述
下图是Git对象库的内部关系图,通过提交(commit)对象之间的相互关联,可以识别出一条跟踪链,运行git log –pretty=raw –graph
这里写图片描述
最后一个提交没有parent属性说明这是提交的起点。

2、使用git cat-file

 //查看该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)

3、HEAD和master

先使用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目录下的引用称为分支

4、git rev-parse根据引用显示出对应的提交Id

$ git rev-parse master
$ git rev-parse refs/heads/master
$ git rev-parse HEAD

二、Git远程操作详解

这里写图片描述

1、克隆远程仓库至本地git clone

远程操作的第一步——远程仓库克隆一个版本库到本地

/*该命令会在本地主机生成一个目录,与远程版本库同名*/
$ 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/

2、管理远程版本库 git remote

Git要求每个远程版本库都必须指定一个名字。

2.1、查看远程版本库列表

$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和它的网址。

2.2、可以查看指定版本库的详细信息。

$ git remote show <版本库名>

2.3、git remote add命令用于添加远程版本库

$ git remote add <版本库名> <网址>

2.4、git remote rm命令用于删除远程版本库。

$ git remote rm <版本库名>

2.5、git remote rename命令用于远程版本库的改名。

$ git remote rename <原版本库名> <新版本库名>

3、git fetch把远程版本库的commit,取回本地版本库

3.1、将某个远程版本库的更新,全部取回本地

$ git fetch <远程版本库名>

3.2、指定分支名只取回特定分支的更新

$ 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

4、取回远程版本库某个分支的更新,再与本地的指定分支合并 git pull

$ git pull <远程主机名> <远程分支名>:<本地分支名>

4.1、取回远程版本库的分支并与本地分支合并

//取回origin版本库的test分支,与本地的master分支合并
$ git pull origin test:master
//远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin test

4.2、在远程分支和本地之间建立追踪关系

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

5、将本地分支的更新,推送到远程版本库并与远程版本库指定分支合并git push

$ git push <远程主机名> <本地分支名>:<远程分支名>

5.1、若省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),若该远程分支不存在,则会被新建。

//将本地的master分支推送到origin的master分支。如果后者不存在,则会被新建
$ git push origin master

5.2、若省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

$ git push origin :master

这两条命令是等价的,表示删除origin主机的master分支。

$ git push origin --delete master

5.3、若当前分支只有一个追踪分支,那么主机名都可以省略。

$ git push

5.4、若当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。

$ git push -u origin master

就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项。

//将所有本地分支都推送到origin主机。
$ git push --all origin

如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机

6、git checkout检出重写工作区

这里写图片描述

git checkout [options] <branch>
git checkout [options] [<branch>] -- <file>...

6.1、git checkout -b创建新的分支并切换到新的分支

//git checkout命令加上-b参数表示创建并切换
$ git checkout -b newbranch
Switched to a new branch 'newbranch'

等价以下两条命令

$ git branch newbranch
$ git checkout newbranch
Switched to branch 'newbranch'

6.2、git checkout (git checkout HEAD)汇总显示工作区、暂存区和HEAD的区别

6.3、git checkout –filename用暂存区的文件覆盖掉工作区的文件

这相当于是取消掉git add filename 以来(如果做过)的本地修改。而且是悄无声息地对本地工作区的修改,无法确认。

6.4、git checkout branchname –filename用指定分支的提交覆盖掉暂存区的文件和工作区的文件

7、git merge 合并分支

/*这个命令把分支"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来切换,这样就相当于是有了两个副本。

1、创建新的分支并切换至新的分支

这里写图片描述

2、把当前修改add并提交至新的分支

这里写图片描述

3、切回master分支并合并至master分支

这里写图片描述
Fast-forward即这次合并是“快进模式”,也就是直接把master指向dev的当前提交.

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并

4、合并成功之后删掉新建的分支

这里写图片描述

四、简单实例操作

超级简单的操作把本地项目发布到Git远程库进行版本管理,分为两种方式

1、Create a new repository

这种方式就是你的项目开发还未正式开始编码工作,直接把远程库关联到本地,步骤很简单

  • git clone http://xxxx/xxxx/RD013_Softwareupper.git 其实这一步执行完毕就已经把本地项目纳入到远程库了
  • cd RD013_Softwareuppertouch README.md 这是编辑README.md,下面的步骤就是普通的add、commit、push操作
  • git add README.md
  • git commit -m”add README”
  • git push -u origin master

2、Existing folder or Git repository

这种方式就是你把你本地项目关联到远程Git库,纳入项目管理

PS

Git使用https方式进行连接时,默认每次推送时都要输入用户名和密码。 可以使用下面这条命令为当前仓库设置记住密码,设置后,只要在推送一次,以后就不需要用户名和密码了 只要运行后,下次push、pull的时候再输入一次密码,git就会记住啦!

git config credential.helper store
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/CrazyMo_/article/details/50895785
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-06 09:57:05
  • 阅读 ( 1843 )
  • 分类:研发管理

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢