Git 基础配置
Git 基础用法
文件缓存
- 缓存区:已经修改、等待后续提交的文件
- 将文件加入缓存区:
git add file/folder
git add .
(把当前文件夹中所有修改过的都添加到暂存区)- 只会添加修改过的文件
- 删除文件的几种情况:
- 只在本地删除版本库中不存在的文件:
rm
- 同时删除本地和版本库中的文件:
git rm
/ 先rm
再add
- 将一个已暂存的新文件取消暂存:
git rm —cached
- 重命名文件:
git mv
(等价于mv
+git rm
+git add
)
- 查看当前工作区和暂存区状态:
git status
- 文件三个类别:未跟踪(Untracked)、已追踪(Tracked)、被忽略(Ignored)
关于 .gitignore
.gitignore
- 存放在版本库根目录下的名为
.gitignore
的文件,规定忽略哪些文件
- 语法:
#
开头的行为注释*
通配多个字符,**
通配中间目录(有或无)*.c
匹配所有C文件,a/
/b
匹配a/b
、a/x/b
、a/x/y/b
等/
开头只匹配根目录,否则匹配所有目录!
取消忽略- …
- Git - gitignore Documentation
git check-ignore -v file
: 查看某个文件是否被忽略,以及匹配的规则
- 常用语言的
.gitignore
模板:github/gitignore
提交更改
- 将暂存内容提交到本地仓库,生成一个新版本
git commit
:默认编辑器编辑提交信息git commit -m “message”
-a (—all)
自动暂存所有更改的文件
- 查看提交历史:
git log
--oneline
:每一个提交一行--graph
:显示分支结构--stat
:显示文件删改信息-p
:显示详细的修改内容
- 每个提交都有一个唯一的 sha-1 标识符(40位十六进制数)
git show id
:显示提交详细信息(id 在不重复前提下可以只写前几位)
- 检出之前的某一版本:
git checkout id
关于 commit message
commit message
- 意义是什么:记录更改的原因/内容,方便定位/回溯(特别是合作项目)
- Angular规范:(来源:angular/angular:CONTRIBUTING.md)
type
:更改类型fix
:修bug之类的feat
:添加新特性docs
:修改文档refactor
:重构perf
:提交性能test
:测试相关ci
:持续集成相关的东西- 重大更改可以写
BREAKING CHANGE
或DEPRECATED
(全大写)
scope
:影响范围(可选,比如具体影响的模块等)
summary
:更改的简要描述,英文一般现在时,首字母小写句末无句号
body
:详细描述,可选
footer
:解决 issue 了可以写Fixes #id
或Closes #id
版本控制的“版本”:
- 创建标签:
- 轻量标签:
git tag tag id
(id 可选,默认为 HEAD) - 附注标签:
git tag -a tag -m “message” id
- 查看标签:
git tag
- 版本号命名一般规范:Semantic Versioning 2.0.0
- v 主版本号 . 次版本号 . 修订号[ - 预发布的版本号 ]
- 修订号:兼容修改,修正不正确的行为
- 次版本号:添加新功能,但是保持兼容
- 主版本号:不兼容的 API 修改
- 且为0时表示还在开发阶段,不保证稳定性
- 预发布版本号:alpha/beta/rc.1/rc.2/….
- e . g . v1.0.0-beta < v1.0.0-rc.1 < v1.0.0 < v1.0.1
detached HEAD 问题
- 什么是
HEAD
:当前工作区在提交历史中的指针
- 什么是
detached HEAD
:HEAD
指向某个历史提交,而不是某个“分支”
- 什么情形会出现
detached HEAD
: git checkout id
,此后的修改不会出现在任何分支- 切换回
master
后会出现一条不属于任何分支的提交(相当于修改会丢失) - 如何解决:在 F 的位置上
git checkout -b branch
创建并检出新分支
分支
- 创建分支:
git branch name
:基于当前 HEADgit branch name id
:基于 id 提交
- 查看分支:
git branch
(带 -a 显示远程分支)git show-branch
更详细
- 切换分支:
git checkout name
git checkout -b name
:创建并切换
- 内容比较:
git diff branch1 branch2
:比较两个分支git diff branch
:比较工作区和分支git diff
:比较工作区和暂存区
如何更方便地定位提交
- 什么是分支名:和
HEAD
一样,也是一个指针(实际上叫引用 ref)
- 可以基于
ref
适用~
或^
定位父提交 ~
表示第一个父提交,~2
表示第一个父提交的第一个父提交^
表示第一个父提交,^2
表示第二个父提交
- 一个提交可能会有多个父提交(
merge commit
)
合并
- 将多个分支的更改都合并到当前分支:
git merge branch1 branch2 …
几种 merge 的情况:
- 当前分支只比被合并分支多提交:
already up-to-date
- 被合并分支只比当前分支多提交:
fast-forward
(将HEAD
指向被合并分支)
- 都有新的提交:产生一个
merge commit
- 有冲突需要手动解决冲突(
add
后再次commit
生成merge commit
) - 例:若已经产生了冲突,可以通过
git status
查看冲突情况; - 接下来,可以通过
git ls-files -s
具体查看冲突情况;第二列的值如果未0表示对应的文件没有冲突,合并成功;如果不为0,则表示产生了合并的冲突,其中具体的值对应的意义是:1表示两个用户之前一个共同版本对应的文件内容;2表示当前用户对应的文件版本;3表示合并后的文件对应的远程版本 - 通过
git show :n:filename
查看对应文件的对应版本的内容(n为1/2/3)
实际上
merge
操作一般都在 Github 上通过 PR 完成,两种特殊的 merge
方法:squash merge
:讲目的分支多出的所有提交压缩为一个新提交并入当前分支
rebase
:变基- 命令行直接
rebase
会将当前分支接到目标分支后 - 这种情况会导致提交历史更改,同步会有冲突,合作时不推荐
- 通过 GitHub PR rebase merge 会将目标分支接在当前分支后