规范
分支管理
main
分支:
主分支,最终的、稳定的、经过测试没有 bug 的、可部署于生产环境的分支
只能由release
和hotfix
分支合并,任何情况下都不能直接修改代码feature/hotfix
分支:
功能模块开发分支,对应于一个特定的功能模块
该分支以dev
分支为基线,完成开发工作后再合并到main
分支
命名规则:feature/NAME
或feature-NAME
热修复分支,当main
分支部署到生产环境后发生紧急状况,需要及时处理时,该分支负责热修复,即在保证应用不下线的条件下,对bug
进行紧急修复
该分支以main
分支为基线,修复bug
后,合并到main
分支部署上线,同时也合并到dev
分支保持最新进度
命名规则:hotfix/NAME
或hotfix-NAME
release
分支:
预发布分支,在发布正式版本前进行全面测试和修复
该分支以main
分支为基线,将需要发布的新功能分支合并到该分支,并进行测试
经过测试没有问题之后,合并到 main 分支部署上线,同时也合并到 dev 分支保持最新进度
命名规则:release/NAME 或 release-NAME分支名称 分支职责 基线分支 合并分支 main
主分支 - - feature
/hotfix
功能模块开发/热修复分支 main
main
,release
release
预发布分支 main
main
main
分支贯穿于整个项目的生命周期hotfix
/feature
、release
分支都是临时分支,分别负责热修复、功能模块开发、预发布
多人协作
任务划分
主仓库 A:管理 main
分支,review 提交的代码,处理冲突
开发者仓库 B:承担主要开发任务
初始状态
新建主仓库 A,开发人员 fork 仓库 A
使用
git clone
将远程仓库 clone 到本地git clone https://github.com/Grosser-Kurfuerst/Cesium_Demo.git
和 fork 的主仓库地址进行关联
git remote add upstream https://github.com/MisakaBryant/Cesium_Demo.git//源项目地址,upstream是远程仓库别名,可以为任意名字
在本地仓库中创建需要的分支,例如
feature
分支,并与远程分支绑定(可以省略绑定,push时会自动创建)git checkout -b feature origin/feature
此时可以使用
git branch
查看本地分支
与主仓库版本保持同步
在开始新的工作前需要拉取当前分支最新的版本
使用git remote -v
命令查看本地仓库连接的远程仓库origin https://github.com/Grosser-Kurfuerst/Cesium_Demo.git (fetch) origin https://github.com/Grosser-Kurfuerst/Cesium_Demo.gitt (push) upstream https://github.com/MisakaBryant/Cesium_Demo.git (fetch) upstream https://github.com/MisakaBryant/Cesium_Demo.git (push)
切换到 dev 分支,获取并合并 upstream 代码
git checkout dev git pull upstream dev
git pull
命令相当于fetch
之后再merge
,与以下命令等价git fetch upstream dev git merge upstream/dev
在本地完成合并之后记得push到自己的远程仓库
开发功能模块
在开发阶段,应当尽量避免发生冲突,同时保持 commit 历史的干净整洁,善用 git rebase
命令可以保证 commit 历史更加整洁
在 main
的基础上创建 feature-measureDistance
分支,并且切换到该分支
git checkout -b feature-measureDistance
将该分支 push 到远程仓库,若远程仓库没有该分支则自动创建
git push origin feature-measureDistance:feature-measureDistance
开发完成后进行 commit
git commit -m "measureDistance finished"
push 到远程仓库
git push origin feature-measureDistance
提交 pull request,与主仓库合并
将 feature
分支合并到 main
分支,提交 pull request,请求合并到主仓的 main
分支
git checkout main
git merge feature
也可以使用 rebase
命令
git checkout feature //注意是在feature分支下rebase
git rebase main
git checkout main
git merge feature
最后 push 到远程仓库
随后就可以在 github 中 open pull request
按要求填写 title 与 comment 之后即可提交
此时主仓库管理员会收到 request,review 代码之后确认没有问题并且没有冲突就可以允许 mergeMerge pull request
有三个选项:
Create a merge commit
:表示把这个 PR 作为一个分支合并,并保留分支上的所有提交记录(不能保持 main 分支干净,但是保留了所有的 commit history,当 PR 中 commit 次数较多时不推荐此方式)Squash and merge
:表示只为这次合并保留一个提交记录(也可以保持 main 分支干净,但是 main 中 author 都是 maintainer,而不是原 author)Rebase and merge
:找到两个分支共同的祖先,然后在当前分支上合并从共同祖先到现在的所有 commit(可以尽可能保持 main 分支干净整洁,并且易于识别 author)
建议使用 rebase
主仓库管理员更新本地仓库,拉取 pull
分支最新代码
git pull origin main
解决冲突
- 两个分支都修改了同一文件(不管什么地方)
两个分支都修改了同一文件的名称
解决冲突之后需要add
以及commit
git add conflict_file git commit -m "fix confilict"
若是分支后出现了 REBASE 或是 MERGING
在解决冲突之后需要 continue rebasegit rebase --continue
版本回退
使用 git reset
将当前分支回退到之前某个 commit 节点
git reset HEAD^
HEAD^
意为 head 指向的版本的前一个版本,HEAD^^
即为前两个版本,而 HEAD~10
为前 10 个版本
同样,也可以将 HEAD
更改为分支名称,如 master^
代表回退到 master 指向的版本的前一个版本
也可以使用版本号进行回退
git reset 版本号
使用 git log --oneline
查看版本号
此外,git reset
有三个选项 ^1bd57b
--soft
: 仅回退本地库中的内容,相当于撤销git commit
--mixed
: (默认方式)同时回退本地库和暂存区内容,相当于进一步撤销git add
--hard
: 同时回退本地库、暂存区和工作区内容,相当于进一步撤销本地仓库文件夹中的改动
[[#^382508|返回命令]]git 命令
1. 新建代码库
在当前目录新建一个Git代码库
git init
新建一个目录,将其初始化为Git代码库
git init [project-name] # 下载一个项目和它的整个代码历史 git clone [url]
2. 配置
显示当前的Git配置
git config --list
编辑Git配置文件
git config -e [--global] # 设置提交代码时的用户信息 git config [--global] user.name "[name]" git config [--global] user.email "[email address]"
3. 增加/删除文件
添加指定文件到暂存区
git add [file1] [file2] ... # 添加指定目录到暂存区,包括子目录 git add [dir] # 添加当前目录的所有文件到暂存区 git add . # 添加每个变化前,都会要求确认 # 对于同一个文件的多处变化,可以实现分次提交 git add -p
删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ... # 停止追踪指定文件,但该文件会保留在工作区 git rm --cached [file] # 改名文件,并且将这个改名放入暂存区 git mv [file-original] [file-renamed]
4. 代码提交
提交暂存区到仓库区
git commit -m [message] # 提交暂存区的指定文件到仓库区 git commit [file1] [file2] ... -m [message] # 提交工作区自上次commit之后的变化,直接到仓库区 git commit -a
提交时显示所有diff信息
git commit -v
- 使用一次新的 commit,替代上一次提交
如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message] # 重做上一次commit,并包括指定文件的新变化 git commit --amend [file1] [file2] ...
5. 分支
列出所有本地分支
git branch
列出所有远程分支
git branch -r
列出所有本地分支和远程分支
git branch -a
新建一个分支
git branch [branch-name] git checkout -b [branch] // 新建一个分支,并切换到该分支 git branch [branch] [commit] // 新建一个分支,指向指定commit git branch --track [branch] [remote-branch] // 新建一个分支,与指定的远程分支建立追踪关系
切换分支
git checkout [branch-name] // 切换到指定分支,并更新工作区 git checkout - // 切换到上一个分支
合并
git branch --set-upstream [branch] [remote-branch] // 建立追踪关系,在现有分支与指定的远程分支之间 git merge [branch] // 合并指定分支到当前分支 git cherry-pick [commit] // 选择一个commit,合并进当前分支
删除
git branch -d [branch-name] // 删除分支 git push origin --delete [branch-name] // 删除远程分支
6. 查看信息
显示有变更的文件
git status
显示当前分支的版本历史
git log
显示commit历史,以及每次commit发生变更的文件
git log --stat
搜索提交历史,根据关键词
git log -S [keyword]
显示某个commit之后的所有变动,每个commit占据一行
git log [tag] HEAD --pretty=format:%s
7. 远程同步
下载远程仓库的所有变动
git fetch [remote]
显示所有远程仓库
git remote -v
显示某个远程仓库的信息
git remote show [remote]
增加一个新的远程仓库,并命名
git remote add [shortname] [url]
拉取远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
上传本地指定分支到远程仓库
git push [remote] [branch]
强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
推送所有分支到远程仓库
git push [remote] --all
8. 撤销
重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]
重置暂存区与工作区,与上一次commit保持一致
git reset --hard
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]
reset选项见[[#^1bd57b|这里]] ^382508
若reset后需要回到最新版本,可以使用
git reflog
查看reset前的版本号,再使用reset回到最新版本即可
新建一个commit,用来撤销指定commit # 后者的所有变化都将被前者抵消,并且应用到当前分支
git revert [commit]