多人协作
-
- 多⼈协作
-
- [git branch -r](#git branch -r)
- [git checkout -b dev origin/dev](#git checkout -b dev origin/dev)
- [远程分⽀删除后,本地git branch -a依然能看到的解决办法](#远程分⽀删除后,本地git branch -a依然能看到的解决办法)
-
- [git remote show origin](#git remote show origin)
- [git remote prune origin](#git remote prune origin)
多⼈协作
截止到目前,我们学习了如下Git的相关知识:
- 基本完成Git的所有本地库的相关操作,git基本操作,分⽀理解,版本回退,冲突解决等等
- 申请码云账号,将远端信息clone到本地,以及推送和拉取。
是时候⼲最重要的⼀件事情了,实现多⼈协作开发!为了做这件事情,我们需要先做⼀些准备⼯作。
linux上,我们之前已经将项⽬clone到了指定⽬录,如下:
csharp
[root@VM-16-15-centos git_study]# pwd
/root/git_study
我们在windows环境下,再clone
同⼀个项⽬仓库,来模拟和你⼀起协作开发的另⼀名⼩伙伴:
注意,我这里用的是ssh协议进行clone的,它需要你将你windows上的公钥设置到远程,关于怎么设置我在Git远程操作中有讲解。
我们看到目前远程仓库有一个file.txt文件的,我们的目标是在远程master分支下file.txt文件中新增代码"aaa"、"bbb"。
- 实现:由开发者1(Linux下)新增"aaa",开发者2(windows)新增"bbb"。
- 条件:在一个分支下完成。
⽬前,我们的仓库中只有⼀个master主分⽀,但在实际的项⽬开发中,在任何情况下其实都是不允许直接在master分⽀上修改代码的,这是为了保证主分⽀的稳定。所以在开发新功能时,常常会新建其他分⽀,供开发时进⾏迭代使⽤。
那么接下来,就让我们在gitee上新建dev
远程分⽀供我们使⽤:
创建成功的远程分⽀是可以通过Git拉取到本地来,以实现完成本地开发⼯作。
git branch -r
接下来让我们将远程仓库进⾏⼀次拉取操作,并观察结果:
csharp
[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
可以查看本地和远程的分支情况:
csharp
[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分支关联起来。
csharp
[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有点像是git@gitee.com:ZMZZZhao/git_study.git/dev
csharporigin git@gitee.com:ZMZZZhao/git_study.git (fetch) origin git@gitee.com:ZMZZZhao/git_study.git (push) ```
对于⼩伙伴(Windows)要操作的是:
现在,你和你的⼩伙伴就可以在 dev 上完成开发。
⾸先,让我们在 dev 分⽀上进⾏⼀次开发,并 push 到远程。例如:
csharp
[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
让我们来看看码云上⽬前仓库的状态:
⾄此,我们已经将代码成功推送⾄码云,接下来假如你的⼩伙伴要和你协同开发,碰巧也要对file.txt⽂件作修改,并试图推送,例如:
这时推送失败,因为你的⼩伙伴的最新提交和你推送的提交有冲突,解决办法也很简单,Git已经提⽰我们,先⽤ git pull
把最新的提交从 origin/dev 抓下来,然后,在本地进⾏合并,并解决冲突,再推送。操作如下:
此时,我们看到远端的码云已经能看到我们的新提交了!
由此,两名开发者已经开始可以进⾏协同开发了,不断的 git pull/add/commit/push
,遇到了冲突,就使⽤我们之前讲的冲突处理解决掉冲突。
对于你来说,要想看到⼩伙伴的代码,只需要 pull ⼀下即可.
最后不要忘记,虽然我们是在分⽀上进⾏多⼈协作开发,但最终的⽬的是要将开发后的代码合并到master
上去,让我们的项⽬运⾏最新的代码。接下来我们就需要做这件事情了:
bash
# 切换⾄ 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.
bash
# 切换⾄ 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.
bash
# 切换⾄ 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
bash
# 将 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已经是最新代码了:
此时,dev分⽀对于我们来说就没⽤了,那么dev分⽀就可以被删除掉。我们可以直接在远程仓库中将dev分⽀删除掉:
总结⼀下,在同⼀分⽀下进⾏多⼈协作的⼯作模式通常是这样:
- ⾸先,可以试图⽤
git push origin branch-name
推送⾃⼰的修改; - 如果推送失败,则因为远程分⽀⽐你的本地更新,需要先⽤
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再⽤
git push origin branch-name
推送就能成功! - 功能开发完毕,将分⽀merge进master,最后删除分⽀。
那么多人协作还有其他一下场景,我们就不一一说了,大家在实际运用中自己体会。
远程分⽀删除后,本地git branch -a依然能看到的解决办法
当前我们已经删除了远程的dev分⽀,使⽤ git branch -a
命令可以查看所有本地分⽀和远程分⽀,但发现在远程仓库已经删除的分⽀在本地依然可以看到。例如:
git remote show origin
使⽤命令git remote show origin
,可以查看remote地址,远程分⽀,还有本地分⽀与之相对应关系等信息。
bash
泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git remote show origin
* remote origin
Fetch URL: git@gitee.com:ZMZZZhao/git_study.git
Push URL: git@gitee.com: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
命令:
bash
泠渊@LAPTOP-TOS5MMUL MINGW64 /d/git_test/git_study (master)
$ git remote prune origin
Pruning origin
URL: git@gitee.com: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分支删除即可。
bash
泠渊@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!