本文利用 GitHub 平台进行一个多人项目开发流程的演练,以加深课上所学内容。
参考文献:五⼤场景玩转 Git,只要这一篇就够了!git
一个多人项目一般是从远程建立新仓库开始,这里咱们在 GitHub 新建一个仓库 git101 :vim
新建仓库时我添加了 .gitignore 文件来进行一个初始化提交,否则默认一个空项目后面很差画图演示。.gitignore 文件顾名思义,在里面指定的文件或文件夹都不会被 Git 跟踪,一般用于指定一些只有本地会用到的文件或者保密性高的私人文件。bash
值得一提的是,因为某个国家某些自身缘由,10月1日开始,GitHub 新仓库的默认分支名都由原来的 master 变成了 main ,须要改回来的话要手动设置,这里我懒得设置了,main 就 main 吧。ssh
一般一个多人项目须要在项目中把全部的成员包含进来,给他们写权限,这样才能推送本身的代码到远程,这里简单起见,就以网页端直接修改文件模拟另外一位小伙伴的工做。项目路径有 http 和 ssh 两种,它们的区别是: http 不须要额外配置,但推送代码的时候须要验证身份;ssh 使用秘钥通讯,推送时不须要验证,但须要额外配置,由于我配置过 ssh ,就直接用 ssh 路径了:fetch
如今能够开始工做了,首先将项目克隆到本地而后查看一下仓库分支和提交状态:3d
# 克隆项目 git clone 项目地址 # 查看全部分支 git branch -a # 查看提交记录 git log --oneline
能够看到添加 .gitignore 时生成的提交记录以及分支状态,注意,有一条 remotes/origin/main 分支,这条分支只用于同步远程仓库相应分支的状态,不可直接在这些分支上进行操做,后面同步远程代码时会展现它的用法,因此目前仓库的分支状态如图所示,一个节点表明一个提交记录,分支和HEAD指针经过虚线指向提交记录:指针
一般团队中的每一个人负责一个模块的开发,不能直接在主分支上作开发,要保持它的整洁,这里咱们新建一个 dev 分支,在上面作三次提交:code
# 新建并切换到 dev 分支 # 至关于两条命令:git branch dev && git checkout dev git checkout -b dev # 将所作修改存到暂存区 git add . # 提交到本地仓库 git commit -m "提交说明,没有空格可不用双引号"
此时分支状态如图:blog
工做完成后,就须要将所作修改合并到主分支了,但在合并以前,咱们每每须要对开发分支的提交记录进行一些整理以保持提交记录整洁,好比上面的所作的三次提交,或许咱们发现 d2 和 d3 所作工做其实干了同一件事,或者 d2 只是随手提交了一个没什么意义的 log,总之因为种种缘由,我不想让 d2 出如今最终提交记录里面了,这时候就能够用 rebase 整理一下提交记录:开发
# 整理 HEAD 向前三个提交 git rebase -i HEAD~3
以后会用 vim 打开一个修改提交记录的文件,里面有删除合并等各类修改说明,这里咱们想删除 d2 ,因此将前面的 pick 改为 drop:
保存退出后不出意外是有冲突的,由于 d3 是基于 d2 修改的,如今 d2 没了,就须要解决 d3 产生的冲突,咱们能够随时用 git status
查看工做区状态:
这里提示 dev.txt 文件存在冲突,那咱们就打开 dev.txt ,修改冲突到 d3 的状态后加入暂存区而后继续剩下的 rebase 工做:
# 继续未完成的 rebase 工做 # 若是想撤销 rebase ,使用 --abort 参数 git rabase --continue
rebase 完成以后还会打开一个 d3 的提交记录文件,由于修改过这条分支上的提交记录,理应在最新的提交记录上作一下说明,这里我就不作修改了:
整理提交记录后就变成了这个样子:
合并到主分支很是容易,只须要切换到主分支而后 merge 便可,但在此以前,咱们还有些事要办。
团队项目不仅有一我的,在咱们完成工做时,有可能其余人已经率先提交了工做,这里在网页端修改 .gitignore 文件来模拟远程提交:
这里我清空了 .gitignore 文件的内容并添加了一行 *.log
,这表示忽略全部以 .log 结尾的文件,最后将此次提交命名为 r1 ,这时候远程仓库的分支状态发生了改变:
当远程存在更新的提交记录时咱们必定不能作合并工做,要始终保持主分支和远程仓库一致。
通常在咱们对和远程仓库有关联的本地分支作任何修改时都应该先拉取分支状态,这一般只须要 git pull
便可搞定,它至关于 git fetch && git merge origin/main
两条命令,在这里我想演示一下远程分支 origin/master 的做用,因此将两条命令分开执行:
# fetch 的做用: # 1. 从远程仓库下载本地缺失的提交记录 # 2. 更新远程分支(origin/master)到最新状态(注意,本地分支没动) git fetch # 合并 origin/master 到 main 分支 git merge origin/master
fetch 后的状态:
merge 后:
至此,本地主分支终于和远程同步了,能够放心的合并开发分支了:
# 合并 dev 到 main git merge dev
能够看到合并时默认会多出来一个合并节点,暂且叫它 m1 吧,合并后的状态:
查看分支状态也可使用 gitk
命令,只是不怎么好看:
这里还有个问题,合并分支时,若是在分叉后主分支没有更新的提交记录,merge 默认行为是快进式合并,就是直接把 dev 分支上面的提交记录拿过来而不是新建合并节点,这样作没法保留分支开发的历史,一般咱们须要加上 --no-ff 参数来取消默认行为,它们的区别见下图:
这下本地功能开发完成,也进行了合并,能够放心的推送到远程仓库啦:
git push
完成后远程仓库分支也进行了更新:
登陆 GitHub 查看,dev.txt 也已经出现: