飞道的博客

二、Git多人开发:不同人修改了不同文件如何处理

426人阅读  评论(0)

@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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场