Linux下Git远程仓库GitHub、分支管理和标签管理笔记

2 篇文章 0 订阅

1. 远程仓库

  最基本的是要我们请自行注册自己的GitHub账号,由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
  第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

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

  然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
  如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
在这里插入图片描述
在这里插入图片描述

第2步:登陆GitHub,打开“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
在这里插入图片描述
然后点Add SSH Key,然后就能看到自己已经添加的Key:
在这里插入图片描述

提示:在GitHub上免费托管的Git仓库,任何人都可以看到(但只有你自己才能改)。所以,不要把敏感信息放进去。

1.1 添加远程库

  如果你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
首先,登陆GitHub,然后,在右上角找到“New repository”按钮,创建一个新的仓库:
在这里插入图片描述  在Repository name填入名字git,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
在这里插入图片描述  目前,在GitHub上的这个git仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

现在,我们根据GitHub的提示,在本地的git仓库下运行命令:

$ git remote add origin https://github.com/账户名/git.git

把上面的账户名替换成自己的GitHub的账户名。

  添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

下一步,就可以把本地库的所有内容推送到远程库上:

$ git push -u origin master

然后就是各种确定,和弹出网页,成功的结果:
在这里插入图片描述在这里插入图片描述  把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
  由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

总结

  • 要关联一个远程库,使用命令git remote add origin https://github.com/账户名/git.git
  • 关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
  • 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

1.2 从远程库克隆

下面介绍先创建远程库,然后,从远程库克隆的步骤。

首先,登陆GitHub,创建一个新的仓库,名字叫gitskills

在这里插入图片描述我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件:
在这里插入图片描述现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:

$ git clone https://github.com/账户名/gitskills.git

在这里插入图片描述

然后进入gitskills目录看看,已经有README.md文件了:
在这里插入图片描述
如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。

小结

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

2. 分支管理

  如果你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人(你的团队)工作。

2.1 分支的创建与合并

  在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

  一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
在这里插入图片描述
  每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
  当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
在这里插入图片描述
  Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
  不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
在这里插入图片描述
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
在这里插入图片描述
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
在这里插入图片描述


下面开始实战。
首先,我们创建dev分支,然后切换到dev分支

$ git checkout -b dev

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev

然后,用git branch命令查看当前分支:

$ git branch

git branch命令会列出所有分支,当前分支前面会标一个*号。
在这里插入图片描述


然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

Creating a new branch is quick.

然后提交:

$ git add readme.txt 
$ git commit -m "branch test"

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master

在这里插入图片描述
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
在这里插入图片描述


现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev

在这里插入图片描述git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

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

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev

删除后,查看branch,就只剩下master分支了:
在这里插入图片描述因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

实际上,切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:

创建并切换到新的dev分支,可以使用:

$ git switch -c dev

直接切换到已有的master分支,可以使用:

$ git switch master

使用新的git switch命令,比git checkout要更容易理解。

小结
Git鼓励大量使用分支:

  • 查看分支:git branch
  • 创建分支:git branch <name>
  • 切换分支:git checkout <name>或者git switch <name>
  • 以上两步可以合并成一步:创建+切换分支:git checkout -b <name>或者git switch -c <name>
  • 提交:add + commit -m
  • 切换回master分支:git checkout master
  • 合并某分支到当前分支:git merge <name>
  • 删除分支:git branch -d <name>

2.2 解决冲突

准备新的feature1分支,继续我们的新分支开发:

$ git switch -c feature1

修改readme.txt最后一行,改为:

Creating a new branch is quick AND simple.

feature1分支上提交:

$ git add readme.txt
$ git commit -m "AND simple"

切换到master分支:

$ git switch master

master分支上把readme.txt文件的最后一行增加:

Creating a new branch is quick & simple.

提交:

$ git add readme.txt 
$ git commit -m "ad & simple"

现在,master分支和feature1分支各自都分别有新的提交,变成了这样:
在这里插入图片描述
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:

$ git merge feature1

在这里插入图片描述
显示冲突了,Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
在这里插入图片描述
在前一张图片中可以看到readme.txt的内容发生了改变,Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存再提交:
在这里插入图片描述
  此处修改是跟分支对比之后,修改当前文件为我们想要他最终的结果,而不是我们修改了才能提交,不是这样的,此处仅仅是合并失败,Git不知道我们最终版本是哪个才报的错误。

现在,master分支和feature1分支变成了下图所示:
在这里插入图片描述用带参数的git log也可以看到分支的合并情况:

$ git log --graph --pretty=oneline --abbrev-commit

在这里插入图片描述最后,删除feature1分支:

$ git branch -d feature1

小结
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
git log --graph命令可以看到分支合并图。


2.3 分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

下面我们实战一下--no-ff方式的git merge

首先,仍然创建并切换dev分支,修改readme.txt文件,并提交一个新的commit,切换回master,准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去,合并后,我们再用git log看看分支历史:
在这里插入图片描述
可以看到,不使用Fast forward模式,merge后就像这样:
在这里插入图片描述
小结
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。


2.4 Bug分支

有了bug就需要修复,在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,而你当前正在dev上进行的工作还没有提交,但又必须首先处理bug该怎么办,这时需要git stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
首先我们在dev上进行工作,工作内容是:
在这里插入图片描述
这时候需要修复一个bug,在第二行加上冠词”a“,此时我们的工作还未完成,我们先用git stash命令保存一下当前的工作:
在这里插入图片描述现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

假定需要在master分支上修复,就从master创建临时分支然后修复、提交、合并:
在这里插入图片描述
修改的bug为:
在这里插入图片描述修复工作完成之后切换回dev分支,发现我们stash之前的工作不见了:
在这里插入图片描述在这里插入图片描述
这时只需git stash list命令看看,然后找到自己的分支现场用git stash apply恢复就好了:
在这里插入图片描述工作现场又恢复了:
在这里插入图片描述但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
在这里插入图片描述在这里插入图片描述
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

$ git stash apply stash@{0}

删除的时候也是:

$ git stash drop stash@{0}

但是有一点我们发现,我们之前在master上修复的bug,在dev上当然也是存在的,现在我们提供一种方法,把在master上修复bug时候的提交,“复制”到dev上去,注意是a61d220 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

git cherry-pick命令,让我们能复制一个特定的提交到当前分支。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
dev的bug也修复了!

小结

  1. 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
  2. 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
  3. 在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

2.5 Feature分支

  1. 在项目中开发一个新feature,最好新建一个分支,在分支上进行开发然后再合并到主项目中去。
  2. 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <分支name>强行删除。

2.6 多人协作

查看远程库信息,使用git remote -v
本地新建的分支如果不推送到远程,对其他人就是不可见的;

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

2.7 Rebase

查看远程分支同步合并历史信息有时会显示很乱,

Git提供一种提交历史变成一条干净的直线的方法:变基rebase

rebase操作可以把本地未push的分叉提交历史整理成直线;

rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

3. 标签管理

tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

3.1 创建标签

打标签方式:
切换到需要打标签的分支上,敲命令git tag <name>就可以打一个新标签,可以用命令git tag查看所有标签,默认标签是打在最新提交的commit上的
在这里插入图片描述
也可以选定commit id进行打标签:

$ git tag <标签name> <commit id>

在这里插入图片描述注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:
在这里插入图片描述还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -a <标签name> -m "说明" <commit id>

在这里插入图片描述小结:

  • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id
  • 命令git tag -a <tagname> -m "说明" <commit id> 可以指定标签信息;
  • 命令git tag可以查看所有标签。

3.2 操作标签

如果标签打错了,也可以删除:

$ git tag -d <tagname>

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

如果要推送某个标签到远程,使用命令git push origin <tagname>,或者,一次性推送全部尚未推送到远程的本地标签git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

$ git tag -d <tagname>

然后,从远程删除。删除命令也是push,但是格式如下:

$ git push origin :refs/tags/<tagname>

小结

  • 命令git push origin <tagname>可以推送一个本地标签;
  • 命令git push origin --tags可以推送全部未推送过的本地标签;
  • 命令git tag -d <tagname>可以删除一个本地标签;
  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值