赞
踩
共享仓库:刚开始用户A1人做项目开发,突然又加入了一个用户B,B如何把A的代码移动到自己的电脑中?(1.用U盘Copy;2.从它电脑里直接克隆;)
Git支持我们从另外一个路径,克隆一份工程到我们的指定位置,
- 回到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仓库地址,就可以把他克隆到本地。
上一节介绍了如何克隆一个仓库,本节介绍共享仓库的创建。
我们实际开发过程中,都会有一个中央仓库,中央仓库是大家共享的一个仓库,我们所有的代码都可以往共享仓库中推送。当我们有三个仓库的时候(如下图所示),我们会留一个作为共享仓库(比如仓库C),这样就不用再两个用户之间copy代码,而是通过中央仓库(中介)来copy代码,这样就避免了 B进来没来上班,而 A无法从Bcopy代码的情况。
有了共享仓库C,A和B就可以把写的代码推送到共享仓库C中,A和B每天上班的时候,就先从共享仓库中拉取最新的代码,再看一下同事的代码做了哪些修改,就可以知道最新的项目进度做到那里,就不用在A和B去互相copy了。
共享仓库就是一个中间媒介,A和B把代码都上传到这个里面,共享仓库在Git里面创建的时候,
共享仓库的特点:
bare是赤裸的意思,我们称bare仓库为裸仓库,只能看到 git 相关的东西,看不到工作区,
输入命令,然后回车,就有了下图红框中.git的文件夹,点击进去
看到gitCenter.git下的文件夹没有隐藏,就是给使用的,代码可以上传到共享仓库,也可以从共享仓库clone代码
把是工作区的工程当作共享仓库,先删掉上一步建的gitCenter.git仓库,然后把已有的包含工作区的仓库,当作共享仓库
假设把user1中内容放到共享仓库里面,
git clone --bare ./user1 共享仓库名称 #如果不写共享仓库名称,则会自动生成user1.git作为名称
然后删除user1.git
双击进入gitCenter.git,看不到工作区,然而当你直接从它里面clone的时候,是可以看到工作区的,
此时,从中央仓库里面clone一个工程出来,
然后从中央仓库里面clone,新生成 user3,user3中的内容和user1是一样的,因为中央仓库gitCenter.git是从user1创建的共享仓库,它把user1的工作区也放到了共享仓库中,
虽然你双击进入gitCenter.git看不到工作区,但是工作区是存在的,在你从共享仓库clone到别的地方之后,就会显示出来。
在本地仓库当中添加文件,添加到本地仓库中
先提交到本地仓库(commit),再推送到远程仓库
推送命令——git push 远程仓库地址,分支名称
git push ../gitCenter.git/ master(分支名称) # 分支名称前有空格
此时,代码已经上传到了中央仓库的master分支中,
然后去共享仓库中查看日志记录
在共享仓库 gitCenter.git 的日志中看到了 user1 的最新内容,说明已经将user1的代码添加到了共享仓库中。
假设user1已将代码上传到共享仓库,另外一个用户user2可以从共享仓库同步一下代码,下拉到user2自己的仓库里面,
git pull 仓库地址 分支名称 # 分支名称前面要有空格
由于我们已经把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,都能看到日志
这样就可以协同工作
什么是冲突?
两个人共同协作开发时,改了相同的文件,都做了提交。
什么情况下会产生冲突?
现在有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)
先进入 user1 中,里面有 a.txt 文件,通过 Git Bash Here 进入 git 界面,
使用vim 命令,打开a.txt,输入命令,然后回车
按 i 键进入编辑界面,如下图所示,然后就可以对命令进行修改。
修改a.txt的内容,添加内容为在hello world中间加上user1(A用户)
然后按ESC,然后按SHIFT+:,然后输入 wq 命令,回车即可保存 a.txt 修改的内容。
查看 a.txt 修改后的内容
然后把修改内容提交到本地
此时,user2中修改的a.txt也提交到了user2的本地 Git
利用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
输入指令之后,按回车键。
上图提示我们要写上分支,先按i键随便写一个aa,然后ESC,SHIFT+:,通过wq键保存
然后再去push一下,看到了红框中的 100%,说明push成功
不管共享仓库有没有更新,我们每次 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
基本======上面是自己写的代码,下面是别人写的代码。
HEAD指向自己写的代码,===下面是别人写的代码
user2修改完冲突,push之后,下面演示一下user1拉取代码的过程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。