Git基础:分支管理及远程仓库

236 阅读6分钟

Git基础:分支管理及远程仓库

分支管理

廖雪峰:

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

分支管理使得多人协作开发代码的时候,不需要频繁地相互之间同步代码,每个人可以在自己的分支上安心的开发自己的功能,随时都可以提交到自己的分支,等到功能开发完成的时候,再一次性合并到主分支。这样,既安全,又高效,还不影响其他人的工作,体现了分布式版本管理系统的优势。

准备工作

为了方便展示分支管理的效果,我们创建一个仓库,并且进行三次提交。

  1. 创建文件file.txt并进行第一次提交
  2. 在文件中输入信息first line并进行第二次提交
  3. 在文件中追加信息second line并进行第三次提交

查看提交信息:

E:\repository>git log --oneline
4bdd05b (HEAD -> master) write the second line
76e96c6 write the first line
3dbe8cf create new file

用图形化的方式在展示提交记录,如下图所示:

1.png

创建分支

通过git switch -c或者git checkout -b均可创建新的分支,我们创建并切换到dev分支:

E:\repository>git switch -c dev
Switched to a new branch 'dev'
# 或者
E:\repository>git checkout -b dev
Switched to a new branch 'dev'

以上的一条命令相当于以下两条命令:

E:\repository>git branch dev
E:\repository>git switch dev
Switched to branch 'dev'

然后用git branch命令查看所有的分支,在当前分支的前面会标有一个*号:

E:\repository>git branch
* dev
  master

如图所示:

2.png

至此,我们已经成功的创建并且切换到了新的分支。

file.txt文件中追加新的内容content from dev,并进行新的提交:

E:\repository>git add .
E:\repository>git commit -m "dev commit"
[dev 4bc2e50] dev commit
 1 file changed, 2 insertions(+), 1 deletion(-)

新的分支如图所示:

3.png

此时,file.txt里的内容为:

first line
second line
content from dev

其中,前两行是来自master分支的提交内容,第三行是在新的分支dev上产生的提交。

切换分支

通过git switch命令可以切换分支

E:\repository>git switch master
Switched to branch 'master'

查看文件内容:

first line
second line

再切换回dev分支:

E:\repository>git switch dev
Switched to branch 'dev'

再次查看文件内容:

first line
second line
content from dev

至此,分支管理的强大功能已经体现出来了,不同分支上有不同的内容,多人协作时可以安心的在自己的分支上尽情的开发。

合并分支

先切换到master

E:\repository>git switch master
Switched to branch '`master`'

E:\repository>git merge dev
Updating 4bdd05b..4bc2e50
Fast-forward
 file.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

git merge命令将指定分支合并到当前分支

删除分支

由于我们已经将dev分支上的内容合并到了master当中,因此我们可以将dev分支删除了。git branch -d命令用于删除分支:

E:\repository>git branch -d dev
Deleted branch dev (was 4bc2e50).

再次查看分支,就只剩下master分支了:

E:\repository>git branch
* master

小结

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

远程仓库

常见的远程仓库服务器对比:

  • GitHub:国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况。
  • GitLab:类似GitHub,一般用于在企业内搭建私服,要自己搭环境。
  • Gitee:即码云,国内访问友好,不用自己搭建环境,可以建立自己的私有仓库。

因此,我们选择Gitee作为演示的远程仓库。

生成SSH公钥-私钥对

通过ssh-keygen -t rsa命令即可生公钥-私钥对,无特殊要求的情况下一路回车即可。生成的公钥-私钥对在用户目录.ssh文件夹中。其中私钥文件名为id_rsa,公钥文件名为id_rsa.pub

上传SSH公钥

无论是使用GitHub还是Gitee,都需要在注册账号并登录后,上传自己的SSH公钥。选择右上角用户头像->菜单"设置",然后选择"SSH"公钥,填写便于记忆的标题,然后将id_rsa.pub的文件内容粘贴进去:

4.png

最后,点击确定,即可看到刚才添加的Key。

关联仓库

如果我们现在已经有了一个本地仓库,名为gaffe,需要将其关联到Gitee中的一个远程仓库上。

首先,我们需要创建一个远程仓库,点击页面右上角"+"->菜单"新建仓库",在跳转的页面中填入相关信息(项目名称最好与本地仓库名一致),最后点击创建即可:

5.png

然后在本地仓库上使用git remote add就可以关联到远程仓库了:

git remote add origin https://gitee.com/<username>/gaffe.git

如果在使用命令git remote add时报错:

E:\gaffe>git remote add origin https://gitee.com/<username>/gaffe.git
fatal: remote origin already exists.

说明本地库已经关联了一个名叫origin的远程库了,可以先用git remote -v查看远程库信息:

E:\gaffe>git remote -v
origin  https://github.com:<username>/gaffe.git (fetch)
origin  https://github.com:<username>/gaffe.git (push)

可以看到,本地库已经关联了origin的远程库,并且指向Github

我们可以删除已经绑定的远程仓库地址,并且重新绑定:

E:\gaffe>git remote rm origin

E:\gaffe>git remote -v

E:\gaffe>git remote add origin https://gitee.com/<username>/gaffe.git

E:\gaffe>git remote -v
origin  https://gitee.com/<username>/gaffe.git (fetch)
origin  https://gitee.com/<username>/gaffe.git (push)

现在可以看到,origin已经成功关联到Gitee的远程仓库了。

**能不能同时关联多个远程仓库呢?**答案是肯定的!

我们在Gitee中再新建一个名为other-gaffe的仓库,并且在本地通过git remote add命令添加新的远程仓库:

E:\gaffe>git remote add other https://gitee.com/<username>/other-gaffes.git

E:\gaffe>git remote -v
origin  https://gitee.com/<username>/gaffe.git (fetch)
origin  https://gitee.com/<username>/gaffe.git (push)
other   https://gitee.com/<username>/other-gaffes.git (fetch)
other   https://gitee.com/<username>/other-gaffes.git (push)

成功关联后,通过git remote -v可以看到全部的关联情况。这样一来,我们的本地库就可以同时与多个远程库相互同步了。

代码推送

通过git push 命令可以将本地仓库的分支版本推送到远程仓库并合并:

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

如果本地分支名与远程分支名相同,则可以省略冒号:

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

如果本地版本与远程版本有差异,但又要强制推送可以使用--force参数:

git push --force origin master

删除主机的分支可以使用--delete参数,以下命令表示删除 origin 主机的 master 分支:

git push origin --delete master

代码拉取

通过git fetch命令可以从远程仓库获取全部内容。

git fetch <远程主机名>

仅获取某一个分支的更新,可以指定分支名

git fetch <远程主机名> <分支名>

git pull的命令等于将两条命令git fetchgit merge合为了一条,将远程仓库的某个分支的更新取回,并于本地指定的分支合并:

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

如果远程分支是与当前分支合并,则冒号后面的部分可以省略:

git pull origin next