【Git】使用PR进行项目管理
目录
1 单独 master 分支
使用以下命令可以实现代码根提交
git add . # 将修改的内容暂存起来
git commit -m "commit message" # 将暂存的内容提交
git push origin master # 推送至远程库
多次提交则会有多个 commit 节点
在大型项目的多人开发合作中,如果只有一个 public 下的 master 分支,对于代码库来说非常危险,极其容易因为错误删除某些重要文件、文件夹导致仓库崩溃。
2 多分支结构
2.1 分支创建
因此使用分支是非常必要的,分支之间相互独立,因此在修改时并不会对其余分支造成影响。先假设上述的 third commit 节点所修改的代码如下:
int main(int argc, char *argv[])
{
cout << "master2" << endl;
return 0;
}
现创建分支 test1,使用命令:
git branch test1
git checkout test1
即可创建一个新分支 test1 ,除此之外也可以使用如下命令:
git checkout -b test1
做出如下修改,并提交至分支 test1
int main(int argc, char *argv[])
{
cout << "master2" << endl;
cout << "test1" << endl;
return 0;
}
提交节点图如下:
2.2 分支合并
使用git merge
可以实现分支间的代码合并
git checkout master # 切换至主分支
git merge test1 # 合并
节点图如下,此时 master 节点与 test1 节点重合,完成合并,但无法直接看出分支见的相互关系。
即使test1分支提交多次,再合并至master分支也无法看出两者之间的关系,如下图
除此之外,merge 也无法实现代码审查的功能,若某分支删除了某些重要内容,并且该分支在时间线上领先于主分支,merge 时将会修改 master 的内容,与单 master 分支一样,很不安全。
2.3 合并请求
pull request:让别人拉取自己代码的请求
2.3.1 分支保护
若需要让 master 主分支不被任意删除、合并、推送,需要设置分支保护。不同的代码托管平台操作不一样,但都彼此相似:在设置中对 master 设置为保护分支,并且禁止推送。
2.3.2 提交代码基本流程
由于直接推送本地 master 分支已经不可行,因此首先需要新建分支,并且在分支上进行完成开发、提交,这里继续以上文的 test1 为例,现已将 test1 推送至 origin/test1 远程库。
假设 test1 分支领先于 master 一次 commit,如下图。
若需要合并至 master 则需要发起Pull Request(合并请求)。具体流程如下:
- 在仓库界面找到以下内容,并点击创建合并请求
- 选择需要拉取的分支以及合并的分支,点击创建合并请求
- 输入相关信息,创建PR
- 可随时进行评论、等待评审人评审代码,合并前需删除 WIP!此处需要留意能否自动合并,不能则需要解决冲突。
- 评审代码:
可以发布评论、通过、请求变更。通过后会显示批准合并:
- 发布合并信息,最终确认合并
- 显示以下内容则说明成功合并,下方弹出的删除分支 ‘test1’ 可斟酌考虑是否删除
Git Graph 显示如下
2.3.3 合并冲突解决方案
首先准备不同于 master 的两个分支test1、test2。其中三个分支的代码如下
master、origin/master:
int main(int argc, char *argv[])
{
cout << "test" << endl;
return 0;
}
test1、origin/test1:
int main(int argc, char *argv[])
{
cout << "test" << endl;
cout << "new test1" << endl;
return 0;
}
test2、origin/test2:
int main(int argc, char *argv[])
{
cout << "test" << endl;
cout << "new test2" << endl;
return 0;
}
Git Graph 显示如下
假设按照次序,先合并分支test1至master。此时若再次合并 test2,则会有合并冲突,此时的合并步骤如下:
- 仿照【2.3.2】的内容发起 pull-request,提示有合并冲突
-
切换到 test2 分支,从远程库拉取 master 主分支的代码:
git pull origin master # 注意是在 test2 分支下,而不是 master ,因为 master 修改后提交也不能推送
提示:(自动合并失败,修正冲突然后提交修正的结果。)。此时Git Graph显示如下:
-
解决冲突,并推送至 origin/test2
git push origin test2
- 此时再看 origin/master 分支,提示:(允许合并请求)
-
合并请求,拉取远程主分支至本地库进行更新:
git pull origin master # 此处更新只是为了在本地观察 master 与其他分支间的相对关系,对代码提交无作用
Git Graph显示如下:
3 注意事项
- 切记不要在主分支 master 上修改、commit 代码,因为这样无法推送至 origin/master,并且在以后其余开发者推送至 origin/master 后,再次 pull 时会产生合并冲突。主分支 master 在本地库是用来看的,用来获取其余分支与自己的关系的,不能对其进行修改。
- 在每次分支合并之后都可以在 master 分支拉取来自远程端的 origin/mater ,以查看当前最新代码
- 可使用 git 图形化插件显示 commit 节点,使用 vscode 编辑器的可使用 Git Graph 插件