关于提交到 github 之前,在本地仓库的操作
在使用 Git 之前,要先配置一下本地的 Git Bash
配置
一般来说,有如下6行配置,是建议运行的
1 | git config --global user.name [yourName] |
user
这两行是必须执行的,用于告诉 Git 你的个人信息
例如
1 | git config --global user.name Ringoer |
push.default
这个参数有两个可取的值,具体如下
参数值 | 版本 | 行为 |
---|---|---|
matching | 1.x 版本默认 | 上传本地所有分支 |
simple | 2.x 版本默认 | 上传本地当前分支 |
建议手动执行一下该命令,以免出现意外的上传
core.quotepath
用于配置是否开启路径转义,默认值是 true,表示中文路径名或文件名要自动转义为形如 \xx\xx
的类似 unicode 的形式
core.editor
用于指定当 Git 希望打开一个文本编辑器时,执行的命令行。默认值是 vi,表示启动 vim
core.autocrlf
首先了解一下 CRLF、CR、LF 分别是什么
参数值 | 对应转义字符 |
---|---|
CRLF | \r\n |
CR | \r |
LF | \n |
core.autocrlf
用于指定行结束符 LF 和 CRLF 之间的转换,具体如下
参数值 | 提交(commit)行为 | 签出(checkout)行为 |
---|---|---|
true(默认) | CRLF 转换为 LF | LF 转换为 CRLF |
input | CRLF 转换为 LF | 不转换 |
false | 不转换 | 不转换 |
鉴于 Windows 下的行结束符通常是 CRLF,Mac 和 Linux 下通常是 LF,所以最好是选择 input 参数值,以免产生跨平台协作问题
说到 Git 本地操作,那必然也是对某目标的 CRUD。是什么目标呢?是分支
分支(Branch)
首先要了解什么是分支
每当我们想保存代码的时候,往往有很多文件,组成一个项目。这个项目此时此刻的所有状态,合称为一个版本,而这个项目的所有版本,都处于同一个分支之中
Create
一般有两种新增
- 初始化本地仓库时,新增默认的分支
- 已有分支的情况下,新增新的分支
初始化
首先通过 cd
命令进入项目所在目录,然后使用 git init
来完成本地仓库的初始化
初始化完成之后,会在该目录中产生一个 .git
文件夹,这个就是本地仓库
默认分支是 master
,但由于 zzzq 等原因,现在默认分支改名叫 main
初始化完成后,.git
目录下会有一个名为 .gitignore
的文本文档,里面用类正则表达式写法,指明了在提交操作中应该忽略哪些文件
新增
现在我们已经有一个 master
分支了,想要新增一个分支
可以使用 git branch [branchName]
命令来新增分支
假设新分支名为 child
,那么命令就是 git branch child
,此时就新建了一个名为 child
的新分支
注意该操作仅创建了分支,不会自动移动到新分支
Retrieve
查看所有分支情况
可以使用 git branch
查看本地仓库中的所有分支名称
查看当前分支情况
状态
可以通过 git status
命令查看当前分支的状态
通常会显示以下种内容
可以通过 -sb
选项简化显示的内容(只显示文件列表)
日志
日志有两种,log 和 reflog,关于其差别请阅读 重置 部分内容
每条日志都记录了一次提交,包括这次提交的版本号、理由等
可以通过 git log
命令查看当前分支的局部日志(不包括重置操作)
可以通过 git reflog
命令查看当前分支的所有日志(包括重置操作)
Update
要让增删有意义,那么自然是要进行符合我心意的修改了
此处的修改分支,是指修改本地仓库内保存的分支内容
提交
初始化的分支,或是新建的分支,里面都是没有内容的。如何让它充实呢?
可以通过 git commit
命令让它充实。
但是仅仅是 git commit
来上传新版本的话,以后无法查询版本更新信息,所以我们需要 -m 和 -v 参数
-m
git commit -m [string]
表示将 -m 选项后的字符串作为本次提交的理由(备注),使得后续可以查看该版本提交时的相关信息
但是 -m 因为是在命令行中直接给出,人在潜意识影响下会倾向于写短理由,不利于以后查询,所以有了 -v 选项
-v
git commit -v
可以打开 Git 默认的文本编辑器(默认是 vim)来等待用户写入提交理由,直到用户在新打开的文件中写完理由并保存后才会继续提交
因为是在新文件中书写理由,视野比较开阔,会更容易写出更易阅读的理由,所以推荐手动上传时,使用 -v 选项,自动上传时才选择 -m 选项
但是 Git 怎么知道你要上传哪些内容呢?万一你只修改了部分文件,只想上传这一部分,怎么办呢
标记
可以通过 git add [filename]
命令来标记要提交的文件
可以用 git add .
来标记目录下的所有文件(注意点号)
此处的标记,指的是“将要同步到本地仓库当前分支的更新”,一般有三种情况
文件状态 | 释义 | commit 后的行为 |
---|---|---|
New | 新建 | 向本地仓库当前分支中 添加 该文件 |
Modified | 更新 | 修改 本地仓库当前分支中的对应文件 |
Deleted | 删除 | 从本地仓库当前分支中 删除 该文件 |
可见,虽然命令中采用的是 add
短语,但实际上表达的意思是“添加标记”,而不是单纯的“新增”
只有当文件被标记后,才可以在下一次 commit 操作中被提交到本地仓库
怎么办,代码写着写着,发现以前的某个版本更优秀,我想回去————
重置
可以通过 git reset --hard [version]
来切换版本
版本号可以打完整,也可以打前缀,一般选择7位前缀
查看版本号,可以通过 git log
或 git reflog
来查看,或前往 github 网站,通过可视化界面查看
假设现在是版本4,想切换到版本2,那么切换后,log 里只会保留如下内容(简单说法)
- commit 版本1
- commit 版本2
而 reflog 里会保留所有内容
- commit 版本1
- commit 版本2
- commit 版本3
- commit 版本4
- reset 版本2
注意一旦切换版本,将会丢失当前所有修改,请确保备份
如果不想重置所有修改,也可以选择回滚部分事务
回滚
可以通过 git revert [version]
来回滚当前分支上的某次提交事务
可能产生 冲突
Delete
可以通过 git branch -d [branchName]
来删除指定分支
注意删除后该分支所以内容都会从本地消失,请确保已经备份
有很多操作会产生冲突,怎么办呢?
冲突
当发生冲突的时候,首先要找到冲突
前述的 git status
命令,就可以找到现在有冲突的文件
然后我们需要手动解决冲突
假设有文件 1.txt,里面的原内容是 今天是2020年11月16日
,新内容是 今天是1970年1月1日
当要将新内容同步到 1.txt 时,就会发生冲突
此时 1.txt 内容变更为类似如下模样
1 | <<<<<<< HEAD(当前更改) |
可见冲突的格式是以 <<<<<<<
开头,以 >>>>>>>
结尾,以 =======
分隔
所以当我们打开一个可能有冲突的文件时,可以搜索 =======
来快速定位冲突在文件中的位置
此时我们怎么处理这个冲突呢?
可以选择性保留我们想要的字段,假设保留新内容,那么可以对 1.txt 作出如下操作
1 | <<<<<<< master(当前更改) 【删除该行】 |
只保留我们需要的部分,其余部分删除
那刚才创建的新分支又有什么用呢?
多分支
检出
可以通过 git checkout [branchName]
命令来改变 Git 当前所在的分支
该操作称之为 检出
当执行该命令时,会将指定分支的最后一次提交的内容同步到当前目录下
该操作可能会产生冲突
若同步前的文件内容与将要同步下来的内容无冲突,则保留同步前的文件;若冲突,则需要先解决冲突,解决冲突后不需要再次检出
合并
可以通过 git merge [branchName]
命令来将目标分支的内容合并到当前分支下
该操作在完成后,会自动向本地仓库中提交合并的结果,且理由自动设定为 Merge branch [branchName]
,表示此次提交是因为合并而产生的
该操作可能会产生冲突
当产生冲突时,需要按顺序完成以下步骤以完成合并流程
- 解决冲突
git add [冲突的文件]
git commit
(不需要填写理由)
如上,即是 Git 本地操作中最常用的部分内容
谢谢阅读