image

Git 介绍

Git 是一个强大的分布式版本控制工具,旨在有效地管理项目代码的演变。由 Linus Torvalds(没错,就是那个男人(Linux之父))于 2005 年创建,Git 已成为开发者们日常工作中的必备工具。它提供了一套强大的功能,使得团队能够协同开发、跟踪变更并有效地处理代码的版本控制。

Git 的灵活性和强大功能使其成为现代软件开发中不可或缺的工具。通过有效地追踪、管理和协同开发代码,Git 构建了一个可靠的版本控制系统,为开发者提供了更好的工作流和协作方式。

Git 安装

git 的安装相信不用多说,在这里不做过多介绍。

Git 官网: https://git-scm.com/

有需要请自行下载。

安装完 Git 之后可以使用 git -v 或者 git --version 来查看 Git 版本号,如果正常显示则表示安装成功。

初始化配置

Git 安装成功之后需要进行基本信息的初始化,这样当你在提交代码的时候才能确定你的身份信息,具体如下(Windows 要在 git bash 下操作):

  • 初始化用户名:
git config --global user.name "这里填你的用户名(用户名里不含空格可以省略双引号)"
  • 初始化邮箱:
git config --global user.email example@mail.com
  • 保存用户名和密码,避免每次都需要输入
git config --global credential.helper store
  • 查看配置信息
git config --global --list

说明: 命令里的 --global 参数表示全局配置,对所有 git 仓库都有效,如果不加则只对当前的 git 仓库有效。还有一个 --system 参数,表示系统配置,所操作系统的所有用户生效,一般不使用这个参数。

创建仓库

使用 git init 创建仓库

使用 cd 进入想要当作仓库的目录,输入 git init 即可把当前目录初始化为一个仓库,输入 ls -a 可以看到目录下多出了一个 .git 的隐藏目录。

也可以在 git init 后面指定目录名称,例如:git init directory,这样就会在当前目录下创建一个新的 directory 目录来作为仓库

使用 git clone 创建仓库

输入 git clone URLAddress 即可将远程仓库拉取到当前目录。

添加和提交文件

git 仓库的结构

在添加文件之前首先要了解 git 仓库的结构。

git 仓库有三个分区,分别是:

  • 工作区(Working Directory):工作区是你在计算机文件系统中能够看到和修改的项目目录。它包含项目的实际文件,日常就是在这里进行代码的编辑和开发工作。工作区的状态可能包括已修改(Modified)、已删除(Deleted)等。
  • 暂存区(Staging Area/Index):暂存区是一个介于工作区和本地仓库之间的区域。在暂存区,你可以暂时存放你的更改,为将它们提交到本地仓库做准备。暂存区包含你通过 git add 命令添加的文件,这些文件处于“已暂存(Staged)”状态。
  • 本地仓库/版本库(Local Repository):本地仓库是存储项目完整历史记录的地方,包括所有的提交、分支、标签等信息。本地仓库中的每个提交都是项目的一个快照。一旦你通过 git commit 命令提交了暂存区的更改,它们就会永久地保存在本地仓库中。

提交文件

  • 使用 git status 命令可以查看仓库当前的状态
  • git 文件的几种状态 image
  • 使用 git add 文件名 可以将指定文件添加到暂存区,这里也可以使用通配符来选择文件
  • 使用 git commit -m "填写提交的信息" 可以将暂存区的文件提交到本地仓库中,该命令只会提交暂存区中的文件而不会提交工作目录中的其它文件
  • 如果不添加 -m 参数,回车后会默认进入交互式界面(如:vim)来要求你编辑提交的信息
  • 如果使用 -a 参数,例如:git commit -am "填写提交的信息" 这样就可以同时完成添加暂存两个动作

特别强调: git 默认不会将空的目录添加到暂存区和版本库中

版本回退

使用 git reset 命令可以用来回退仓库的版本,git reset 命令有三种不同参数:

  • git reset --soft 版本ID:回退到某个版本,并且保存工作区和暂存区的所有修改内容
  • git reset --hard 版本ID:回退到某个版本,并且丢弃工作区和暂存区的所有修改内容
  • git reset --mixed 版本ID:回退到某个版本,只保留工作区的所有修改内容,丢弃暂存区的所有修改内容

使用 git log 命令可以查看提交历史

  • 使用 git log --oneline 可以查看简化后的提交历史
  • 使用 git log --all 可以查看全部的提交历史

使用 git ls-files 命令可以查看暂存区或版本库中的内容

查看版本间的差异内容

git diff 命令

使用 git diff 命令可以查看版本间的差异内容。git diff 默认比较的是工作区和暂存区之间的版本差异内容,它会显示发生更改的文件以及更改的详细信息

git diff HEAD 命令

使用 git diff 命令可以查工作区和版本库之间的差异。

git diff –cache 命令

使用 git diff --cache 命令可以查暂存区和版本库之间的差异。

git diff 提交ID1 提交ID2

使用 git diff 提交ID1 提交ID1 命令可以比较两个特定版本之间的差异内容。

说明: 在 git 中用 HEAD 表示当前版本HEAD^HEAD~ 表示上一个版本(或者叫做之前的一个版本),HEAD~n 表示当前版本之前的 n 个版本

git diff 提交ID1 提交ID2 file

使用 git diff 提交ID1 提交ID2 file 来比较两个版本特定文件之间的差异内容。

git diff 分支名1 分支名2

使用 git diff 分支名1 分支名2 来比较两个分支之间的差异内容。

删除文件

直接使用 rm 命令(不推荐)

当我们直接使用 Linux 的 rm 命令删除工作区中的文件后,此时虽然文件已经删除,但是在暂存区任然存在,还需要使用 git add 文件名 来将将刚刚删除的文件添加到暂存区,目的是为了告诉暂存区该文件已经被删除,可以理解为更新暂存区的记录值。

使用 git rm 命令(推荐)

  • 使用 git rm 命令删除工作区的文件时省去了手动更新暂存区,连同暂存区会同步删除。
  • 使用 git rm --cached <file> 命令可以把文件从暂存区删除,但保留在当前工作区中。
  • 使用 git rm -r * 命令会递归删除某目录下的所有子目录和文件。

提交文件(重要)

无论使用那种方式删除,都需要用 git commit -m "delete file1 adn file2",将已删除的 file1 和 file2 提交到版本库,告诉版本库文件已经删除。

忽略文件

在工作区中往往并不是所有文件都需要被添加到版本库中,这个时候就需要将这些问价给忽略。

我们只需要在工作区创建一个 .gitignore 文件,在文件里添加需要忽略的文件名,那么这些文件就不会被提交到暂存区和版本库,当需要忽略一个文件目录时,目录需要以 / 结尾才能正确的被忽略。

特别强调: 文件在被添加到 .gitignore 文件之前必须没有被添加到暂存区或者版本库中,否则即使添加到 .gitignore 文件中也不会被忽略。

那么通常什么样的文件适合被忽略呢?

  • 系统或者软件自动生成的文件或文件夹
  • 编译产生的结果文件,如:Java 编译生成的 .class 文件或者 C 语言编译生成的 .o 文件
  • 运行时产生的日志文件、缓存文件、临时文件
  • 涉及身份、密码、口令、密钥等敏感信息文件

.gitignore文件的匹配规则:

image

示例:

image

在 GitHub 上有人提供了 git 常用语言的忽略模板,链接: https://github.com/github/gitignore/

拉取和推送仓库

当我们在使用 git clone RemoteAddress 之后就可以在本地进行快乐的编码了。

推送更新内容

编码完成后需要对代码进行推送,使用 git push 自定义的远程仓库别名(默认为 origin) 本地分支名 命令就可以将代码推送给到远程仓库了,如果要推送到默认的远程仓库和分支,可以简化成 git push

拉取更新内容

使用 git pull 自定义此远程仓库别名(默认为 origin) 远程分支名:本地分支名 命令可以拉取远程仓库的更新内容,如果远程分支名本地分支名相同的话可以省略本地分支名。

注意:执行 git pull 命令之后,git 会自动进行一次合并操作,如果远程仓库修改内容和本地仓库没有冲突,则合并成功,否则会因为冲突而失败。

使用 git fetch 命令也可以获取远程仓库的更新,但是 fetch 命令指挥获取远程仓库的修改,并且不会自动合并到本地仓库中,需要我们手动合并

关联本地仓库和远程仓库

如果需要将本地仓库推送到代码托管平台,如 GitHub,则需要先将本地仓库和远程仓库关联起来

添加远程仓库

git remote add 自定义此远程仓库别名(默认为 origin) 远程仓库地址

查看当前仓库对应的所有远程仓库(可选)

# 显示当前 Git 仓库中配置的所有远程仓库的名称
git remote

# 显示当前 Git 仓库中配置的所有远程仓库的名称和地址
git remote -v

指定分支名称

如果本地仓库的分支名称和这里相同,则可以省略该步骤

git branch -M main(表示远程仓库的 main 分支)

将本地分支和远程仓库分支关联起来

git push -u 自定义此远程仓库别名(默认为 origin) 远程分支名:本地分支名

分支和基本操作

查看当前仓库的所有分支

git branch

在输出结果中,分支名称前带有 * 表示当前所在的分支

创建新的分支

git branch Test

这个命令可以用来创建一个名为 Test 的新分支。

切换不同分支

# 不推荐用该命令来切换分支,而是可以用来恢复文件状态
git checkout 分支名

这个命令可以用来切换到指定分支

注意git checkout Name 这个命令也可以用来恢复文件到修改之前的状态,因此当文件名和分支名相同的时候会出现冲突,git checkout 命令会默认切换分支而不是恢复文件状态。

由于会产生冲突,因此在 2.23 版本之后添加了新的切换分支命令:

# 推荐该命令来切换分支
git switch 分支名

合并分支

使用 merge 合并分支

git merge 分支名

merge 后的分支名是将要被合并的分支,当前所处的分支就是合并后的分支,简单来说就是把merge后的分支合并到当前所处的分支

merge 分支合并图解:

image

使用 rebase 合并分支

git rebase 分支名

rebase 分支合并图解:

image

区别

merge 在合并分支的之前必须离开被合并的分支切换到要合并到的目标分支才能合并,而 rebase 合并分支则没有这个限制,并且 rebase 合并分支之前处于哪条分支,合并的结果也不相同。

查看分支图命令:

git log --graph --oneline --decorate --all

删除分支

  • 使用以下命令来删除已合并的分支分支:
# 这里的 -d 参数表示已合并的分支,如果分支未合并,则无法删除
git branch -d 分支名
  • 使用以下命令来删除未合并的分支分支:
# 这里的 -D 参数表示强制删除分支
git branch -D 分支名

解决合并冲突

当发生合并冲突时,我们可以使用 git status 命令来查看冲突文件列表,也可以使用 git diff 命令来查看冲突具体内容

修改冲突

如果想要继续合并,就需在合并后的分支手动修改冲突文件(发生冲突的修改会被自动写入合并后的文件内,但需要手动决定保留哪些修改),修改完成后重新添加到暂存区然后再推送到仓库即可。

终止合并

如果要终止合并,可以使用 git merge --abort 命令来终止此次合并。