利用分支实现在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 多出一个分支,
如:
切换本地到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执行成功就忽略)
我们需要手动选择保留自己分支的哪些代码。
在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 "仓库名"
- 不要直接在本地main强制提交到github,可能出现的情况:我们刚pull下的main update后rebase再push main 的这个过程别人更新了main update,这样我们rebase的main 就不是最新的源代码,强制提交会销毁了别人的工作成果。可以参考 更安全的强制提交
- 但是如果是属于自己的分支,就直接
-f
强制提交。 - 为什么强制提交?
Pull Request
该定义:若认为更新足够稳定,将github自己分支更新的代码合并到main branch。
为什么叫pull request:项目主人将功能分支的修改pull到主分支(稳定分支)
选择准备合并的分支
Squash and merge
意思是把所有改变合并成一个改变,然后把这个 commit 放到我的 main branch 上
点击 Delete branch 删除远端的分支,这个时候本地还有。
如果团队成员都按照上述标准执行,squash and merge
不会产生confict,因为已经在rebase中解决了
本地切换回main分支
# 回到主分支
git checkout main(master)