Git–版本控制器学习(二)
文章目录
前言
git:版本控制器,记录每次的修改及版本迭代的一个管理系统,可以控制电脑上所有格式的文档,对于开发人员来说,可控制项目中的源代码文档。
环境:Linux-centos7.6
一、Git远程操作
1 何为分布式版本管理系统
在上一篇文章 Git–版本控制器学习(一)中所涉及到的所有内容,即工作区、暂存区、版本库等,实际上的操作都是在本地进行的,即在用户笔记本或计算机上。
Git实际上是分布式管理系统。
简单理解为,每个人的电脑上都是一个完整的版本库,当自己在工作的时候就不用联网,因为版本库就在自己的电脑上。那每人的电脑上都有一个版本库,那多人该如何协作?
当你在自己的电脑上修改了文件file,团队伙伴小明也在自己的电脑上对文件file进行了修改,你们两个之间只需将各自的修改推送给对方,这样就可以看到没人各自的修改。
分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其它人那里复制一个就可以了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了。也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。有了这个“中央服务器”的电脑,这样就不怕本地出现什么故障了(比如硬盘坏了,上面的所有东西全部丢失,包括git的所有内容)。
参考文章:什么是分布式系统,这么讲不信你不会
2 远程仓库
Git是分布式管理系统,同一个git仓库,可以分布在不同的机器上。那该如何分配?
最早初始,只有一台机器有一个原始的版本库,之后别的机器都可以克隆这个原始版本库,且每台机器上的版本库是一样的,并无主次之分。
实际上,找一台机器充当服务器的角色,每天一直开机,其它人都从该“服务器”仓库克隆一份到自己的电脑上,且各自把各自的提交推送到服务器仓库里,也从该服务器上拉取别人的提交。
实际上,这样的服务器已经存在,如GitHub和Gitee,其中GitHub是国外的网站,访问速度慢,所以我们使用码云来托管代码。
2.1 新建远程仓库
Gitee官网
① 新建仓库。
② 填写仓库的基本信息。
③ 创建成功后可按个人是否将仓库设置为公有或是私有。
从创建好的远程仓库中可以看到,刚创建好的远程仓库中有且默认只有一个master分支,由此可知,在本地所学的分支也存在于远程仓库中并被管理起来。
2.2 克隆远程仓库
★ 克隆远程仓库
git clone
★ 查看远程仓库的信息
git remote
//-v选项:查看更详细信息
git remote -v
git clone
命令后跟上远程仓库的链接,便可将远程仓库克隆到本地中。
远程仓库链接:
其中SSH协议和HTTPS协议是git最常用的两种协议。
SSH协议使用了公钥加密和公钥登录机制,体现了实用性和安全性。使用此协议需要将公钥放在服务器,由git服务器进行管理。
使用https时并无要求,可以直接克隆下来。
(1)使用HTTPS方式进行克隆。
[dev@localhost ~]$ git clone https://gitee.com/confused-cat/git_test.git
正克隆到 'git_test'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
[dev@localhost ~]$ ls
gitcode
git_test
[dev@localhost ~]$ ls git_test/
README.en.md README.md
(2)使用SSH方式进行克隆。
[dev@localhost ~]$ git clone git@gitee.com:confused-cat/git_test.git
正克隆到 'git_test'...
The authenticity of host 'gitee.com (180.76.198.77)' can't be established.
ECDSA key fingerprint is 27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,180.76.198.77' (ECDSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
我们看到,服务器拒绝了我们的clone链接,因为我们并没有添加公钥到远程库中去。此时就需要设置一下。
- 创建SSH Key。
在用户主目录下,查看是否存在.ssh
目录,若存在则查看是否存在id_rsa
和id_rsa.pub
这两个文件,若存在则直接跳到下一步。若没有则需要创建。
//输入绑定邮箱,一路回车,使用默认值即可
[dev@localhost ~]$ ssh-keygen -t rsa -C "2155598746@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dev/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/dev/.ssh/id_rsa.
Your public key has been saved in /home/dev/.ssh/id_rsa.pub.
The key fingerprint is:
97:de:d5:48:c4:4d:be:db:e5:7b:db:1c:56:dd:45:92 2155598746@qq.com
The key's randomart image is:
+--[ RSA 2048]----+
| .o+o|
| .E+.|
| . o|
| . . o=|
| S o o.*|
| o . . .=|
| . . +o|
| ..=|
| o=|
+-----------------+
[dev@localhost ~]$ ls -a .ssh/
. .. id_rsa id_rsa.pub known_hosts
找到.ssh
目录和其目录下id_rsa
和id_rsa.pub
两个文件。此两个文件就是SSH Key的密钥对,id_rsa
是私钥,id_rsa.pub
是公钥。
- 添加公钥到远程仓库。
[dev@localhost ~]$ git clone git@gitee.com:confused-cat/git_test.git
正克隆到 'git_test'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (7/7), done.
[dev@localhost ~]$ ls
gitcode
git_test
[dev@localhost ~]$ ls ./git_test
README.en.md README.md
仓库克隆成功。
在多人协作开发的过程中,GitHub和Gitee允许添加多个公钥,如此,只要把每个人电脑上的Key都添加到GitHub/Gitee中,这样每台电脑都可以往GitHub/Gitee上提交推送。
当我们从远程仓库克隆后,实际上,git会自动把本地的master分支和远程的master分支对应起来,其中,远程仓库默认名称是origin
。
[dev@localhost git_test]$ git remote
origin
[dev@localhost git_test]$ git remote -v
origin git@gitee.com:confused-cat/git_test.git (fetch)
origin git@gitee.com:confused-cat/git_test.git (push)
2.3 向远程仓库推送
当本地已经clone
成功远程仓库后,便可以向仓库中提交内容。
★ 将本地仓库内容推送到远程仓库
git push
实例:向仓库中新增一个hello.txt文件。
//新建文件
[dev@localhost git_test]$ ls
README.en.md README.md
[dev@localhost git_test]$ vim hello.txt
[dev@localhost git_test]$ cat hello.txt
hello git!
//提交文件
[dev@localhost git_test]$ git add .
[dev@localhost git_test]$ git commit -m "create hello.txt"
[master d22709e] create hello.txt
Committer: dev <dev@localhost.localdomain>
您的姓名和邮件地址基于登录名和主机名进行了自动设置。请检查它们正确
与否。您可以通过下面的命令对其进行明确地设置以免再出现本提示信息:
git config --global user.name "Your Name"
git config --global user.email you@example.com
设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:
git commit --amend --reset-author
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
可以看到,出现了错误,因为并没有设置全局的name和e-mail,按照提示进行全局配置,其中这两项配置需要和Gitee上一致。配置完后重新提交。
[dev@localhost git_test]$ git commit -m "create hello.txt"
# 位于分支 master
# 您的分支领先 'origin/master' 共 1 个提交。
# (使用 "git push" 来发布您的本地提交)
#
无文件要提交,干净的工作区
这样。已经将内容提交到本地仓库中,然后将本地仓库内容推送到远程仓库中,git push
命令用于将本地的分支版本上传到远程并合并。
格式:
git push [远程主机名] [本地分支名]:[远程分支名]
//远程分支名和本地分支名相同
git push [远程主机名] [本地分支名]
将本地的master分支推送到origin主机的master分支。
[dev@localhost git_test]$ git push origin master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 278 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
94d444c..d22709e master -> master
当使用SSH协议的时候,是不用每次都输入账号密码的,当使用的是HTTPS协议时,每次推送都需要输入密码。
2.4 拉取远程仓库
当远程仓库是领先于本地仓库的版本,为了使本地仓库保持最新的版本,需要拉取下远端代码,并合并到本地。
★ 从远程获取代码并合并到本地
git pull
格式:
git pull [远程主机名] [本地分支名]:[远程分支名]
//远程分支名和本地分支名相同
git pull [远程主机名] [本地分支名]
实例:gitee上修改README.md文件并进行在线修改。
git pull
命令将远程所做修改拉取到本地上,并与当前分支进行合并。
[dev@localhost git_test]$ git pull origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
来自 gitee.com:confused-cat/git_test
* branch master -> FETCH_HEAD
更新 d22709e..51761d8
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)
[dev@localhost git_test]$ tail -1 README.md
###第一次修改内容###
3 配置git
3.1 忽略特殊文件
在开发过程中,有些文件是没有必要进行提交到远端的,git工作区的根目录下创建了一个特殊的文件.gitignore
,只需将要忽略的文件名填进去,git就会自动忽略这些文件或文件夹。
git在创建仓库时为我们生成了该文件,只需勾选即可,若无该选项,也可以在工作区创建一个。
实例:将.so
和.ini
和.a
为后缀名的所有文件都忽略掉。
[dev@localhost git_test]$ vim .gitignore
[dev@localhost git_test]$ cat .gitignore
#My configurations:
*.ini
*.so
*.a
[dev@localhost git_test]$ git add .
[dev@localhost git_test]$ git commit -m "add gitignore"
[master ee1fb43] add gitignore
1 file changed, 4 insertions(+)
create mode 100644 .gitignore
[dev@localhost git_test]$ git push origin master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 297 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
51761d8..ee1fb43 master -> master
[dev@localhost git_test]$ touch a.so b.ini c.a
[dev@localhost git_test]$ git status
# 位于分支 master
无文件要提交,干净的工作区
提示无文件要提交,干净的工作区,说明.gitignore
文件生效。
当然,当有些文件已经被规则所忽略但若仍想添加,这时可以-f
选项进行强制添加文件。
git add -f [filename]
当在写.gitignore
文件的时候,将某一规则写错了,可以使用git check-ignore
命令来进行检查。
如:.a
为后缀名的文件是需要被添加的。
[dev@localhost git_test]$ git add -f c.a
[dev@localhost git_test]$ git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: c.a
#
[dev@localhost git_test]$ git check-ignore -v a.so
.gitignore:3:*.so a.so
比如以.so
为后缀名的文件给忽略的规则,命令git check-ignore
可以让我们知道是.gitignore
文件的第3行规则忽略了该文件,这样以便于我们对该规则进行修改。
编写.gitignore
文件将.
开头的隐藏文件都忽略掉,但是这条规则同时也把.gitignore
文件也给忽略掉了。这时可以对.gitignore
文件添加规则表示不要将.gitignore
文件忽略掉。
[dev@localhost git_test]$ vim .gitignore
[dev@localhost git_test]$ cat .gitignore
#My configurations:
*.ini
*.so
*.a
# 不排除.gitignore文件
!.gitignore
3.2 给命令配置别名
有些很长的命令git支持简化操作。
实例:将git status
简化为git st
。
git config --global alias.st status
二、Git标签管理
1 何为标签
标签tag
,实际上可理解为对某次commit的一个标识,相当于起了一个别名。
比如:在项目发布到某一个版本时,针对最后一次commit起一个version1
这样的标签来进行标识。
2 创建标签
★ 创建标签
git tag [name]
★ 创建带有说明的标签
git tag -a [name] -m "XXX" [commit_id]
★ 查看标签
git tag
★ 查看指定标签信息
git show [tagname]
实例:在master分支上创建一个v1.0的标签。
[dev@localhost git_test]$ git branch
* master
[dev@localhost git_test]$ git tag v1.0
[dev@localhost git_test]$ git tag
v1.0
默认标签是打在最近最新的commit上的,若要想在指定的commit上打标签,就得先在历史提交中找到commit id,然后打标签即可。
//查看历史记录
[dev@localhost git_test]$ git log --pretty=oneline --abbrev-commit
ee1fb43 add gitignore
51761d8 update README.md.
d22709e create hello.txt
94d444c Initial commit
//对 Initial commit 此次提交打上标签
[dev@localhost git_test]$ git tag v0.9 94d444c
[dev@localhost git_test]$ git tag
v0.9
v1.0
标签的显示是按照字母方式进行排序,并未按照时间来进行排序。
3 操作标签
★ 删除指定标签
git tag -d [name]
★ 将指定标签推送到远程
git push origin [tagname]
★ 一次性将所有标签推送到远程
git push origin --tags
实例:将标签v0.9删除。
[dev@localhost git_test]$ git tag
v0.9
v1.0
[dev@localhost git_test]$ git tag -d v0.9
已删除 tag 'v0.9'(曾为 94d444c)
实例:将标签v1.0推送到远程,之后又进行删除操作。
[dev@localhost git_test]$ git tag
v1.0
[dev@localhost git_test]$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
* [new tag] v1.0 -> v1.0
标签推送远程成功。
现在删除标签v1.0,先在本地进行删除,再在远程进行删除。
[dev@localhost git_test]$ git tag -d v1.0
已删除 tag 'v1.0'(曾为 ee1fb43)
[dev@localhost git_test]$ git push origin :refs/tags/v1.0
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
- [deleted] v1.0
标签删除成功。
三、Git多人协作
1 多人协作一
1.1 先决条件
实际上,git最大的功能是实现多人的协作开发。
在Windows环境下,再clone同一个项目仓库,来模拟多人协作开发情况。
此处我们只有两个用户,实际情况中,多人协作开发,每个人都有自己的gitee账号,要将用户添加进开发者,用户才有相应的权限进行代码的提交。
添加仓库成员:
邀请用户:
这样一来,就有两个用户,分别在Windows和Linux上对同一个进行协作开发。
1.2 协作开发
仓库中只有一个master分支,而在实际的开发中,任何情况下都不允许直接在master分支上修改代码以保证主分支的稳定。
所有我们得创建一个dev分支,然后在该分支上进行项目的开发,而在master分支上进行版本的发布。
gitee上新建远程分支dev:
远程创建成功的分支可以通过git拉取到本地,以便完成本地开发工作。
现在将Windows和Linux下的用户都将远程仓库进行一次拉取操作。
① Linux下的用户。
[dev@localhost git_test]$ git pull
来自 gitee.com:confused-cat/git_test
* [新分支] dev -> origin/dev
Already up-to-date.
[dev@localhost git_test]$ git branch -r
origin/HEAD -> origin/master
origin/dev
origin/master
[dev@localhost git_test]$ git checkout -b dev origin/dev
M .gitignore
A c.a
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
[dev@localhost git_test]$ git branch
* dev
master
注意:原来查看本地仓库所有分支命令为git branch
,此命令只能查看本地的分支,查看远程分支时需加上-r
选项,即git branch -r
,前提是要先pull拉取最新的远端仓库,才可看到最新的内容。
② Windows下的用户。
现在,两个环境下的用户都可以在dev分支上进行开发。
实例:Linux下用户在dev分支上进行一次开发并push
到远程。
[dev@localhost git_test]$ vim hello.txt
[dev@localhost git_test]$ cat hello.txt
hello git!
linux complete the first function!
[dev@localhost git_test]$ git add hello.txt
[dev@localhost git_test]$ git commit -m "linux add first function"
[dev ba81148] linux add first function
2 files changed, 1 insertion(+)
create mode 100644 c.a
//将dev分支推送到远端
[dev@localhost git_test]$ git push origin dev
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 357 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
ee1fb43..ba81148 dev -> dev
而现在Windows下的用户和Linux下的用户协同开发,恰巧也要对hello.txt文件进行修改并进行推送。
可以看到,推送失败,因为Linux下的最新提交和当前的提交有冲突。
解决方式:想用git pull
将最新提交从origin/dev
上抓取下来。然后在本地进行合并,用户去进行手动解决冲突,在重新进行推送。
解决冲突,重新进行推送。
查看远端是否推送成功。
这样,两位用户就可以进行协同开发了,不断的git pull/git add/git commit/git push
,遇到冲突就如上进行冲突的解决。
我们是在分支上进行多人协作开发,但最终要将开发的所有内容合并到master上去进行最新的发布,确保master分支运行的是最新的内容。
如果Linux下的用户想要看到Windows用户在dev分支上所推送的内容,则git pull
拉取一下。
[dev@localhost git_test]$ git pull
更新 ba81148..319b9c6
Fast-forward
hello.txt | 1 +
1 file changed, 1 insertion(+)
[dev@localhost git_test]$ cat hello.txt
hello git!
linux complete the first function!
windows complete the second function!
实例:上述的开发完成后,Linux下的用户切换回master分支,pull一下保证本地的master是最新的内容;切换回dev分支,在dev上合并master分支,若存在冲突在dev分支上进行解决,而非在master分支上进行解决;切换到master分支,合并dev分支;最终将master分支推送至远程。
//切换到master分支,pull保证本地的master分支是最新内容
[dev@localhost git_test]$ git checkout master
M .gitignore
切换到分支 'master'
[dev@localhost git_test]$ git pull
Already up-to-date.
//切换回dev分支,合并master分支
//原因为:若存在冲突的话,可以在dev分支上进行解决,而不是在master分支解决
[dev@localhost git_test]$ gitcheckout dev
bash: gitcheckout: 未找到命令...
[dev@localhost git_test]$ git checkout dev
M .gitignore
切换到分支 'dev'
[dev@localhost git_test]$ git merge master
Already up-to-date.
//切换至master分支,合并dev分支
[dev@localhost git_test]$ git checkout master
M .gitignore
切换到分支 'master'
[dev@localhost git_test]$ git merge dev
更新 ba81148..319b9c6
Fast-forward
hello.txt | 1 +
1 file changed, 1 insertion(+)
[dev@localhost git_test]$ cat hello.txt
hello git!
linux complete the first function!
windows complete the second function!
[dev@localhost git_test]$ git status
# 位于分支 master
# 您的分支领先 'origin/master' 共 2 个提交。
# (使用 "git push" 来发布您的本地提交)
#
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: .gitignore
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
//将master分支推送到远程
[dev@localhost git_test]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
ba81148..319b9c6 master -> master
[dev@localhost git_test]$ git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: .gitignore
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
查看远端仓库,看是否已经推送成功。
如此。dev分支就并无用处了,就可以将dev分支删除掉。直接在远程仓库中将dev分支删除。
总结:
- 试图用
git push origin branch-name
推送自己的修改。- 若推送失败,则因为远程分支比自己的 本地更新,则需要先
git pull
试图合并。- 若合并有冲突,则手动解决冲突后,再重新进行提交。
- 若没有冲突或解决了冲突后,
git push origin branch-name
进行推送远端。- 功能开发完毕,将分支merge进master,最后删除开发分支。
2 多人协作二
实际上一般情况下,若有多需求需要多人同时进行开发,是不会在一个分支上进行多人开发,而是一个需求或一个功能点就要创建一个feature
分支。
在创建远程分支时,我们可以在远程仓库上直接创建远程分支然后拉取到本地;也可以在本地创建分支然后推送到远端。
情况一:两个用户各自完成自己的需求开发工作。
① Linux下的用户。
[dev@localhost git_test]$ git branch
dev
* master
[dev@localhost git_test]$ git checkout -b feature1
M .gitignore
切换到一个新分支 'feature1'
[dev@localhost git_test]$ vim function1
[dev@localhost git_test]$ cat function1
add function1
[dev@localhost git_test]$ git add function1
[dev@localhost git_test]$ git commit -m "add f1"
[feature1 3e21e95] add f1
1 file changed, 1 insertion(+)
create mode 100644 function1
[dev@localhost git_test]$ git push origin feature1
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 273 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'feature1' on Gitee by visiting:
remote: https://gitee.com/confused-cat/git_test/pull/new/confused-cat:feature1...confused-cat:master
To git@gitee.com:confused-cat/git_test.git
* [new branch] feature1 -> feature1
② Windows下的用户。
查看远端是否推送成功。
情况二:Linux用户去帮助Windows用户开发还未开发完成的内容。
Linux用户需切换到feature2分支去继续开发Windows用户开发的内容。
首先先拉取远端仓库,切换到feature2分支,将feature2分支和远程的feature2分支关联起来,不然之后只使用git push
推送内容会失败。
[dev@localhost git_test]$ git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
来自 gitee.com:confused-cat/git_test
* [新分支] feature2 -> origin/feature2
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> feature1
[dev@localhost git_test]$ git branch -a
dev
* feature1
master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/feature1
remotes/origin/feature2
remotes/origin/master
[dev@localhost git_test]$ git checkout -b feature2 origin/feature2
M .gitignore
分支 feature2 设置为跟踪来自 origin 的远程分支 feature2。
切换到一个新分支 'feature2'
[dev@localhost git_test]$ ls
a.so b.ini function2 hello.txt README.en.md README.md
然后在分支feature2上进行开发,之后推送远程仓库。
[dev@localhost git_test]$ vim function2
[dev@localhost git_test]$ cat function2
add function2
linux help windows
[dev@localhost git_test]$ git add function2
[dev@localhost git_test]$ git commit -m "modify function2"
[feature2 0ac60c1] modify function2
1 file changed, 1 insertion(+)
[dev@localhost git_test]$ git push origin feature2
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 294 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
6797622..0ac60c1 feature2 -> feature2
情况三:Linux用户帮助Windows用户开发了的一些内容之后,Windows用户又回来继续开发自己的内容。
首先得获取Linux用户帮助开发的内容,然后再继续开发剩下的。
pull无效是因为并未指定本地feature2分支和远程feature2分支的链接。
如此,Windows用户的本地代码和远端保持一致,两个用户依旧可以在各自的分支上进行协同开发。
各自的功能开发完成后,将各自的分支merge到master分支上。
① Windows用户。
② Linux用户。
//切换至master分支,pull一下,保证本地的master分支是最新内容
[dev@localhost git_test]$ git checkout master
M .gitignore
切换到分支 'master'
[dev@localhost git_test]$ git pull
Already up-to-date.
//切换feature1分支,合并master分支
//原因:若有冲突,就在feature1分支上进行冲突解决,而非在master分支上进行解决
[dev@localhost git_test]$ git checkout feature1
M .gitignore
切换到分支 'feature1'
[dev@localhost git_test]$ git merge master
Already up-to-date.
[dev@localhost git_test]$ ls
a.so c.a function2 README.en.md
b.ini function1 hello.txt README.md
[dev@localhost git_test]$ git status
# 位于分支 feature1
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: .gitignore
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[dev@localhost git_test]$ git push origin feature1
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 302 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
3e21e95..276e4d9 feature1 -> feature1
//切换至master分支,合并feature1分支
[dev@localhost git_test]$ git checkout master
M .gitignore
切换到分支 'master'
[dev@localhost git_test]$ git merge feature1
更新 7c38a0f..276e4d9
Fast-forward
function1 | 1 +
1 file changed, 1 insertion(+)
create mode 100644 function1
[dev@localhost git_test]$ git status
# 位于分支 master
# 您的分支领先 'origin/master' 共 2 个提交。
# (使用 "git push" 来发布您的本地提交)
#
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: .gitignore
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
//将master分支推送至远端
[dev@localhost git_test]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:confused-cat/git_test.git
7c38a0f..276e4d9 master -> master
[dev@localhost git_test]$ git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: .gitignore
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
功能实现完成且各个分支也合并到主分支master上,这时feature1和feature2分支都没有必要了,就可以在远程仓库上进行删除掉。
3 远程分支删除后,本地git branch -a依然可以看到解决
★ 查看所有分支
git branch -a
★ 查看remote地址,远程分支及本地分支与之相对应的关系
git remote show origin
★ 查看远程仓库中不存在的分支
git remote prune origin
在远程仓库中将所有创建的分支都删除掉后使用git branch -a
命令进行查看。
[dev@localhost git_test]$ git pull
Already up-to-date.
[dev@localhost git_test]$ git branch -a
dev
feature1
feature2
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/feature1
remotes/origin/feature2
remotes/origin/master
发现,删除的分支在本地依然可以看到。
使用命令git remote show origin
和git remote prune origin
来进行删除。
[dev@localhost git_test]$ git remote show origin
* 远程 origin
获取地址:git@gitee.com:confused-cat/git_test.git
推送地址:git@gitee.com:confused-cat/git_test.git
HEAD分支:master
远程分支:
master 已跟踪
refs/remotes/origin/dev 过时(使用 'git remote prune' 来移除)
refs/remotes/origin/feature1 过时(使用 'git remote prune' 来移除)
refs/remotes/origin/feature2 过时(使用 'git remote prune' 来移除)
为 'git pull' 配置的本地分支:
dev 与远程 dev 合并
feature2 与远程 feature2 合并
master 与远程 master 合并
为 'git push' 配置的本地引用:
master 推送至 master (最新)
[dev@localhost git_test]$ git remote prune origin
修剪 origin
URL:git@gitee.com:confused-cat/git_test.git
* [已删除] origin/dev
* [已删除] origin/feature1
* [已删除] origin/feature2
[dev@localhost git_test]$ git branch -a
dev
feature1
feature2
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
如此,就可以删除那些远程仓库不存在的分支,而本地分支的删除使用命令git branch -d branch-name
来进行删除,有些用此命令不可删除的,使用git branch -D branch-name
来进行强制删除。
[dev@localhost git_test]$ git branch -d dev feature1 feature2
已删除分支 dev(曾为 319b9c6)。
已删除分支 feature1(曾为 276e4d9)。
已删除分支 feature2(曾为 7c38a0f)。
接上节:Git–版本控制器学习(一)