代码提交和同步命令
流程图如下:

第零步: 工作区与仓库保持一致
第一步: 文件增删改,变为已修改状态
第二步: git add,变为已暂存状态
第三步: git commit,变为已提交状态
第四步: git push,变为已推送状态
一般来说,在某个分支下,最常用的操作如下:
代码撤销和撤销同步命令
流程图如下:

已修改,但未暂存
git checkout 与后文的切换分支命令几乎一致,事实上,checkout 作为单个命令有点超载(它承载了很多独立的功能),因此在 Git 2.23 版本中,引入了一个名为 git switch 的新命令,最终会取代 git checkout
已暂存,未提交
这个时候已经执行过git add,但未执行git commit,但是用git diff已经看不到任何修改。 因为git diff检查的是工作区与暂存区之间的差异。
git reset –hard 操作等价于 git reset 和 git checkout 2步操作
已提交,未推送
执行完commit之后,会在仓库中生成一个版本号(hash值),标志这次提交。之后任何时候,都可以借助这个hash值回退到这次提交。
已推送到远程
慎用,一般情况下,本地分支比远程要新,所以可以直接推送到远程,但有时推送到远程后发现有问题,进行了版本回退,旧版本或者分叉版本推送到远程,需要添加 -f参数,表示强制覆盖。
其它常用命令
关联远程仓库
如果还没有Git仓库,需要初始化
如果想关联远程仓库
如果想关联多个远程仓库
查看关联了哪些仓库或者地址
如果远程有仓库,需要clone到本地
如果想把别人仓库的地址改为自己的
配置自己的Git
- 查看当前的配置
全局配置
配置自己的名字
希望别人看到你的commit可以联系到你
有些命令很长,能不能简化一下
git的全局配置一般会存在home目录的 .gitconfig文件。如 /Users/spencer/.gitconfig。
针对指定项目单独设置
针对指定项目的配置会存在项目目录的 .git/config文件。如 /Users/spencer/workspace/common_util/.git/config。
切换分支
新建仓库后,默认生成了master分支
新建分支并切换
查看当前有哪些分支
查看当前本地&远程有哪些分支
切换到现有的分支
更新本地/远端代码 push/poll
将本地master分支推送到远程去
远程分支更新了,需要更新代码
本地有修改,能不能先git pull
git pull 实际上包含了两个操作:fetch和merge。当使用git pull命令时,Git会自动下载最新代码,并尝试将最新代码合并到当前分支。git fetch命令只是从远程库下载最新代码,但并不自动合并到本地分支。
如果我们希望自动合并最新代码到当前分支,并且不需要查看最新代码的变动,可以使用
git pull命令。如果我们只想下载最新代码到本地,并需要查看最新代码的变动后才决定是否进行合并,可以使用
git fetch命令。
撤销操作 reset
恢复暂存区文件到工作区
恢复暂存区的所有文件到工作区
重置暂存区的某文件,与上一次commit保持一致,但工作区不变
重置暂存区与工作区,与上一次commit保持一致
去掉某个commit
reset回退错误恢复
版本回退与前进 status、log、reflog
查看当前状态
查看历史版本
这样的log不好看,可以试试以下命令
检出到任意版本
远程仓库的版本很新,但是还是想用老版本覆盖
觉得commit太多了? 可以使用rebase将多个commit合并为1个
想回退到某一个版本
想回退到上一个版本,有没有简便方法?
回退到上上个版本呢?
回退错了,想到下一个版本
刚才commit信息写错了,修改上一次提交的commit信息
分支合并 merge
每个分支上都有各自独有的提交,这意味着没有一个分支包含了修改的所有内容。因此通过合并分支来解决这个问题。
git merge 用来做分支合并,将其他分支中的内容合并到当前分支中。比如分支结构如下:

其它分支合并到master分支
当前分支是master
把issueFix中的内容Merge进来:
如果没有冲突的话,merge完成。有冲突的话,git会提示那个文件中有冲突,比如有如下冲突:
可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时检出的分支)中的内容,下半部分是在 issueFix 分支中的内容。
解决冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来解决:
这个解决方案各采纳了两个分支中的一部分内容,而且删除了 <<<<<<<,=======,和>>>>>>> 这些行。在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决(resolved)。因为一旦暂存,就表示冲突已经解决。
合并后的分支图如下:
注意,这次合并的实现,由于当前 master 分支所指向的 commit (C4)并非想要并入分支(issueFix)的直接祖先,Git 不得不进行一些处理。就此例而言,Git 会用两个分支的末端(C4 和 C5)和它们的共同祖先(C2)进行一次简单的三方合并。对三方合并的结果作一新的快照,并自动创建一个指向它的 commit(C6)
退出合并工具以后,Git 会询问你合并是否成功。如果回答是,它会为你把相关文件暂存起来,以表明状态为已解决。然后可以用 git commit 来完成这次合并提交。
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream-to origin/。
master分支合并到当前分支
以下是合并master分支到你的当前分支的基本步骤:
确保在正确的分支上:首先,确保当前所在的分支是想要合并master分支到的地方。例如,如果想要将master合并到feature-branch,需要先切换到feature-branch:
更新分支:在合并之前,最好先更新分支,以确保它是最新的。可以通过拉取master分支的最新更改来实现这一点:
这会从远程仓库的master分支拉取最新的更改,并尝试将它们合并到你的当前分支。如果master分支有新的提交,这可能会导致合并冲突。
- 合并master分支:一旦分支是最新的,可以开始合并过程。使用git merge命令来合并master分支:
这会将master分支的更改合并到当前分支。如果两个分支之间没有冲突,合并将自动完成。如果有冲突,Git会告诉你哪些文件有冲突,此时就需要手动解决这些冲突。
- 解决冲突(如果有):如果合并过程中出现冲突,Git会暂停合并并告诉你哪些文件需要手动解决冲突。你需要打开这些文件,找到并解决冲突。解决冲突后,使用以下命令标记冲突已解决:
然后继续合并:
这将创建一个新的合并提交,包含所有解决的冲突。
- 推送更改:一旦合并完成并且所有冲突都已解决,你可以将更改推送到远程仓库:
确保替换feature-branch为你的分支名称。
注意事项
在合并之前,始终确保你的分支是最新的,以避免不必要的冲突。
如果你在合并过程中遇到问题,可以使用
git merge --abort来中止合并并返回到合并前的状态。使用git log或gitk可以帮助理解分支的历史和可能的冲突点。
Git代码管理规范
分支命名
master 分支
master 为主分支,也是用于部署生产环境的分支,需要确保master分支稳定性。master 分支一般由 release 以及 hotfix 分支合并,任何时间都不能直接修改代码。
develop 分支
develop 为开发环境分支,始终保持最新完成以及bug修复后的代码,用于前后端联调。一般开发的新功能时,feature分支都是基于develop分支创建的。
feature 分支
开发新功能时,以develop为基础创建feature分支。
分支命名时以 feature/ 开头,后面可以加上开发的功能模块, 命名示例:feature/user_module、feature/cart_module
test分支
test为测试环境分支,外部用户无法访问,专门给测试人员使用,版本相对稳定。
release分支
release 为预上线分支(预发布分支),UAT测试阶段使用。一般由 test 或 hotfix 分支合并,不建议直接在 release 分支上直接修改代码。
hotfix 分支
线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支。修复完成后,需要合并到 master 分支和 develop 分支。
分支命名以hotfix/ 开头的为修复分支,它的命名规则与 feature 分支类似。
分支与环境对应关系
在系统开发过程中常用的环境:
DEV 环境(Development environment):用于开发者调试使用
FAT环境(Feature Acceptance Test environment):功能验收测试环境,用于测试环境下的软件测试者测试使用
UAT环境 (User Acceptance Test environment):用户验收测试环境,用于生产环境下的软件测试者测试使用
PRO 环境(Production environment):生产环境
对应关系: 分支功能环境可访问master主分支,稳定版本PRO是develop开发分支,最新版本DEV是feature开发分支,实现新特性否test测试分支,功能测试FAT是release预上线分支,发布新版本UAT是hotfix紧急修复分支,修复线上bug否
分支合并流程规范
业界常见的两大主分支(master、develop)、三个辅助分支(feature、release、hotfix)的生命周期:
以上生命周期仅作参考,不同开发团队可能有不同的规范,可自行灵活定义。
Git Commit Message规范
Git commit message规范指提交代码时编写的规范注释,编写良好的Commit messages可以达到3个重要的目的:
加快代码review的流程
帮助我们编写良好的版本发布日志
让之后的维护者了解代码里出现特定变化和feature被添加的原因
Angular Git Commit Guidelines
业界应用的比较广泛的是Angular Git Commit Guidelines:
type:提交类型
scope:可选项,本次 commit 波及的范围
subject:简明扼要的阐述下本次 commit 的主旨,在
Angular Git Commit Guidelines中强调了三点。使用祈使句,首字母不要大写,结尾无需添加标点body: 同样使用祈使句,在主体内容中我们需要把本次 commit 详细的描述一下,比如此次变更的动机
footer: 描述下与之关联的 issue 或 break change
简易版
项目中实际可以采用简易版规范:
type规范
Angular Git Commit Guidelines中推荐的type类型如下:
feat: 新增功能
fix: 修复bug
docs: 仅文档更改
style: 不影响代码含义的更改(空白、格式设置、缺失 分号等)
refactor: 既不修复bug也不添加特性的代码更改
perf: 改进性能的代码更改
test: 添加缺少的测试或更正现有测试
chore: 对构建过程或辅助工具和库(如文档)的更改
除此之外,还有一些常用的类型:
delete:删除功能或文件
modify:修改功能
build:改变构建流程,新增依赖库、工具等(例如webpack、gulp、npm修改)
test:测试用例的新增、修改
ci:自动化流程配置修改
revert:回滚到上一个版本
单次提交注意事项
提交问题必须为同一类别
提交问题不要超过3个
提交的commit发现不符合规范,
git commit --amend -m "新的提交信息"或git reset --hard HEAD重新提交一次
配置.gitignore文件
.gitignore是一份用于忽略不必提交的文件的列表,项目中可以根据实际需求统一.gitignore文件,减少不必要的文件提交和冲突,净化代码库环境。
通用文件示例:
其他
此外,还有一些其他建议:
master 分支的每一次更新,都建议打 tag 添加标签,通常为对应版本号,便于管理
feature分支、hotfix分支在合并后可以删除,避免分支过多管理混乱
每次 pull 代码前,提交本地代码到本地库中,否则可能回出现合并代码出错,导致代码丢失
学习书籍及网站
推荐书籍:
在线学习
- git在线学习网站: https://learngitbranching.js.org/
