Git--版本控制器学习(二)

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链接,因为我们并没有添加公钥到远程库中去。此时就需要设置一下。

  1. 创建SSH Key。
    在用户主目录下,查看是否存在.ssh目录,若存在则查看是否存在id_rsaid_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_rsaid_rsa.pub两个文件。此两个文件就是SSH Key的密钥对,id_rsa是私钥,id_rsa.pub是公钥。

  1. 添加公钥到远程仓库。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[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分支删除。
在这里插入图片描述
在这里插入图片描述

总结:

  1. 试图用git push origin branch-name推送自己的修改。
  2. 若推送失败,则因为远程分支比自己的 本地更新,则需要先git pull试图合并。
  3. 若合并有冲突,则手动解决冲突后,再重新进行提交。
  4. 若没有冲突或解决了冲突后,git push origin branch-name进行推送远端。
  5. 功能开发完毕,将分支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 origingit 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–版本控制器学习(一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值