Git介绍及用法

这篇blogs算是读git官方的这个 Pro Git Book 整的一个笔记。很多都是直接cv的。这篇blogs就看了他的前两章,后面的像是在服务器上搭建Git之类的之后再说吧。 # Git历史

版本控制发展

本地版本控制->集中版本控制->分布式版本控制

Git是在linux的开发过程中,在分布式版本控制系统bitkeeper收回免费linux开发组对该系统的使用权力后,由linus牵头写的一个版本开发系统,有简单而快速、支持并行开发、完全分布式、支持超大规模项目管理的特点。

思路与优势

Git的思路是每次存下一个文件快照的索引,每当提交更新,他就会做一个快照,并保存这个快照的索引。为了效率,如果有文件没有更改,他就不会重新储存,直接保留一个连接指向之前存过的文件的。在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。

这和之前的例如CVS、Subversion、Perforce按照类似于记录下各个版本之间的差异,按照类似于补丁的形式给记录下来,(通常称作基于差异(delta-based)的版本控制)。Perforce 的话,没有连接服务器时几乎不能做什么事;而用 Subversion 和 CVS 的话, 你能修改文件,但不能向数据库提交修改(因为你的本地数据库离线了)。

Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)已修改(modified) 和 已暂存(staged)

  • 已修改表示修改了文件,但还没保存到数据库中。
  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交表示数据已经安全地保存在本地数据库中。

这会让我们的 Git 项目拥有三个阶段:工作区(某个版本独立出来让你改的)、暂存区(一个Git仓库目录的文件,写了下次提交要上报什么东西)以及 Git 目录(.git)。

Git安装

  • linux(Debian系为例):sudo apt install git-all
  • MacOS:git --version之后跟着系统提示走就行,直接用二进制安装程序详见Git官网:Git - Downloading
  • Windows:直接用二进制安装程序详见Git - Downloading Package
  • 源码编译:详见Git - 安装 Git,这个我觉得没必要还耗费时间,有兴趣可以自己做一下。

Git配置

用Git自带的工具git config。具体变量会存在三个位置:

  1. 系统内全部用户:/etc/gitconfig ,如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。注意这个是系统配置文件,要sudo。

  2. 当前用户:~/.gitconfig 或 ~/.config/git/config ,你可以传递 --global 选项让 Git 读写此文件,这会对你系统上所有的仓库生效。

  3. 当前使用仓库: .git/config,你可以在该仓库下传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。

每一个更细的级别会覆盖上一个大级别级别的配置。

在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER )的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。 如果你在 Windows 上使用 Git 2.x 以后的版本,那么还有一个系统级的配置文件,Windows XP 上在 C:\Documents and Settings\All Users\Application Data\Git\config ,Windows Vista 及其以后的版本在 C:\ProgramData\Git\config 。此文件只能以管理员权限通过 git config -f <file> 来修改。

1
2
3
$ git config --list --show-origin #查看所有的配置以及它们所在的文件
$ git config --list #查看所有的配置
$ git config --list <key> #查看某项配置 eg:git config user.name

用户信息

安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:

1
2
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

这个 --global 从上文可知是当前用户下的配置,如果要在特定项目下配其他的话在此项目中用去掉 --global 的命令就行。

IDE配置

一般来说在linux下会直接用系统默认的文本编辑器,更换编辑器命令(以emacs为例):

1
$ git config --global core.editor emacs

Windows 系统上,指定可执行文件的完整路径即可。

Git帮助

1
2
3
$ git help <verb>      #eg:git help config(找git config)
$ git <verb> --help #eg:git add -h
$ man git-<verb>

Git拉包

在已存在的目录中初始化仓库

在当前目录下:

1
2
3
4
git init #初始化,创建.git子目录,是git仓库中所有的必须文件
git add *.c
git add LICENSE
git commit -m 'initial project version'

克隆现有的仓库

Git克隆的是该仓库服务器上几乎所有数据,默认是没一个版本都会拉下来

在目标克隆目录下:

1
2
git clone https://github.com/libgit2/libgit2 
git clone https://github.com/libgit2/libgit2 mylibgit #自定目录名

这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹, 从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。 如果你进入到这个新建的 libgit2 文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。

传输协议之后再写。

Git上传(zzzz)

文件的状态变化周期:

![[file-20250604000404216.png]]

接下来根据这个文件状态变化周期来进行叙述:

跟踪新文件与暂存更改

只有把文件添加到更新下面之后才能进行版本控制!新建文件后仍为未跟踪状态,需要执行 git add <文件> 将其转为已暂存,后续所有提交都只包含暂存区的内容;git add 也可接受目录路径,递归跟踪目录下所有文件。

1
git add .  #添加全部的文件

注意有的时候你中途add进去一个新文件,在add之后在上传时,上传的是你add时的版本,再次修改的文件还在非暂存区中,需要重新add。

忽略不需要版本控制的文件

在项目根目录(或子目录)创建 .gitignore,列出要忽略的模式(支持 glob 语法);

1
2
3
4
5
6
*.o        # 忽略所有 .o 文件 
*.a # 忽略所有 .a 文件
!lib.a # 但跟踪lib.a
*~ # 忽略 Emacs 自动保存的临时文件
/TODO # 只忽略仓库根目录下的 TODO 文件,匹配模式防止递归
build/ # 忽略任何目录下名为 build 的文件夹,指定文件夹递归入库

查看文件状态

  • git status:显示当前分支、与远程分支的关系,以及“已暂存”和“未暂存”更改、和“未跟踪”文件;
  • git status -s(或 --short):以紧凑格式显示状态

查看修改细节

在提交前,应先用 git status 确认所有需要包含的修改都已暂存,然后再检查差异。

有一点需要注意的是,若只想看“未暂存”的修改,直接运行 git diff;若想查看“已暂存且待提交”部分,可用 git diff --cached(或 --staged)。

移除文件

1. 彻底移除(工作目录 & Git 仓库)

 git rm <file>

  • 从工作目录中删除文件。
  • 将删除操作暂存(记录到暂存区)。
  • 提交后,文件将不再被 Git 跟踪,且从磁盘消失。

2. 仅移除 Git 跟踪(保留文件在工作目录)

git rm --cached <file>

  • 将文件从 Git 的跟踪列表和暂存区移除。
  • 保留文件在工作目录中,使其成为未跟踪文件。
  • 适用于误添加到暂存区但需保留本地的文件(如日志、编译产物)。

3. 强制移除(-f

  • 当文件已被修改且添加到暂存区时,需使用 git rm -f <file> 强制删除。
  • 防止误删尚未提交快照的修改(这些修改无法由 Git 恢复)。

4. 删除模式匹配的文件

  • 使用 git rm 配合 glob 模式(如 git rm log/\*.log 删除 log/ 下所有 .log 文件)。
  • 注意:通常需转义 * 等特殊字符(如 \*)。

移动/重命名文件

Git 通过内容变化智能推断文件是否被移动或重命名。可以用git mv <old_name> <new_name>进行重命名或者移动,该命令等效于执行以下三条命令:

1
2
3
mv <old_name> <new_name>   # 1. 工作目录中重命名/移动
git rm <old_name> # 2. 删除旧文件(暂存)
git add <new_name> # 3. 添加新文件(暂存)

提交后,Git 会将其识别为重命名操作(git status 会显示 renamed)。

如果你使用其他方式(如系统命令或文件管理器)移动/重命名了文件,需要手动执行:

1
2
git rm <old_name>  # 告诉 Git 删除旧路径的文件
git add <new_name> # 告诉 Git 跟踪新路径的文件

提交前完成这两步,Git 同样能识别为重命名。

提交更改

执行 git commit 会打开默认文本编辑器,其中包含对本次提交的注释模板(类似 git status 输出的注释行),在文件首行输入提交说明即可;也可使用 git commit -m "提交信息" 将提交说明写在命令行中。注意每次git commit 实现一个功能或者改好一个bug就好,注释一定要写清楚,一定,一定。

提交完成后,会输出当前所在分支、生成的提交 SHA-1 以及此次修改涉及的文件数、行数等统计信息;

每次提交只记录暂存区的快照,未暂存的更改不会被包含,仍保留在工作目录中,需在下次提交前再次执行 git add

进阶:跳过使用add

为了方便,可以直接:

1
git commit -a

以此来跳过使用add和暂存区域,但是会给所有跟踪过的文件暂存一块提交,就不这么精细

Git回顾

查看提交历史

1
git log

这个是用来看提交历史流程,最新的在上,旧的在下面。会给作者名、提交者、概要之类的信息。

这个可以有很多参数进行细致的查看,这里由于笔者本人大型项目开发经验欠缺,暂时先略过,等我用到再说。

Git撤销

这个可能会导致工作丢失,如果操作不好的话。

暂时先写到这里,等期末考完再说下一步。

Git GUI汉化包:stayor/git-gui-zh

参考资料:


Git介绍及用法
http://example.com/2025/06/03/折腾杂项/2025-06-03-Git用法及介绍/
作者
ZHW
发布于
2025年6月3日
许可协议