当前位置:   article > 正文

Git详细介绍

Git详细介绍

Git详细介绍

0 基本介绍

1 准备工作

1.1 配置文件

git的配置文件包括3个层级,分别是系统级(system)用户级(global)项目级(local)。低层级的配置会覆盖高层级

系统级:对所有用户生效。位置在git安装目录/etc/gitconfig
用户级:对当前用户生效。位置在~/.gitconfig
项目级:在当前项目文件夹内生效。位置在项目根目录/.git/config

查看配置

// 查看所有生效的配置文件
git config --list

// 查看特定作用域的配置
git config --<层级> --list
  • 1
  • 2
  • 3
  • 4
  • 5

修改配置

git config --<层级> user.name "user"
  • 1

删除配置

git config --<层级> --unset user.name
  • 1

常用的配置信息

// 用户信息
git config --global user.name "xiaoli"
git config --global user.email "xiaoli@sina.com"
    
// 设置默认编辑器
git config --system core.editor "vim"
    
// 指定diff工具。虽然git内置了diff工具,但也支持自定义
# 查看合并和解决冲突的工具列表
git mergetool --tool-help
# 设置差异分析工具
git config --global merge.tool vimdiff
    
// 中文显示。在默认设置下,git status 查询的中文文件名不能正确显示,可设置改正
git config --global core.quotepath false

// 指定代理
http.proxy=http://127.0.0.1:7897
https.proxy=http://127.0.0.1:7897
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

1.2 初始化

本地初始化

// 在当前文件夹创建git项目
git init
    
// 在指定目录创建git项目
git init <文件名>
  • 1
  • 2
  • 3
  • 4
  • 5

从远端项目初始化

git clone <url> [文件名]
  • 1

1.3 .gitignore

gitignore有多个文件来源,依次顺序为:

  1. 从命令行中读取可用的忽略规则
  2. 当前目录定义的规则
  3. 父级目录定义的规则,依次递推(推荐放在git项目根目录)
  4. $GIT_DIR/info/exclude 文件中定义的规则
  5. core.excludesfile中定义的全局规则

2 一次提交内的操作

2.1 文件空间和状态

对比工作区和暂存区差异:git diff
对比工作区和版本库差异:git diff HEAD
对比暂存区和版本库差异:git diff --cached

一些option:
只查看文件名差异,而不看具体内容:--stat

2.2 文件状态查看

可以使用git status查看文件状态

状态颜色提示
未追踪Untracked files,红色
已修改modified,红色
已暂存绿色
未修改,已提交不显示

查看工作区文件:直接查看
查看暂存区文件:git ls-files [--stage]
查看版本库文件:git ls-tree -r HEAD

2.3 工作区和暂存区

工作区存在一份文件。当提交之后,暂存区也存在同样的一份文件。

暂存文件

// 提交所有文件
git add .

// 提交指定文件
git add <文件名>
  • 1
  • 2
  • 3
  • 4
  • 5

删除暂存区的文件

注意是删除文件,不是删除修改。删除后的文件会变成未追踪状态。

// 删除指定文件。
git rm --cached <file>
  • 1
  • 2

同时删除工作区和暂存区的文件

// 同时删除指定文件
git rm <file1> <file2> ...
  • 1
  • 2

撤销工作区的修改(使用暂存区覆盖)

checkout意思为检出,在这里表示取出暂存区的内容覆盖工作区。
注意:只覆盖暂存区对应的文件,如暂存区有文件file1,而工作区有文件file1和file2。则执行之后,只有file1被覆盖,file2不变。

// 若文件未放入暂存区,则恢复到版本库状态。若文件暂存之后还修改,则恢复到暂存时的状态。
git checkout -- <file>
  • 1
  • 2

若想要完全移除暂存区的修改(也就是git status中的绿色文件变为红色),可以使用git reset命令

// 完全移除暂存区文件。等效为用版本库覆盖暂存区。若文件之前是未追踪,则也恢复成未追踪。注意后跟文件时,版本库不会发生变化。
git reset <file>
  • 1
  • 2

2.4 暂存区和版本库

提交文件

将暂存区的文件提交至版本库。提交之后,生成版本号。

// 从暂存区提交
git commit -m "提交描述"
// 直接从工作区提交
git commit -a -m "提交描述"

// 修改提交备注。提交,生成新的版本号,与上一次的提交合并。
git commit --amend
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用版本库覆盖文件

可以使用版本库中的文件覆盖当前工作区和暂存区的文件。

// 【慎重使用】退回HEAD指向的版本,并覆盖暂存区和工作区(和版本库)
git reset --hard HEAD
    
// 【默认】退回HEAD指向的版本,并覆盖暂存区(和版本库)
git reset --mixed HEAD
    
// 退回HEAD指向的版本,并覆盖版本库
git reset --soft HEAD
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3 版本管理

3.1 版本生成

git每一次的commit都会生成版本,对应唯一的commit-id。

3.2 版本回退

版本回退reset

reset用于回退到某一个版本(包括当前版本)或者分支,然后覆盖工作区或者暂存区(参考上文)。

// 利用commit-id回退版本
git reset <commit-id>
    
// 利用HEAD回退
git reset HEAD // 回退到当前版本
git reset HEAD^ // 回退到上一个版本
git reset HEAD~<n> // 回退到前n个版本

// 切换到branch的最新提交
git reset <branch-name>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

版本回退revert(逆操作提交)

// 执行commit-id的逆操作,并生成新的commit-id。注意,①未暂存的文件和修改需要先暂存,②已暂存的文件可能存在冲突,需要解决冲突。
git revert -n <commit-id>
  • 1
  • 2

4 分支管理

4.1 查看分支

// 查看分支信息
git branch -vv

// 查看分支图
git log --oneline --decorate --graph
  • 1
  • 2
  • 3
  • 4
  • 5

4.2 创建分支

// 创建一个新分支
git branch <new-branch> 
    
// 创建并切换分支
git checkout -b <new-branch>
    
// 创建临时分支,查看某commit-id的内容
git checkout <commit-id>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.3 切换分支

git checkout <branch-name>
  • 1
分支切换时的工作中区和暂存区

当分支切换时,存在以下几种情况

  • 未追踪的文件:对于未追踪的文件,由于不受版本库的管理,因此会切换分支时会出现在新分支。
  • 未修改的文件:当工作区和版本库文件一致时,切换分支后,工作区和暂存区与目标分支版本库一致。
  • 分支文件修改,但修改文件当前版本库的blob值目标版本库中该文件的blob值相同,则该文件可以同步过去。
  • 分支文件修改,但当前分支目标分支的版本库中,修改文件的blob值不同,则git会报错。注意:只要有一个文件报错,就无法切换分支。

对分支切换的一种简单理解:

  1. 理想情况下,分支切换时,会首先用目标分支的版本库恢复至工作区和暂存区
  2. 应用原分支中git status显示的修改,包括:未追踪、已修改、已暂存三种类型的操作。
  3. 当文件无法应用操作时(因为两个版本库文件不同),则无法切换分支,git报错。

4.4 stash栈

当切换分支时报错,但必须切换分支时,可以利用stash解决。stash是一个可以保存工作区和暂存区工作状态的栈。当不得不切换分支时,可以先将当前工作区和暂存区存入stash栈,之后再需要时将工作状态出栈。

存(入栈)

// 入栈
git stash
    
// 入栈并注释
git stash save "注释"
  • 1
  • 2
  • 3
  • 4
  • 5

取(出栈)

注意取出时,若本地工作区或者暂存区存在修改文件,则可能发生错误导致终止。
若本地修改且已经提交新版本,取出时若存在冲突需要解决。

// 取出并从栈中删除
git stash pop stash@{<栈编号>}

// 应用栈,但不从栈中删除
git stash apply stash@{<栈编号>}
  • 1
  • 2
  • 3
  • 4
  • 5

清除栈

// 清除特定的栈快照
git stash drop stash@{<栈编号>}

// 清空栈
git stash clear
  • 1
  • 2
  • 3
  • 4
  • 5

查看栈

// 显示整个栈结构
git stash list
    
// 显示栈的具体修改内容,默认为栈顶的修改
git stash show -p stash@{<栈编号>}
  • 1
  • 2
  • 3
  • 4
  • 5

4.5 合并分支

合并分支通常有两种方式:分别是mergerebase。两种分支的区别如图所示。

image-20240721225616552

冲突解决

在分支合并的过程中,如果两个分支修改了同一个文件的同一行代码,则会产生冲突。

解决冲突的过程包括(不确定):

// 1 手动编辑冲突文件
vim <conflicted files>

// 2 添加冲突文件到暂存区,并重新提交
git add ... git commit ...
    
// 3 继续合并
git merge <new-branch>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.6 删除分支

// 删除本地分支
git branch -d <new-feature>
  • 1
  • 2

5 git lfs大文件管理

先挖坑,有空再写

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号