Git的原理与使用

目录

前言

[1 Git使用](#1 Git使用)

[1.1 Git config 使用](#1.1 Git config 使用)

[1.2 git add使用](#1.2 git add使用)

[1.3 git commit使用](#1.3 git commit使用)

[1.4 git log 使用](#1.4 git log 使用)

[1.5 git status 使用](#1.5 git status 使用)

[1.6 git diff 使用](#1.6 git diff 使用)

[2 Git 版本回退](#2 Git 版本回退)

[2.1 git reset 使用](#2.1 git reset 使用)

[2.2 git checkout 使用](#2.2 git checkout 使用)

[3 Git 分支管理](#3 Git 分支管理)

[3.1 git branch 使用](#3.1 git branch 使用)

[3.2 合并分支](#3.2 合并分支)

[3.3 删除分支](#3.3 删除分支)

[3.4 合并冲突](#3.4 合并冲突)

[3.5 分支合并模式](#3.5 分支合并模式)

[3.6 Bug 分支](#3.6 Bug 分支)

[3.7 强制删除分支](#3.7 强制删除分支)

[4 远程操作--理解分布式版本控制系统](#4 远程操作--理解分布式版本控制系统)

[5 标签管理--操作标签](#5 标签管理--操作标签)

[5.1 创建标签](#5.1 创建标签)

[5.2 删除标签](#5.2 删除标签)

[5.3 推送标签](#5.3 推送标签)

[5.4 删除远程仓库中的标签](#5.4 删除远程仓库中的标签)

[5.5 远程仓库普通分支与本地仓库普通建立连接](#5.5 远程仓库普通分支与本地仓库普通建立连接)

[5.6 普通分支的代码合并到主分支](#5.6 普通分支的代码合并到主分支)


前言

在写设计文档中,我们会反复经过多几次修改,需要追溯到第一版,普通的方法就是保存文档,但是当文档累计到较多的数量的情况下,难以维护大量的文档。

这就需要版本控制器:记录每次的修改以及版本迭代的一个管理系统。目前主流的版本控制器就是Git,可以控制电脑上所有格式的文档。

Git 安装和初始化

安装Git(Linux环境 ubantu22)

首先查看系统中是否有git

bash 复制代码
git --version

发现没有git,这就需要我们去安装一个

这里git安装成功。

创建Git本地仓库

我们需要把文档放到Git仓库才可以维护文档

使用git init 初始化git 仓库

bash 复制代码
git init 

接着查看一下.git

.git 隐藏目录下有一些文件,用来追踪管理我们仓库的。

1 Git使用

1.1 Git config 使用

当执行完 git init 成功创建本地仓库后,需要去为本地仓库新增两个配置项:

第一个配置项:name

第二个配置项:email

bash 复制代码
git config user.name "你的名字"
git config user.email "你的邮箱"

例如:

当配置完成后,查看配置:

bash 复制代码
git config -l

删除配置:

bash 复制代码
git config --unset user.name
git config --unset user.email

一台服务器下可以创建多个仓库, 这里的 --global 指的就是当前的两个配置项对于这多个仓库都是生效的。

bash 复制代码
git config --global user.name "abc"
git config --global user.email "123123@qq.com"

删除全局配置项:

bash 复制代码
git config --global --unset user.name
git config --global --unset user.email

不允许在 .git里面下手动修改

.git 属于版本库(仓库),ReadMe为工作区。

工作区的修改:新增、修改、删除,从工作区提交后首先会保存到版本库的暂存区中,接着commit从暂存区放到master中。

修改的工作区内容会写入对象库的一个新的git对象中(暂存区存储的是索引)。

1.2 git add使用

git add 文件名 或者是 git add . (git add . 主要是将当前目录全部提交到暂存区)

1.3 git commit使用

bash 复制代码
git commit "git commit -m "输入你的提交信息描述,例如add first file"

提交成功!

提交多个文件:

然后进行commit

bash 复制代码
git commit -m "add 3 files"

1.4 git log 使用

git log 查看提交日志

bash 复制代码
git log

之前tree .git 和 提交到版本控制器中的变化:

同时我们发现:这里生成了index,这个就是暂存区,add之后的内容都是添加到index里面

查看HEAD指针:

同时也发现:

bash 复制代码
cat .git/refs/heads/master 

这个可以看到最新提交的id

通过使用

bash 复制代码
git cat-file -p d056509997fe20ca59dee3821ec5a0f60c4a6a75

可以查看提交id的内容,可以看到 add 3 files。

Git追踪管理的是修改,而不是文件

1.5 git status 使用

查看当前库的状态

bash 复制代码
git status

1.6 git diff 使用

查看工作区和暂存区之间的差异

bash 复制代码
git diff 文件名

git add

git commit

2 Git 版本回退

版本回退,当改了多版本后,可以通过Git版本回退,可以回退到指定的版本。

这里想要回退到只有 hello git! 的版本。

2.1 git reset 使用

git reset 用于版本回退的,本质就是回退的版本库的内容。

bash 复制代码
git reset [--soft | --mixed | --hard] [HEAD]
  • --soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
  • --mixed 默认选项,使用时可以不用带该参数。该参数作用是将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
  • --hard 参数将暂存区与工作区都退回到指定版本。注意当工作区有未提交的代码时不要用这个命令,因为工作区会回滚,没有提交的代码就再也找不回了,所以使用该参数时要谨慎。

Git回退模式 表格1

回退模式 作用回退范围 工作区 暂存区 版本库 说明
--soft 仅版本库 保留 保留 回退 只回退 HEAD 指针,不改变暂存区和工作区内容
--mixed(默认) 版本库 + 暂存区 保留 清空 回退 回退版本库,并将暂存区重置为指定版本状态(工作区不变)
--hard 版本库 + 暂存区 + 工作区 丢弃 清空 回退 彻底回退到指定版本,所有未提交修改全部丢失

例如,回退到只有 hello git! 的版本:

如果想再回退回去(前提有之前的commit id)

当查看不到 commit id的时候,使用git reflog 可以看到commit id,仍然可以回退。

版本回退的速度非常快的

2.2 git checkout 使用

Git 的撤销修改 如何实现
1) 在工作区写了代码,想要撤销

可以手动修改,但是不推荐

git checkout -- filename 将工作区的文件 回退到最近一次add或者最近一次commit 时的状态

bash 复制代码
git checkout -- ReadMe

2 )在工作区和暂存区写了代码,想要撤销

先git add 放到暂存区

当工作区和暂存区有代码提交,而版本库中的没有代码提交,使用git reset 可以回退到当前版本的。

git reset HEAD 回退到当前版本,也就是把暂存区进行回退

bash 复制代码
git reset HEAD

git reset HEAD^ 表示回退上一个版本

git reset HEAD^^ 表示回退到上两个版本

使用 git reset 后 再使用 git status 查看,发现已经回退到了工作区。

再使用git checkout -- filename 把工作区里面的内容也进行回退。

3 )在工作区、暂存区和版本库中写了代码,想要撤销

git reset --hard 回退到上一版的不包含xxx code 的。

小总结: 这里全是归根于需要远程仓库,撤销的是 前提 commit之后没有push的。撤销的目的就是不影响远程仓库的代码。

把对文件的修改,放到工作区、暂存区和版本库中,进行commit操作,不进行push操作。

git reset HEAD^ 表示回退上一个版本'

工作区 暂存区 版本库 解决方式
xxx code 手动撤销 ------ 不推荐,容易出错 git checkout -- filename ------ 推荐
xxx code xxx code git reset
xxx code xxx code 最新版本 xxx code 上一版 不包含 xxx code 前提条件:commit 之后没有 pushgit reset git reset

如何删除版本库中的文件:
方法1:

先删除工作区的内容,将工作区的变动提交到暂存区,再使用commit 提交到版本库。

方法2

git rm filename 后会把工作区和暂存区里面的都删去,然后再进行最后的commit即可。

3 Git 分支管理

理解分支

master 是主分支

3.1 git branch 使用

查看有哪些本地分支:

bash 复制代码
git branch

HEAD可以指向其他分支,被指向的分支就是当前正在工作的分支。这里的* 跟哪个分支,哪个分支就是当前正在工作的分支。

创建分支:

bash 复制代码
git branch [分支名]

创建后我们发现HEAD还是指向master的

查看两个分支的commit id,这两个commit id 是一样的

切换分支:

bash 复制代码
git checkout [分支名]

原理图

在 dev 分支上做一些修改文件

再切回主分支查看文件,

3.2 合并分支

将dev分支合并到master分支

bash 复制代码
git merge dev

这里有个Fast - forward 就是把master的指向改成dev分支的最新指向

3.3 删除分支

上述在dev分支上的ReadMe文件中添加了一行代码,之后把dev合并到master分支上面去。合并之后,dev分支的使命已经完成了,所以为了节省资源,可以删去dev分支。(这里只能在其他分支上,才可以删除dev分支)

bash 复制代码
git branch -d dev

3.4 合并冲突

先创建并切换分支

bash 复制代码
git checkout -b [分支名]

在dev1分支把 write 改成 1111 并提交

切换回主分支,把ReadMe中的write 改成 2222

去合并分支发现 存在冲突

asciidoc 复制代码
<<<<<<< HEAD
你的代码
=======
别人的代码
>>>>>>> branch-name
 

解决冲突:保留 1111,需要手动解决并进行一次提交操作。

查看分支合并情况:

bash 复制代码
git log --graph --abbrev-commit

3.5 分支合并模式

使用Fast-forward 模式 ,这里不容易分辨是 merge进来的,还是master自己提交的

使用 --no-ff 进行区分

分支策略:主分支是稳定的(线上环境),普通分支(日常开发环境,开发人员提交的代码)

3.6 Bug 分支

1 当在普通分支dev2 上进行修后,切换到主分支可以看到修改,但是这里不想让主分支 看到dev2分支的修改

解决方法:在dev2 上 使用git stash 将工作区上的内容进行一个保存

bash 复制代码
git stash

如果新增一个文件,但是不是被追踪的文件,不能使用git stash 保存起来的

当发现分支有bug时,可以创建一个分支进行修复合并

这里将主分支修复后,切换到普通的开发分支,pop拿出stash里面的

git stash pop 放出来

一般情况可以把主分支合并的普通分支(进行bug修复),之后再把普通分支合并到主分支。

出现合并冲突,在本地普通的分支上的,可以进行直接修改。

在普通分支上修正冲突后提交。

把修改后的普通分支合并到主分支上

3.7 强制删除分支

之前的 git branch -d 的删除是merge完后执行的,这里的强制删除是 在还没有进行merge并且已经进行了提交,这个时候去删除这个分支,git会进行保护我们分支的,git认为只要你创建并提交的分支是有价值的,不能进行随便删除(使用git branch -d 是失败的),需要进行强制删除

bash 复制代码
git branch -D [分支名]

4 远程操作--理解分布式版本控制系统

上述 工作区、暂存区和版本库 都是在本地中的。

github 和码云 都可以进行托管代码

创建远程仓库

远程操作--克隆远程仓库

查看远程仓库

bash 复制代码
git remote

远程操作--向远程仓库推送

本地仓库进行push推送到远程仓库中,例如本地仓库中的master分支 推送到 远程仓库的master分支。

两个分支要进行链接(clone 的时候 本地和远程的master会自动建立分支)

远程操作--拉取远程仓库

将远程仓库的最新内容拉取到本地来。

这里的pull相当于 两个操作:拉取+合并

远程操作--忽略特殊文件

在日常的开发工作中,有些文件或者不应该提交到远端,例如一些数据库密码配置文件,在Git工作区的根目录下创建一个特殊的 .gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件了。

例如:在 .gitignore文件中放.so 和 .ini 后Git就会自动忽略这些文件

但是如果我就像把 b.so强制提交上去,就去使用

方式1:

bash 复制代码
git add -f b.so

方式2:

在 .gitignore 中进行添加

当不知道d.so为什么被忽略,可以使用下方代码进行检查

bash 复制代码
git check-ignore -v d.so

使用git status ,想要简写 git st

bash 复制代码
git config --global alias.st status

例如:

bash 复制代码
git log --pretty=oneline --abbrev-commit

简写修改成:

5 标签管理--操作标签

标签tag ,可以简单的理解为是对某次commit 的一个标识,相当于起了一个别名。例如,在项目发布某个版本的时候,针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义。

同时相较于比较难记的commit id,tag很好的解决这个问题,因为tag一定要给一个让人容易记住,且有意义的名字。当回退到某个版本的时候,直接使用标签就能很快定位到。

5.1 创建标签

给最近一次提交打上标签

git tag 打标签对用commit id

也可以根据commit id 进行打标签

给打上的标签加上一些描述 以及查看打标签的描述

5.2 删除标签

bash 复制代码
git tag -d [标签名]

5.3 推送标签

上述是对本地进行一个标签的操作,接下可以推送到远程仓库

bash 复制代码
git push origin --tags 

5.4 删除远程仓库中的标签

bash 复制代码
git push origin :[删除的标签名]

5.5 远程仓库普通分支与本地仓库普通建立连接

bash 复制代码
git checkout -b [本地仓库分支] [远程仓库名/分支名]

git checkout -b dev origin/dev

这样建立连接后就可以直接使用 git push / pull 这样的短命令

5.6 普通分支的代码合并到主分支

方法1:

对于本地master分支 merge 普通dev分支,再将本地的master分支push到远程仓库(还可以把master分支merge 到普通分支,普通分支解决合并冲突后再去进行merge 到master分支),这样远程仓库的分支就可以包含本地的修改。

本地推送到远程步骤:

第一步:在本地的master分支下 git pull 去远程仓库拉取最新的内容;

第二步:切换到普通分支去合并主分支,解决冲突;然后再切换master分支 去合并普通分支;

第三步:git push推送到远程仓库。

方法2:

提交合并申请单

远程分支删除后,本地git branch -a 依然能看到的解决方法

先查看远程分支:

bash 复制代码
git remote show origin
bash 复制代码
git remote prune origin
相关推荐
阿旭超级学得完17 小时前
Linux基础指令 四(apt,vim,git,cgdb)
linux·服务器·开发语言·数据结构·c++·git·vim
恋喵大鲤鱼1 天前
git mv
git·git mv
Patrick_Wilson1 天前
Git Worktree 原理详解:从 objects / refs 看懂多分支并行与多 Agent 协作
git·面试·ai编程
yaoxiaoganggang1 天前
克隆 Superpowers 的规则库到你的本地(或者直接作为 Git Submodule)
人工智能·经验分享·git·ai编程
Python私教2 天前
用 Claude Code 做大型重构不翻车:分批+Git 兜底+验证闭环的实战流程(2026)
git·重构·ai编程·代码重构·工程实践·claude code
Shawn Dev2 天前
团队协作中的 Git Tag 最佳实践:从入门到精通
大数据·git·elasticsearch
独隅2 天前
Git/GitHub/GitLab/Gitee 核心对比指南
git·gitlab·github
佛山个人技术开发2 天前
GitCode个人技术开发者总结完整使用指南
windows·git·svn·github·gitcode
江华森2 天前
基于 Git 的自动集成交付(Git-Driven CI/CD)实战
git·ci/cd