规范

分支管理

  • main 分支:
    主分支,最终的、稳定的、经过测试没有 bug 的、可部署于生产环境的分支
    只能由 releasehotfix 分支合并,任何情况下都不能直接修改代码
  • feature/hotfix 分支:
    功能模块开发分支,对应于一个特定的功能模块
    该分支以 dev 分支为基线,完成开发工作后再合并到 main 分支
    命名规则:feature/NAMEfeature-NAME
    热修复分支,当 main 分支部署到生产环境后发生紧急状况,需要及时处理时,该分支负责热修复,即在保证应用不下线的条件下,对 bug 进行紧急修复
    该分支以 main 分支为基线,修复 bug 后,合并到 main 分支部署上线,同时也合并到 dev 分支保持最新进度
    命名规则: hotfix/NAMEhotfix-NAME
  • release 分支:
    预发布分支,在发布正式版本前进行全面测试和修复
    该分支以 main 分支为基线,将需要发布的新功能分支合并到该分支,并进行测试
    经过测试没有问题之后,合并到 main 分支部署上线,同时也合并到 dev 分支保持最新进度
    命名规则:release/NAME 或 release-NAME

    分支名称分支职责基线分支合并分支
    main主分支--
    feature/hotfix功能模块开发/热修复分支mainmain,release
    release预发布分支mainmain
  • main 分支贯穿于整个项目的生命周期
  • hotfix/featurerelease 分支都是临时分支,分别负责热修复、功能模块开发、预发布

多人协作

任务划分

主仓库 A:管理 main 分支,review 提交的代码,处理冲突
开发者仓库 B:承担主要开发任务

初始状态

新建主仓库 A,开发人员 fork 仓库 A

  1. 使用 git clone 将远程仓库 clone 到本地

    git clone https://github.com/Grosser-Kurfuerst/Cesium_Demo.git
  2. 和 fork 的主仓库地址进行关联

    git remote add upstream https://github.com/MisakaBryant/Cesium_Demo.git//源项目地址,upstream是远程仓库别名,可以为任意名字
  3. 在本地仓库中创建需要的分支,例如 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
image.png|1000
按要求填写 title 与 comment 之后即可提交
此时主仓库管理员会收到 request,review 代码之后确认没有问题并且没有冲突就可以允许 merge
Merge 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
    image.png
    image.png
    在解决冲突之后需要 continue rebase

    git 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]