在大项目如何使用Github进行团队工作 | 青训营;

31 阅读4分钟

利用分支实现在Github上团队合作

克隆或连接仓库

# 克隆仓库
git clone 你的仓库地址
# 连接仓库
git remote add origin 你的仓库地址

此时本地仓库已经连接上远程仓库了,且克隆的branch是main分支,即稳定版本的branch。

本地创建新的Branch

克隆之后要进行自己代码的修改,第一件事是创建并切换到新分支,而不是在main分支上书写代码。

好处:main代表稳定的版本,不会污染到main版本。

# 切换至新分支xxx
git checkout -b "分支名称" 

创建新的Branch要么是单个用户的Branch,要么是单个功能的Branch。

disk不会在乎你当前的branch,此时disk保存的代码就是当前分支的源代码。

接下来就可以修改代码,此时disk里的源代码当然是有变化的,但是git对此一无所知。

此时就可以使用

git diff

通过对比当前branch和disk的源代码给出修改后的代码。

添加到暂存区、提交到本地git

# 添加文件到暂存区
git add "文件名"
# 提交代码到本地Git
git commit

将个人分支的commit提交到github

# 将本地的 git分支 上传至github上的git
git push origin "分支名"

提交后 Github 多出一个分支,

如:

2601653-20230213223604600-1559030792.png

切换本地到Main

在自己不断提交到自己分支的过程中,突然发现团队成员更新了main分支(即有更新的main分支),那么我们要尝试自己的分支最新版是否在main update 下还好使(即是否能将main update 和 my-feature合并)。

  • 首先在本地切换到main分支,然后拉取最新代码
# 切回main分支
git checkout "分支名"
# 将远端修改过的代码再更新到本地
git pull origin master(main)

这两步都会让disk的代码改变了。

  • 回到自己的分支,为了同步main update,尝试合并
git rebase main

解释:git rebase会把feature/mywork分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch),然后把feature/mywork分支更新到最新的master分支,最后把保存的这些补丁应用到feature/mywork分支上。

白话解释:git rebase代表的是先把自己的修改扔一边,然后把main最新的修改拿过来,接着在最新修改的基础上把我的commit尝试弄回去。

git rebase 参考资料

  • 如果产生冲突(git rebase执行成功就忽略)

我们需要手动选择保留自己分支的哪些代码。

在rebase的过程中,也许会出现冲突(conflict)。在这种情况,Git会停止rebase并会让你去解决冲突;在解决完冲突后,用git add命令去更新这些内容的索引(index),然后,你无需执行 git commit,只要执行:

bash
复制代码$ git rebase --continue

这样git会继续应用(apply)余下的补丁。

在任何时候,你可以终止rebase的行动,并且feature/mywork分支会回到rebase开始前的状态。

bash
复制代码$ git rebase --abort
  • 使用rebase而不是merge的好处

相当于是在最新的main update上做了我们自己的修改(弄清楚rebase工作机制就很好理解)

将本地自己分支提交到github

# 将本地git里边的分支 push到github上 (-f --强制提交)
git push -f origin "仓库名"
  1. 不要直接在本地main强制提交到github,可能出现的情况:我们刚pull下的main update后rebase再push main 的这个过程别人更新了main update,这样我们rebase的main 就不是最新的源代码,强制提交会销毁了别人的工作成果。可以参考 更安全的强制提交
  2. 但是如果是属于自己的分支,就直接-f强制提交。
  3. 为什么强制提交?

2601653-20230213223604463-1390000494.png

Pull Request

该定义:若认为更新足够稳定,将github自己分支更新的代码合并到main branch。

为什么叫pull request:项目主人将功能分支的修改pull到主分支(稳定分支)

2601653-20230213223604463-1390000494.png

选择准备合并的分支

2601653-20230213223604650-1702358571.png

Squash and merge 意思是把所有改变合并成一个改变,然后把这个 commit 放到我的 main branch 上

2601653-20230213223604501-582739499.png

点击 Delete branch 删除远端的分支,这个时候本地还有。

2601653-20230213223604688-1560904573.png

如果团队成员都按照上述标准执行,squash and merge不会产生confict,因为已经在rebase中解决了

本地切换回main分支

# 回到主分支
git checkout main(master)