【git】学习笔记
#
一、git原理#
- git只能跟踪文本文件的变化,比如txt文件、程序代码等。而对于图片、视频等二进制文件的变化,就无法知道变化了哪里。
- git 分支的理解:如下图所示,git分支可以理解为是一个指针以及提交历史组成。
不管git有多少分支,整个git可以理解为是一颗树(包含很多枝杈),不同的分支仅仅是对于不同枝杈的一份快照。
二、git基本操作#
1、撤销修改#
撤销工作区的修改
,用命令git checkout -- file
。撤销暂存区的修改
:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。丢弃提交
:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用命令git reset --hard commit_id
。撤销提交
:git revert HEAD
。在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。替换上一次提交
:提交以后,发现提交信息写错了,这时可以使git commit --amend -m ""
,可以修改上一次的提交信息,并把暂存区有变化的文件一并提交。(相当于重新提交)
2、暂存修改#
当我们在某个分支上工作进行到一半时,需要切换分支进行工作,这是我们不想提交代码,可以通过git stash
命令,将工作现场“储藏”起来。
用git stash list
命令可以查看储存的内容:
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
当我们需要恢复工作现场时,使用**git stash pop**
,这样在恢复的同时把stash内容也删了。
$ git stash pop
On branch dev
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.py
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)
3、复制其他分支的提交修改#
比如我们在master
分支上修复的bug,想要合并到当前dev
分支,可以用**git cherry-pick <commit>**
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
4、标签管理#
git 标签是指向与某次commit的指针的,在一些重要的代码提交上打上标签,可以帮助我们更好的识别和管理我们代码提交的历史。
- 创建标签:
git tag -a <name>
- 创建带描述信息的标签:
git tag -a <name> -m <msg>
- 推送一个本地标签:
git push origin <tagname>
- 推送全部未推送过的本地标签:
git push origin --tags
- 删除一个本地标签:
git tag -d <tagname>
- 删除一个远程标签:
git push origin :refs/tags/<tagname>
三、git分支管理#
在git中创建和切换分支的代价是非常小的,我们应该多用分支。
1、日常开发中使用分支策略#
当我们开发时,应该根据当前任务创建一个新分支进行开发,而不是在dev
分支上进行开发,开发完成后再将开发完成的分支合并到dev
分支。
比如:我们接到一个新的需求:
(dev)$: git checkout -b feature/xxx # 从dev建立特性分支
(feature/xxx)$: blabla # 开发
(feature/xxx)$: git add xxx
(feature/xxx)$: git commit -m 'commit comment'
(dev)$: git merge feature/xxx --no-ff # 把特性分支合并到dev
2、解决分支合并冲突#
当合并代码出现冲突时,必须解决冲突后才能继续提交。
git 使用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改好再提交即可。
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
四、git实践#
1、git 分支规范#
master
dev
feat/xxx
release/xxx
hotfix/xxx
每个仓库有且仅有以下的 分支:
Branch: master 、 dev 、 feat 、 release 、 hotfix
其中:
- master 受保护,不存放源代码,不直接提交代码,所有的 上线文件 需要推送到此分支。
- dev 受保护,主分支,不能直接提交代码,在这个分支只能增加从 feat 合并 过来的 commit。紧急bug除外,紧急bug处理方式看后文bugfix。
- feat 分支需要从 dev 切出,然后开发完成后,提交合并请求到 release 分支进行提测。
- release 分支需要从 dev 切出,用来对项目中各个需求进行合并提测,改 bug 等均在此分支进行,测试成功后,提交合并请求到 dev。
- hotfix 分支需要 dev 切出,待 bug 修复完成后,提交合并请求到 dev。
2、git 标签提交规范#
- 对应每个发布版本的源代码 tag。tag版本号与需求版本一致,从dev分支打tag,命名 release_版本号_日期,如:release_1.0_20200426
- 对应每个发布版本的上线文件 tag。tag版本号与需求版本一致,命名 dist_版本号_日期,如:dist_1.0_20200426
3、提交规范#
- type
- 用于说明 `commit` 的类别,只允许使用下面10个标识。
- feat:新功能(feature)
- fix:修补bug
- docs:文档(documentation)
- style: 格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- perf:性能优化
- test:增加测试
- chore:构建过程或辅助工具的变动
- revert:回退
- build:打包
- scope(可选)
- 用于说明 `commit` 影响的范围,比如Button组件、store、首页、路由等等,视项目不同而不同。
- subject(可选))
- 是 `commit` 目的的简短描述,不超过50个字符。
- 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
- 第一个字母小写
- 结尾不加句号(.)
4、发行版提交(release)#
在Github、码云等源码托管商,提供了release的概念,可以提交我们打包后的项目文件,在标签tag的基础上我们可以添加编译好的二进制文件等,如.deb、.exe等给特定的版本提供更多的信息,方便用户,也方便后期查找特定版本的程序。
作者:Nicander
出处:https://www.cnblogs.com/Nicander/p/17202810.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律