git 基础3
Collaboration 合作
- Collaboration workflows
- Pushing,fetching and pulling
- Pull requests,issues and milestones
- Contributing to open-source projects
Workflows
Centralized Workflow
示意图如下:
当John想要给Amy传代码的时候,他首先会将文件push到云上的repository,Amy看见之后,会从云上拉去John的代码到本地进行浏览或者修改。如果John和Amy的代码冲突了,那么Amy经过修改之后再将代码Push到云上。在大多数小团队中,都用这种工作流。
Intergration-Manager
对于一些开源项目,有很多contributors,他们的代码并不是完全安全的,所以它们递交的代码并不能直接放到云里。
当有一个contributor想要commit的时候,会从云上的repository中Fork一个新的Repository,然后再从这个新的Repository 中克隆代码。当修改完成递交后,也是递交到这个新的Repository
然后,Contributor会给Maintainer发一个Pull request.当Maintainer收到请求之后,会从新的Repository中拉取Contributor修改后的代码,检查是合格。如果合格,他们就会将代码Push到原本的云端上去
Adding Collaborators
自我们创建了新的Repository 之后,只有我一个人拥有push的权限。我们可以点击绿色的 Invite a collaborator 来给我们伙伴push的权限。
Fetching
因为我们不能时刻和云上的repository保持同步,那么当云上的repository出现了新的commit的时候,本地暂时还没有,我们可以用 git fetch
命令将本地repository与云上的repository保持同步。
但是当我们同步之后,我们本地的状态是这样的:
也就是说现在有两个Master指针,一个是云上的Master指针。我们可以用 git merge origin/master
来将两个指针合并。
我们 git fetch
之后,发现 本地的master和origin/master指向的commit是不同的。
然后我们用 git merge origin/master
将两个master指针合并
结果如下
Pulling
- Pull = fetch + merge
git pull 命令,默认会使用 Three-Way Merge, 但是我们可以通过 git pull —rebase 把merge形式换成rebase
如果本地有一个commit B,云上有一个commit C,那么运行git pull 之后,在本地的 A之后又会跟上commit C,这时候出现了分支。然后再进行Three-Way Merge合并到一起。
- git pull -rebase
git pull -rebase 就是将 本地的MASTER移动到云端 origin/MASTER 之后
我们在github上对readme文件进行一下修改,然后在本地使用rebase操作
直接 git pull
之后,我们得到的 log 信息如下:
git pull --rebase
之后,log 信息如下:
Pushing
一般我们利用 git push
就可以将本地的commit推送到云端去。但是遇到这种情况该怎么办?
这里在确定之前,千万别用 git push -f
因为这个命令会让本地的 C commit 覆盖掉云端上的 D commit,这可能会酿成大祸。
所以遇到本地和云端当前的状态不一样的时候,最好的方法就是先将云端的D commit pull下来,和本地的C commit 合并,然后再用 git push
推送上去,最后的结果如下图:
Sharing Tags
在本地创建一个 tag git tag 1.0
在本地删除一个tag git tag -d v1.0
将tag push到云端去:git push origin v1.0
将tag 从云端中删除: git push origin --delete v1.0
Releases
如果这个版本只是先行版、测试版,可以在下面勾选 This is a pre-release
Release 不是git的特性,而是github特有的,比tag的层级更高
Sharing Branches
如果我们要和其他队友在分支上进行合作,那么就要对分支进行分享。
首先我们新建一个分支:git switch -C feature/change-password
然后我么用 git push -u origin feature/change-password
将这个分支push到云上。
我们可以用 git push -d origin feature/change-password
将分支删除。
使用 git -vv
就能够看到本地分支跟踪的远程分支。
左边的是本地的分支,右边蓝色的的是远程的分支。在没有push上去之前,我们发现 本地有 feature/change-password 分支但远程没有
在git push之后我们发现本地分支追踪到了远程的分支。
使用 git branch -r
能看到远程所有的分支:
在没有push上去之间,云端只有HEAD和main
在push 上去之后,云端有了一个新的 feature/change-password