当前位置:   article > 正文

Git学习4共享仓库多人协作开发_git共享仓库

git共享仓库


现在学习的Git全是命令操作,后面会使用idea进行操作,在idear中全是图形化界面的一种形式,图形化界面的话,底层都是调用的这些命令,我们无比要把命令先掌握清楚,然后再去操作图形化界面的时候,你就会知道它们每一步底层做的是什么事情,所以命令学习是非常关键的。

1.Git仓库Clone

共享仓库:刚开始用户A1人做项目开发,突然又加入了一个用户B,B如何把A的代码移动到自己的电脑中?(1.用U盘Copy;2.从它电脑里直接克隆;)

Git支持我们从另外一个路径,克隆一份工程到我们的指定位置,

在这里插入图片描述

  • 用户clone项目, 在当前目录下,clone用户1项目
    • 命令:git clone 要复制的项目路径和名称(要克隆的项目的地址),复制之后的项目路径和名称(复制到哪里,叫什么名字)
    • 示例
      • $ git clone ./user1 ./user2 (注意:user1和user2之间有空格,把当前目录的user1克隆到user2当中)
      • clone出来的项目,当中包括工作区和历史日志
  • 操作
    • 我们来到已经建好的git工程user1

在这里插入图片描述
- 回到user1的上一级目录,在空白处右击,选择 Git Bash Here
在这里插入图片描述
我们想把工程user1克隆一份,先在一台电脑中模拟多个用户,后续会使用github和gitlab
在这里插入图片描述
输入命令,然后回车,会发现,在uer1文件夹下面多了个user2的文件夹
在这里插入图片描述
在这里插入图片描述
,发现user1和user2的文件是一样的,区别是 user2 中没有 css 文件夹,原因是user1的 css 文件夹起初并没有添加到Git 里面,也就是clone并不是copy所有文件,而是从你的项目(user1)中拿出最后一个版本,然后复制一份,只copy被添加到Git中的文件和记录。
在这里插入图片描述
进入到user2的路径,通过Git Bash Here打开git窗口,查看一下user2的 git log
在这里插入图片描述
可以看到,最后一步操作是 合并hotBranch
在这里插入图片描述
现在使用的是本地克隆,后续换成远程的github仓库地址,就可以把他克隆到本地。

2.Git共享仓库特点

上一节介绍了如何克隆一个仓库,本节介绍共享仓库的创建。

我们实际开发过程中,都会有一个中央仓库,中央仓库是大家共享的一个仓库,我们所有的代码都可以往共享仓库中推送。当我们有三个仓库的时候(如下图所示),我们会留一个作为共享仓库(比如仓库C),这样就不用再两个用户之间copy代码,而是通过中央仓库(中介)来copy代码,这样就避免了 B进来没来上班,而 A无法从Bcopy代码的情况。
在这里插入图片描述
有了共享仓库C,A和B就可以把写的代码推送到共享仓库C中,A和B每天上班的时候,就先从共享仓库中拉取最新的代码,再看一下同事的代码做了哪些修改,就可以知道最新的项目进度做到那里,就不用在A和B去互相copy了。

共享仓库就是一个中间媒介,A和B把代码都上传到这个里面,共享仓库在Git里面创建的时候,

共享仓库的特点:

  • 以项目名称 .git结尾
  • 看不到工作区 (只对其做代码推送和拉取工作,故看不到工作区,只用来共享,不进行修改、添加等操作)
  • 它只用来共享,不能够进行修改添加等操作 (没有工作区,看不到文件,无法进行修改、添加)
  • 从共享仓库当中 clone 下来的代码,是可以看到工作区的 (你直接进入共享仓库是看不到任何东西的,它是一个.git工程,你进去之后,是看不到工作区的,但是,我另外一个人从共享仓库clone一份工程下来的时候,clone下来的工程,是可以看到工作去区的。)

3.Git共享仓库创建(.git结尾就是共享仓库)

  • git init --bare 仓库名称 (创建一个空的共享仓库,里面什么都没有,)
  • git clone --bare 要clone的项目路径和名称(从另外一个项目中 clone,clone 出来一个共享仓库,)

bare是赤裸的意思,我们称bare仓库为裸仓库,只能看到 git 相关的东西,看不到工作区,
在这里插入图片描述
输入命令,然后回车,就有了下图红框中.git的文件夹,点击进去
在这里插入图片描述
看到gitCenter.git下的文件夹没有隐藏,就是给使用的,代码可以上传到共享仓库,也可以从共享仓库clone代码
在这里插入图片描述
把是工作区的工程当作共享仓库,先删掉上一步建的gitCenter.git仓库,然后把已有的包含工作区的仓库,当作共享仓库
假设把user1中内容放到共享仓库里面,

git clone --bare ./user1 共享仓库名称   #如果不写共享仓库名称,则会自动生成user1.git作为名称
  • 1

在这里插入图片描述
然后删除user1.git

在这里插入图片描述
双击进入gitCenter.git,看不到工作区,然而当你直接从它里面clone的时候,是可以看到工作区的,

在这里插入图片描述
此时,从中央仓库里面clone一个工程出来,
在这里插入图片描述
然后从中央仓库里面clone,新生成 user3,user3中的内容和user1是一样的,因为中央仓库gitCenter.git是从user1创建的共享仓库,它把user1的工作区也放到了共享仓库中,
在这里插入图片描述
虽然你双击进入gitCenter.git看不到工作区,但是工作区是存在的,在你从共享仓库clone到别的地方之后,就会显示出来。

4.Git共享仓库上传代码

  • 在本地仓库当中添加文件,添加到本地仓库中

  • 先提交到本地仓库(commit),再推送到远程仓库

    • 这样可以保证,如果共享仓库崩了,本地仓库还有完好数据。
  • 推送命令——git push 远程仓库地址,分支名称
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 示例
    • 假设在 user1 里面做一些操作,
      在这里插入图片描述
      创建 touch d.txt (红色表示未添加到暂存区)
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      git log 之后,想回到命令行的话,可以按 q 键。
      此时已经将d.txt提交到本地git中,但是远程仓库 gitCenter.git 中还没有,
      在这里插入图片描述
      主动把信息推送到远程仓库(当前所在位置为user1里面,写命令时要出去)
git push ../gitCenter.git/ master(分支名称) # 分支名称前有空格
  • 1

在这里插入图片描述
此时,代码已经上传到了中央仓库的master分支中,
然后去共享仓库中查看日志记录
在这里插入图片描述
在共享仓库 gitCenter.git 的日志中看到了 user1 的最新内容,说明已经将user1的代码添加到了共享仓库中。

在这里插入图片描述

5.Git共享仓库下拉代码

假设user1已将代码上传到共享仓库,另外一个用户user2可以从共享仓库同步一下代码,下拉到user2自己的仓库里面,
在这里插入图片描述
在这里插入图片描述

git pull 仓库地址 分支名称  # 分支名称前面要有空格
  • 1

由于我们已经把user1的内容上传到共享仓库gitCenter.git,那么用user2用户从共享仓库中下拉,可以发现user2中没有d.txt文件
在这里插入图片描述
而user1创建了d.txt文件并上传到了共享仓库,接下来从共享仓库中下拉到user2,在user2中打开命令行,并执行pull(下拉)操作
在这里插入图片描述
在这里插入图片描述
此时,查看user2的工作区,发现已经有了d.txt文件
在这里插入图片描述
下拉的过程,不单单把文件d.txt下拉下拉,同时还把gitCenter.git共享仓库的历史记录下拉下拉了,

在这里插入图片描述

  • 演示完整路线:先去上传,然后在另外一个工程中下拉

在这里插入图片描述

在user2中新建一个 e.txt,先添加本地,
在这里插入图片描述

再添加到共享仓库
在这里插入图片描述
再来到 user3 里面,user1新建的d.txt,user2新建的e.txt,user3还没有进行下拉
在这里插入图片描述
在user3中启动命令行
在这里插入图片描述
从共享仓库中下拉代码到user3
在这里插入图片描述
在这里插入图片描述
在user3 中查看日志,发现在user2中添加的d.txt和user3中添加的e.txt,都能看到日志
在这里插入图片描述
这样就可以协同工作

6.Git什么情况下产生冲突

  • 什么是冲突?
    两个人共同协作开发时,改了相同的文件,都做了提交。

  • 什么情况下会产生冲突?

    • 两个人同时改了相同的代码,并且都提交到了本地
    • 先提交到远程仓库的人不会有任何问题
    • 后提交的人,要求他先 pull 下来(下拉),在 pull 的时候,就会产生冲突
    • 这时就需要先解决冲突,解决冲突完毕后,提交到本地,再提交到远程仓库

现在有A、B两个用户,
假设A用户有 a.txt,在a.txt中修改了数字1,然后将a.txt提交到本地仓库

同样,B做类似的工作,只是修改了a.txt修改了数字2,也提交到本地git

在这里插入图片描述

,然后A将a.txt push 到远程的共享仓库,一切正常
当共享仓库中有最新的内容(A用户刚提交的a.txt)时,要求要执行 push 的用户,先把共享仓库中的内容 pull 下来,(即,当一个用户B执行push时,它的前面必须没有人push过,或者上次push的人是他本人,才可以直接push,否则先执行pull,再push。)

在这里插入图片描述

在pull的时候就会产生冲突,因为共享仓库gitCenter.git、B两人文件名是一样的(a.txt),但文件的内容是不一样的,中央仓库中的a.txt内容为数字1,B中的a.txt内容为数字2。

此时,需要去解决这个冲突,解决冲突之后,才允许用户B将文件push到中央仓库 gitCenter.git 中。(即现去pull,pull的时候若与本地git发生冲突,先去解决冲突,然后再去push)
在这里插入图片描述

7.Git 冲突演示

7.1 user1 修改 a.txt,然后保存到本地 git

在这里插入图片描述
先进入 user1 中,里面有 a.txt 文件,通过 Git Bash Here 进入 git 界面,
在这里插入图片描述

在这里插入图片描述
使用vim 命令,打开a.txt,输入命令,然后回车
在这里插入图片描述
在这里插入图片描述
i 键进入编辑界面,如下图所示,然后就可以对命令进行修改。
在这里插入图片描述
修改a.txt的内容,添加内容为在hello world中间加上user1(A用户)
在这里插入图片描述
然后按ESC,然后按SHIFT+,然后输入 wq 命令,回车即可保存 a.txt 修改的内容。
在这里插入图片描述
查看 a.txt 修改后的内容

在这里插入图片描述
然后把修改内容提交到本地
在这里插入图片描述

7.2 user2 做与user1(A用户) 相同的操作(a.txt的修改内容与user1(A用户) 不同)

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

在这里插入图片描述
此时,user2中修改的a.txt也提交到了user2的本地 Git

7.3 将user1(用户A)push到远程仓库

在这里插入图片描述

利用push指令,将user1 push到中央仓库,写上中央仓库的地址,以及要push到的分支名称

在这里插入图片描述

被拒绝,提示要先获取(fetch first),可能之前仓库里有别人更新的东西,我们没有把它更新下来。当你 push 的时候,如果发现里面有 fetch first提示,就代表你需要从上面先做一个更新,(因为之前user3的东西已经push上去了,我们需要把它更新下来)

当本地 git 和共享仓库内容不一样的时候,你就需要先把共享仓库中的东西pull下来,然后再执行push。这个时候pull不会产生冲突,因为user3 push的时候,没有修改与user1(A用户) 中相同的文件。

所以接下来从共享仓库中获取(pull),然后再push

$ git pull ../gitCenter.git/ master
  • 1

输入指令之后,按回车键。
在这里插入图片描述
上图提示我们要写上分支,先按i键随便写一个aa,然后ESCSHIFT+,通过wq键保存
在这里插入图片描述
然后再去push一下,看到了红框中的 100%,说明push成功
在这里插入图片描述

7.4 user2 (用户B)先执行 pull

不管共享仓库有没有更新,我们每次 push之前,都先 pull(下拉)一下,更新一下自己仓库,然后再推送到远程。
在这里插入图片描述
在这里插入图片描述

合并 a.txt 文件的时候,产生一个冲突,然后我们查看一下 a.txt,发现内容与之前不一致
在这里插入图片描述
上图a.txt的内容中,有user1(A用户) 中a.txt的信息,也有user2(B用户)中a.txt的信息,这种情况下执行push指令,会被拒绝,如下图所示
$ git push …/gitCenter.git/ master
在这里插入图片描述

现在,你需要手动的解决这个冲突,然后才能push到共享仓库。

要解决完冲突之后,再去体交到本地git,然后再提交到远程共享仓库

第 8 节再将如何解决冲突
此时,先把冲突掩饰一下,现在冲突就已经有了,

我们再去造一个冲突出来,把 user1(A用户) 和 user2(B用户) 两个窗口关掉,现在改一下A里面的 b.txt文件,使用记事本将b.txt的内容改为:user1 add code,然后保存

查看内容,然后提交到本地
在这里插入图片描述
由于前面 user1 (A用户) 已经进行过 pull 操作,现在可以直接 push 操作
在这里插入图片描述
由上图可知,push 成功。(由于user1即A用户刚和共享仓库同步过,所以push前就不需要pull下拉了。)

此时user1(A用户)改了b.txt

然后告知 user2(B用户) ,user1(A用户)代码已更新到共享仓库gitCenter.git,让他下拉最新的代码,当他下拉的时候,又会发生新的冲突,因为user2(B用户)中的 b.txt 的内容为空

在这里插入图片描述
在 pull 下拉之前,user2(B用户) 的 b.txt 文件也修改一下内容,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后提交到本地
在这里插入图片描述

在这里插入图片描述
先进行 pull 下拉操作,此时会产生冲突(在push之前,先把这个冲突解决掉)

在这里插入图片描述
查看一下 b.tixt,它里面也会出现 HEAD ,这个就是产生的冲突,下一节介绍解决冲突,解决冲突之后,才能进行push
在这里插入图片描述

7.5 user2 (用户B)先解决冲突,才能执行 push

在这里插入图片描述

8.Git 解决冲突

冲突文件内容

在这里插入图片描述

基本======上面是自己写的代码,下面是别人写的代码。
HEAD指向自己写的代码,===下面是别人写的代码

解决方式

  • 删除上图中<<<<<<<<和>>>>>>>>f0564……内容
  • 根据实际需求,保留对应代码。
    打开user2中 b.txt(下图展示),也修改user2中的a.txt(不予展示)
    在这里插入图片描述
    在这里插入图片描述

解决步骤

  • 删除冲突内容,保留对应业务代码,保证程序可运行(要把程序跑通),提交代码
  • 添加到本地,提交到本地,再提交到远程即可
    • 由于user2中的a.txt和b.txt已经修改(红色)
      在这里插入图片描述
      下图操作完后,表示已经提交到本地
      在这里插入图片描述
      push 到远程仓库(远程地址+分支),表明冲突问题已经解决
      在这里插入图片描述
      第二天,其它用户刚上班的时候,就要先从中央仓库(共享仓库)拉取代码,每天下班前,把代码提交到中央仓库,谁先提交谁不用解决冲突。

user2修改完冲突,push之后,下面演示一下user1拉取代码的过程
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/778667
推荐阅读
相关标签
  

闽ICP备14008679号