Git使用--多人协作

多人协作

    • 多⼈协作
      • git branch -r
      • git checkout -b dev origin/dev
    • 远程分⽀删除后,本地git branch -a依然能看到的解决办法
      • git remote show origin
      • git remote prune origin

多⼈协作

截止到目前,我们学习了如下Git的相关知识:

  • 基本完成Git的所有本地库的相关操作,git基本操作,分⽀理解,版本回退,冲突解决等等
  • 申请码云账号,将远端信息clone到本地,以及推送和拉取。

是时候⼲最重要的⼀件事情了,实现多⼈协作开发!为了做这件事情,我们需要先做⼀些准备⼯作。

linux上,我们之前已经将项⽬clone到了指定⽬录,如下:

[root@VM-16-15-centos git_study]# pwd
/root/git_study

我们在windows环境下,再clone同⼀个项⽬仓库,来模拟和你⼀起协作开发的另⼀名⼩伙伴:
Git使用--多人协作_第1张图片

注意,我这里用的是ssh协议进行clone的,它需要你将你windows上的公钥设置到远程,关于怎么设置我在Git远程操作中有讲解。

我们看到目前远程仓库有一个file.txt文件的,我们的目标是在远程master分支下file.txt文件中新增代码“aaa”、“bbb”。

  • 实现:由开发者1(Linux下)新增"aaa",开发者2(windows)新增"bbb"
  • 条件:在一个分支下完成。

⽬前,我们的仓库中只有⼀个master主分⽀,但在实际的项⽬开发中,在任何情况下其实都是不允许直接在master分⽀上修改代码的,这是为了保证主分⽀的稳定。所以在开发新功能时,常常会新建其他分⽀,供开发时进⾏迭代使⽤。
Git使用--多人协作_第2张图片

那么接下来,就让我们在gitee上新建dev远程分⽀供我们使⽤:

Git使用--多人协作_第3张图片
创建成功的远程分⽀是可以通过Git拉取到本地来,以实现完成本地开发⼯作。

git branch -r

接下来让我们将远程仓库进⾏⼀次拉取操作,并观察结果:

[root@VM-16-15-centos git_study]# git pull
From gitee.com:ZMZZZhao/git_study
 * [new branch]      dev        -> origin/dev
Already up-to-date.
# 注:之前讲的 git branch 其实只能查看本地分⽀,要查看远程分⽀需要加上-r选项。
# 但前提是要pull⼀下拉取最新的远端仓库,才能看到最新的内容
[root@VM-16-15-centos git_study]# git branch -r
  origin/HEAD -> origin/master
  origin/dev
  origin/master

此时通过git branch -r我们可以在本地看到远程的分支情况。


另外,通过git branch -a可以查看本地和远程的分支情况:

[root@VM-16-15-centos git_study]# git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/master

我们本地当前并没有dev分支,接下来我们需要在本地创建dev分支,并且和远端的dev分支关联起来。

这个时候往往会用git checkout -b dev origin/dev这个命令

git checkout -b dev origin/dev

它意思是说,创建并切换到dev分支上(git checkout -b dev),接着跟远程的origin地址上的dev分支关联起来。

[root@VM-16-15-centos git_study]# git checkout -b dev origin/dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'

这里要注意origin代表是一个路径,可以用git remote -v 查看; 说白了,origin/dev有点像是[email protected]:ZMZZZhao/git_study.git/dev

origin	git@gitee.com:ZMZZZhao/git_study.git (fetch)
origin	git@gitee.com:ZMZZZhao/git_study.git (push) ```

对于⼩伙伴(Windows)要操作的是:

Git使用--多人协作_第4张图片

现在,你和你的⼩伙伴就可以在 dev 上完成开发。

⾸先,让我们在 dev 分⽀上进⾏⼀次开发,并 push 到远程。例如:

[root@VM-16-15-centos git_study]# vim file.txt 
[root@VM-16-15-centos git_study]# cat file.txt 
hello world!

第一次修改内容

aaa
[root@VM-16-15-centos git_study]# git add file.txt
[root@VM-16-15-centos git_study]# git commit -m "add aaa"
[dev afac038] add aaa
 1 file changed, 3 insertions(+), 1 deletion(-)
[root@VM-16-15-centos git_study]# git push origin dev # 将dev分⽀推送到远端
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 290 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:ZMZZZhao/git_study.git
   11842c3..afac038  dev -> dev

让我们来看看码云上⽬前仓库的状态:

Git使用--多人协作_第5张图片

⾄此,我们已经将代码成功推送⾄码云,接下来假如你的⼩伙伴要和你协同开发,碰巧也要对file.txt⽂件作修改,并试图推送,例如:

Git使用--多人协作_第6张图片

这时推送失败,因为你的⼩伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git已经提⽰我们,先⽤ git pull 把最新的提交从 origin/dev 抓下来,然后,在本地进⾏合并,并解决冲突,再推送。操作如下:

Git使用--多人协作_第7张图片

此时,我们看到远端的码云已经能看到我们的新提交了!

Git使用--多人协作_第8张图片

由此,两名开发者已经开始可以进⾏协同开发了,不断的 git pull/add/commit/push ,遇到了冲突,就使⽤我们之前讲的冲突处理解决掉冲突。

对于你来说,要想看到⼩伙伴的代码,只需要 pull ⼀下即可.

最后不要忘记,虽然我们是在分⽀上进⾏多⼈协作开发,但最终的⽬的是要将开发后的代码合并到master上去,让我们的项⽬运⾏最新的代码。接下来我们就需要做这件事情了:

# 切换⾄ master分⽀, pull ⼀下,保证本地的master是最新内容。
# 合并前这么做是⼀个好习惯
泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (dev)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git pull
Already up to date.
# 切换⾄ dev 分⽀, 合并 master 分⽀
# 这么做是因为如果有冲突,可以在dev分⽀上进⾏处理,⽽不是在在master上解决冲突。
# 这么做是⼀个好习惯
泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git checkout dev
Switched to branch 'dev'
Your branch is up to date with 'origin/dev'.

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (dev)
$ git merge master
Already up to date.
# 切换⾄ master 分⽀,合并 dev 分⽀
泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (dev)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git merge dev
Updating 11842c3..843e0ee
Fast-forward
 file.txt | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ cat file.txt
hello world!

第一次修改内容

aaa
bbb
# 将 master 分⽀推送⾄远端
泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:ZMZZZhao/git_study.git
   11842c3..843e0ee  master -> master

此时,查看远端仓库,master已经是最新代码了:

Git使用--多人协作_第9张图片

此时,dev分⽀对于我们来说就没⽤了,那么dev分⽀就可以被删除掉。我们可以直接在远程仓库中将dev分⽀删除掉:

Git使用--多人协作_第10张图片


总结⼀下,在同⼀分⽀下进⾏多⼈协作的⼯作模式通常是这样:

  • ⾸先,可以试图⽤git push origin branch-name推送⾃⼰的修改;
  • 如果推送失败,则因为远程分⽀⽐你的本地更新,需要先⽤git pull试图合并;
  • 如果合并有冲突,则解决冲突,并在本地提交;
  • 没有冲突或者解决掉冲突后,再⽤git push origin branch-name推送就能成功!
  • 功能开发完毕,将分⽀merge进master,最后删除分⽀。

那么多人协作还有其他一下场景,我们就不一一说了,大家在实际运用中自己体会。

远程分⽀删除后,本地git branch -a依然能看到的解决办法

当前我们已经删除了远程的dev分⽀,使⽤ git branch -a 命令可以查看所有本地分⽀和远程分⽀,但发现在远程仓库已经删除的分⽀在本地依然可以看到。例如:
Git使用--多人协作_第11张图片

git remote show origin

使⽤命令git remote show origin ,可以查看remote地址,远程分⽀,还有本地分⽀与之相对应关系等信息。

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git remote show origin
* remote origin
  Fetch URL: [email protected]:ZMZZZhao/git_study.git
  Push  URL: [email protected]:ZMZZZhao/git_study.git
  HEAD branch: master
  Remote branches:
    master                  tracked
    refs/remotes/origin/dev stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev    merges with remote dev
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

git remote prune origin

此时我们可以看到远程仓库已经不存在的分⽀(dev),根据提⽰,使⽤ git remote prune origin 命令:

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git remote prune origin
Pruning origin
URL: [email protected]:ZMZZZhao/git_study.git
 * [pruned] origin/dev

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git branch -a
  dev
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

这样就删除了那些远程仓库不存在的分⽀。

接着,把本地仓库dev分支删除即可。

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git checkout master
Already on 'master'
Your branch is up to date with 'origin/master'.

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git branch
  dev
* master

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git branch -d dev
Deleted branch dev (was 843e0ee).

泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git branch
* master

the end!

你可能感兴趣的:(Git,git)