Git基础:分支管理及远程仓库
分支管理
廖雪峰:
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。
如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
分支管理使得多人协作开发代码的时候,不需要频繁地相互之间同步代码,每个人可以在自己的分支上安心的开发自己的功能,随时都可以提交到自己的分支,等到功能开发完成的时候,再一次性合并到主分支。这样,既安全,又高效,还不影响其他人的工作,体现了分布式版本管理系统的优势。
准备工作
为了方便展示分支管理的效果,我们创建一个仓库,并且进行三次提交。
- 创建文件
file.txt并进行第一次提交 - 在文件中输入信息
first line并进行第二次提交 - 在文件中追加信息
second line并进行第三次提交
查看提交信息:
E:\repository>git log --oneline
4bdd05b (HEAD -> master) write the second line
76e96c6 write the first line
3dbe8cf create new file
用图形化的方式在展示提交记录,如下图所示:
创建分支
通过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
如图所示:
至此,我们已经成功的创建并且切换到了新的分支。
在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(-)
新的分支如图所示:
此时,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的文件内容粘贴进去:
最后,点击确定,即可看到刚才添加的Key。
关联仓库
如果我们现在已经有了一个本地仓库,名为gaffe,需要将其关联到Gitee中的一个远程仓库上。
首先,我们需要创建一个远程仓库,点击页面右上角"+"->菜单"新建仓库",在跳转的页面中填入相关信息(项目名称最好与本地仓库名一致),最后点击创建即可:
然后在本地仓库上使用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 fetch与git merge合为了一条,将远程仓库的某个分支的更新取回,并于本地指定的分支合并:
git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略:
git pull origin next