@Author:Runsen
上面我们创建了一个组织的仓库。分别有小A和小B。我在电脑上给小A和小B不同的工作位置。
小A在我的Window系统,小B在我的Ubuntu虚拟机中,这是因为我在Windows系统设置了SSH Key ,一个操作系统就只能存在一个用户,所以我选择Ubuntu当作一个小用户
下面是ubuntu系统,小B创建SSH key,将Git本地仓库与服务器端仓库的关系起来。
maoli@ubuntu:~$ ssh-keygen -t rsa -C "liurunsen@sina.cn"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/maoli/.ssh/id_rsa):
Created directory '/home/maoli/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/maoli/.ssh/id_rsa.
Your public key has been saved in /home/maoli/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:dqEXZWc0RIpUJTgYEer8CeeKb9KsJMPPFl7y6wgK5bc liurunsen@sina.cn
The key's randomart image is:
+---[RSA 2048]----+
| +=.o==O |
| ...o+ = . |
| . +.. |
| o . o |
| . + S o |
| + o .* + |
|. *.oB + |
|.. O++=. |
|. .E*=. |
+----[SHA256]-----+
maoli@ubuntu:~$ cat /home/maoli/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsgLLqgMLyhuAdra9UhRd8DcPpRw3Miimcx3z2vHByrR9kLnopDogJ7zBC4P88bNs/G5Kt+KvADtoqMuHzFe80GTfNZjUIAFsO1duJv4i+9yTJa7E0VVRtKXCv8YVh7UG3aAqeaTE0J0/kc/O5bGrBEK0umw6Z/+2xgVvozvar0lXGvGK2u8rFFTgok1Bq8t0nbhnZ+xMOvYgWnIzdE9rOnHb0a9bnS/i8s8yAil5/ODiTkdTXazQJJl1WqeqKsXq/xPoqsZQ/2QyOMIwvyMXvQTsz11uxm2nhw3bUtvpu2ZVEdDjgePby6iNphLzYiCpjnVJG0GVxW0V0gd0o8LBz liurunsen@sina.cn
复制生成后的 ssh key,通过小B的仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,添加生成的 public key 添加到仓库中。
下面就是在ubuntu克隆仓库就可以了。
maoli@ubuntu:~$ mkdir B
maoli@ubuntu:~$ cd B
maoli@ubuntu:~/B$ git clone https://gitee.com/MaoliRUNsen/muli_person_test
Cloning into 'muli_person_test'...
Username for 'https://gitee.com': Maolicom
Password for 'https://Maolicom@gitee.com':
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (6/6), 完成.
Checking connectivity... done.
自此,Windows和ubuntu都有对应的仓库,我们可以想象成有两个开发者在干活。下面就正式开始本chat的重点。
多人合作工作原理 :分支
下面将进行原理介绍: 如何进行多人合作
所有准备工作完成之后,接下来要做的就是,如何合作。我们可以每个人都在master当中进行操作,但是这时候会有什么问题呢?会不会整个master变得很乱?也有可能出现各种问题?
在没有分支这个概念之前,我们对于一个项目的开发只有一个进度,但是一旦发现项目的之前版本的某个节点出现 bug,难道放弃到目前为止的所有开发,回退到 bug 节点进行修复吗?
为了防止这种混乱现象的发生,我们在实际开发中的工作原则是这样的:
master是我们的主分支(也可以理解为主线),我们为了让这条分支足够稳定,只在这个分支上进行新版本的发布或者项目的更新。
对于一个项目的所有操作,都创建一个develop分支,在这个分支上进行各个开发者代码的合并。
由于一个项目有可能是多个人协作实现的,因此会每个人创建一个自己的分支,然后每个人将自己的代码,从个人分支提交到develop分支做合并。
Runsen先总结创建与合并分支命令如下:
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout –b name
合并某分支到当前分支:git merge name
删除分支:git branch –d name
多人在同一分支
现在我们来实验一下,首先我们应该都创建dev分支,但是我们远程仓库上只有master分支,这里小A先在Windows创建一个dev分支。
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (master)
$ git branch
* master
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (master)
$ git checkout -b dev
Switched to a new branch 'dev'
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev)
$ git branch
* dev
master
接下来小A把dev分支推送到远程仓库上去
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev)
$ git push origin dev
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
remote: Create a pull request for 'dev' on Gitee by visiting:
remote: https://gitee.com/MaoliRUNsen/muli_person_test/pull/new/MaoliRUNsen:dev...MaoliRUNsen:master
To https://gitee.com/MaoliRUNsen/muli_person_test
* [new branch] dev -> dev
我们可以到远程仓库中看到该分支
接下来我们切换身份到小B。小B从远程仓库上clone下来后会发现只有一个master分支。
maoli@ubuntu:~/B/muli_person_test$ git branch
* master
maoli@ubuntu:~/B/muli_person_test$ git checkout -b dev origin/dev
fatal: 不能同时更新路径并切换到分支'dev'。
您是想要检出 'origin/dev' 但其未能解析为提交么?
大家可以看到和原本相比多了一个origin/dev参数,该参数就是关联远程仓库的dev分支。此时我们发现出错了,原因是小B先clone下来了,此时没有dev分支,而小A是在windows主机这里创建的dev分支并push。所以小B需要先pull一下。
maoli@ubuntu:~/B/muli_person_test$ git pull
Username for 'https://gitee.com': Maolicom
Password for 'https://Maolicom@gitee.com':
来自 https://gitee.com/MaoliRUNsen/muli_person_test
* [新分支] dev -> origin/dev
Already up-to-date.
maoli@ubuntu:~/B/muli_person_test$ git branch
* master
maoli@ubuntu:~/B/muli_person_test$ git checkout -b dev origin/dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
maoli@ubuntu:~/B/muli_person_test$ git branch
* dev
master
不同人修改了不同文件如何处理?
ok,现在我们可以看到小B也有dev分支了。接下来我们发布一下任务:小A:开发user.html
小B:开发 register.html,也就是不同人修改了不同文件如何处理。这里说明下,开发的话最好不要在dev分支上做,而是选择在自己的分支上开发。
因此小A再先创建一个分支,我们就叫A分支算了。
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev)
$ git checkout -b A
Switched to a new branch 'A'
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A)
$ git branch
* A
dev
master
然后小A做个user.html,这里我简单点,随便写下代码。
然后添加,提交
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A)
$ git add user.html
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A)
$ git commit -m "小A提交user.html"
[A 3a709b2] 小A提交user.html
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 user.html
现在小A开发好了,我们切换到dev分支,然后合并,最后小A把dev分支推送到远程仓库里
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A)
$ git checkout dev
Switched to branch 'dev'
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev)
$ git branch
A
* dev
master
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev)
$ git merge A
Updating 3a709b2..cc88ea7
Fast-forward
user.html | 6 ++++++
1 file changed, 6 insertions(+)
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev)
$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/MaoliRUNsen/muli_person_test
3a709b2..cc88ea7 dev -> dev
接下来我们看一下小B。首先一样先创建小B的分支。接下来小B开发register.html。后面都是一样,添加,提交,合并到dev
maoli@ubuntu:~/B/muli_person_test$ git checkout -b B
切换到一个新分支 'B'
maoli@ubuntu:~/B/muli_person_test$ git branch
* B
dev
master
maoli@ubuntu:~/B/muli_person_test$ vim register.html
######
<html>
<head></head>
<body>
<h1>这是小B开发的registB.html</h1>
</body>
</html>
maoli@ubuntu:~/B/muli_person_test$ git commit -m "小B提交了register.html"
[B 799b1cf] register.html
1 file changed, 7 insertions(+)
create mode 100644 register.html
maoli@ubuntu:~/B/muli_person_test$ git checkout dev
切换到分支 'dev'
您的分支与上游分支 'origin/dev' 一致。
maoli@ubuntu:~/B/muli_person_test$ git branch
B
* dev
master
maoli@ubuntu:~/B/muli_person_test$ git merge B
更新 028ae41..799b1cf
Fast-forward
register.html | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 register.html
在小B这里的dev分支上并没有小A开发的user.html。我们不管怎么说,先推送。
maoli@ubuntu:~/B/muli_person_test$ git push origin dev:
To https://gitee.com/MaoliRUNsen/muli_person_test
! [rejected] dev -> dev (fetch first)
error: 无法推送一些引用到 'https://gitee.com/MaoliRUNsen/muli_person_test'
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
可以看到推送错误了。原因已经显而易见了,解决方案就是拉取一次
maoli@ubuntu:~/B/muli_person_test$ git pull
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (6/6), 完成.
来自 https://gitee.com/MaoliRUNsen/muli_person_test
028ae41..cc88ea7 dev -> origin/dev
Merge made by the 'recursive' strategy.
user.html | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 user.html
maoli@ubuntu:~/B/muli_person_test$ ls
README.en.md README.md register.html user.html
这里注意的是你git pull的时候会有提示叫你输入原因,输入原因完成后:wq。退出编辑器即可
maoli@ubuntu:~/B/muli_person_test$ git push
对象计数中: 5, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (5/5), 完成.
写入对象中: 100% (5/5), 585 bytes | 0 bytes/s, 完成.
Total 5 (delta 2), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/MaoliRUNsen/muli_person_test
cc88ea7..c0c933c dev -> dev
转载:https://blog.csdn.net/weixin_44510615/article/details/108147508