Git-分布式版本控制工具入门🛠️
本文最后更新于215 天前,如有错误请发送邮件到yaoshengliy@gmail.com

一、前言

在了解Git之前,我们需要知道版本控制系统的概念,版本控制系统(Version Control System, VCS)主要用于管理代码变更,确保开发人员可以回溯历史版本,并支持多人协作。根据架构不同,版本控制系统分为 集中式版本控制系统(CVCS)分布式版本控制系统(DVCS),以下为二者的区别。

对比项集中式版本控制系统(CVCS)分布式版本控制系统(DVCS)
存储方式代码存储在中央服务器,本地只存储当前版本每个开发者本地存储完整仓库
提交方式直接提交到服务器先提交到本地,再推送到远程
离线工作不支持,需联网支持,本地可查看历史记录
服务器依赖服务器宕机则无法工作本地有完整历史,服务器宕机不影响开发
适合场景小团队或严格权限控制的企业项目大型项目、开源协作、多分支开发

集中式版本控制系统,如SVN,而本文要介绍的Git是作为最流行的分布式版本控制系统,被广泛应用于开源项目和企业级开发。它不仅能够高效管理代码变更,还能让多个开发者协作无缝进行,项目随时可追溯、可恢复、可协作。

本篇文章将深入探讨 Git 的基本概念、核心命令以及如何在项目开发中高效应用它,帮助你快速上手。

注意:博主的操作系统为Windows 11,本文需要的环境有终端(基础)和VS code、IDEA(开发项目坏境)。


二、Git 基本工作流程

Git的工作机制与流程,包含了本地仓库与远程仓库的基本交互,依赖于Git内部的基本命令,熟知了Git的基本工作流程,可以满足个人简单的开发学习,并为团队协作铺垫。其工作流程图如下。

在前文放置Git工作流程图是方便后续读者进行回顾

  1. 抓取/克隆(fetch/clone):从远程仓库获取代码,建立本地仓库。
  2. 检出(checkout):从本地仓库提取代码到工作区。
  3. 添加(add):将修改的文件加入暂存区。
  4. 提交(commit):将暂存区的更改提交到本地仓库。
  5. 拉取(pull=fetch+merge):从远程仓库获取最新代码并合并。
  6. 推送(push):将本地提交的代码上传到远程仓库,供团队共享。

三、Git的安装与基本配置

3.1 Git安装

通过查询 Git 官方下载网址,即可下载到最新的安装包如下左图所示(本文只演示Windows-64-bit操作系统)。由于国外网站下载较慢,也可以通过国内镜像网站下载,如下右图所示。

Git 官方下载网址:https://git-scm.com/downloads

Git 国内镜像下载网址:

https://registry.npmmirror.com/binary.html?path=git-for-windows/&sort=desc

下载完成后,以管理员身份打开安装包,安装过程中进行对 Git 基本的安装设置,如版本许可,文件安装目录,系统基本设置等等。建议将安装目录放置在D盘,可以在D盘根目录,新建一个Repository(仓库)文件夹,将Git安装目录设为D:\Repository\Git-2.48.1即可,为文件夹标注版本号,便于后续版本切换与管理。在同意版本许可,设置文件安装目录之后,后续选项除特殊配置,一直默认同意即可。下图是有关安装的基本配置。

安装完成后,通过快捷键Windows+R,在命令框输入cmd打开终端后,再输入如下命令:

git --version # 查询git版本信息

若出现版本号则安装成功(博主使用的是之前版本的Git)

若无法出现版本号则说明,可能是由于某些安装错误原因,没有进行系统环境配置,则需要手动配置。

在Windows搜索框输入编辑系统环境变量,跳出系统属性框后,点击环境变量进行配置。

3.2 Git基本配置

在本地一般采用 Git Bash 作为Git的开发环境,其模拟了一个 Bash(Bourne Again Shell)环境,使得用户可以在 Windows 上运行类似于 Unix 系统中的命令。以下是打开方式。

注意:在哪些目录打开Git Bash,根据自身需求即可,比如已经有本地仓库,则在本地仓库目录打开,这里在用户根目录打开是便于后面的基本配置。

1.配置 Git 用户信息

设置全局的用户名以及电子邮箱地址属于用户级配置,将会在提交信息中对应唯一用户,便于团队成员之间的信息比对与互通。在用户根目录(任意地方均可,因为存在参数global)打开 Git Bash 环境后分别输入以下代码实现:

git config --global user.name "你的用户名" # 修改用户名
git config --global user.email "你的邮箱" # 修改游戏邮箱

注意:使用global 选项是在全局范围内(即所有仓库)应用这些设置。如果只想为当前仓库配置,可以去掉global 选项,并且是在当前库的目录下设置。

代码运行成功后可以查询是否载入成功,输入以下代码:

git config --list

对于查询操作,可以细分为不同特定级别的查询,代码如下:

git config --system --list # 系统级配置
git config --global --list # 用户级配置
git config --local --list # 仓库级配置

读者也可以使用用户级配置查看刚刚修改的用户名及邮箱,每个级别配置显示信息均不相同,下文进行简要说明。

2.编辑不同级别配置文件Git

配置文件设置保存在三个不同的配置文件中:

  • 系统级配置(全局影响):通常在/etc/gitconfig(Git的安装目录中),用于设置全局 Git 代理。
  • 仓库级配置(仅影响当前 Git 仓库):在当前仓库的.git/config,用于设置远程仓库地址、配置分支合并策略、设定本仓库专属的 hooks、rebase 方式等。
  • 用户级配置(影响当前用户的所有Git仓库):在用户主目录下的.gitconfig 或 /.gitconfig(Windows:C:\Users\用户名\.gitconfig),用于设置用户的姓名和邮箱、设定别名、设置 Git 命令的默认行为等。

对于这些文件可以手动编辑,或者使用 git config命令进行设置。例如,编辑用户级配置文件:

文件名 ~/.gitconfig

每个文件配置有不同的作用,在入门篇不做细致讲解,只需要知道配置功能设置时对应哪个级别的配置即可,如在上述配置Git用户信息为用户级配置,它会影响当前用户所有的Git仓库。此外,部分功能设置可以直接在命令行中实现。

3.其它部分配置

1)配置命令别名为用户配置,可以简化常用命令的输入,示例代码如下:

git config --global alias.co checkout # checkout简化为co
git config --global alias.br branch # branch简化为br
git config --global alias.ci commit # commit简化为ci
git config --global alias.st status # status简化为st

通过命令行管理简化命令并不方便,为此我给出如下方式:

  • 打开用户根目录,创建.bashrc文件,或者在Git bash命令行中输入以下命令
touch ~/.bashrc
  • .bashrc文件中输入需要简化的命令
# checkout简化为co
alias co = 'git checkout'
# 用于简化输出git日志
alias git-log = 'git log --pretty=oneline --all --graph --abbrev-commit'
# 用于输出当前目录所有文件及基本信息
alias ll='ls -al'
  • 打开Git bash,执行source ~/.bashrc,即可使用自定义的简化命令。

2)配置文本编辑器,可以在 Git Bash 中设置默认的文本编辑器,示例代码如下:

git config --global core.editor "nano" # 或者 "vim", "code" (Visual Studio Code)

3)配置全局忽略文件(Global Git Ignore)

WIndows中位于C:\Users\用户名.config\git\ignore

作用:指定所有 Git 仓库都应忽略的文件,如 *.lognode_modules/

设置全局忽略文件:

git config --global core.excludesfile ~/.config/git/ignore

四、Git仓库管理

4.1 本地仓库管理

要实现本地仓库管理,首先要创建并初始化本地仓库。在某一个指定文件目录下打开 Git Bash,创建一个新的文件夹,并进入该文件夹,可以使用以下代码创建文件:

mkdir myproject # 在指定目录创建文件夹
cd myproject # 进入指定的文件夹

在此目录下初始化仓库:

git init # 初始化仓库命令

创建成功后,可得到以下提示信息:

.git文件夹为默认为隐藏文件,需要在文件查看设置中打开显示隐藏文件。

4.1.1 基础操作命令

Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git 的命令而发生变化。原理图如下所示。

1.查看状态

git status

显示工作区和暂存区的状态,查看哪些文件被修改或未跟踪。

2.添加文件到暂存区

git add <file> 

将指定文件添加到暂存区,使用 git add . 添加所有修改的文件。

3.提交修改

git commit -m "提交信息"

将暂存区的文件提交到本地仓库,并附加提交信息。

4.查看提交日志

git log

显示提交历史,git log --oneline 可简化显示。

5.版本回退

git reset --hard <commit-id>

根据上述的基础命令,接下来进行实际操作。

注意:此时应该在本地目录初始化的仓库进行操作

1)首先创建一个 README 文件与test.txt以便进行初始提交:

echo "# MyProject" > README.md
touch test.txt

2)添加测试文件到 git 缓存区,文件夹也适用,我在此添加“test.txt”测试文件到 git,缓存区当中,并查看文件状态:

git add test.txt
git status

此时 Git Bash 环境运行结果,可显示“test.txt”文件已经加入缓存区当中,运行图如下所示:

3)添加文件到缓存区后,需要提交信息到仓库中,代码如下:

git commit -m '1.0'

提交版本库成功后,可出现如下图的信息。

对于不是新建的文件可以直接用 git commit -am ‘name’提交到版本库, 提交修改到最近一次版本可以使用命令 git commit –amend

4)对于查看提交日志详细,可以使用如下代码,按 q 退出:

git log #详细版本信息
git log --oneline #简洁版本信息

5)对于版本回退,使用git reset --hard <commit-id>即可实现。

4.2.2 分支管理

Git分支管理涉及创建、切换、合并和删除分支等操作。以下是一些常见的Git分支管理命令及其代码示例:

1.查看分支

git branch         # 查看本地分支
git branch -r      # 查看远程分支
git branch -a      # 查看所有分支(本地 + 远程)

2.创建分支

git branch new-branch  # 创建新分支,但不切换

3. 切换分支

git checkout new-branch  # 切换到指定分支(旧方式)
git switch new-branch    # Git 2.23+ 推荐使用 switch 命令

4. 创建并切换分支

git checkout -b new-branch  # 旧方式
git switch -c new-branch    # Git 2.23+ 推荐

5. 合并分支

git checkout main         # 切换到主分支
git merge new-branch      # 合并 new-branch 到当前分支

6. 删除本地分支

git branch -d new-branch  # 删除本地分支(已合并)
git branch -D new-branch  # 强制删除本地分支(未合并)

7. 删除远程分支

git push origin --delete new-branch  # 删除远程分支

接下来进行实现一个简单的分支管理。

1)创建并切换到 dev 分支并进行开发

从 master 分支创建一个新的 dev 分支,并切换到该分支:

git checkout -b dev

在 dev 分支上进行代码开发和提交,我添加了一个新文件 feature.txt:

echo "This is a new feature" > feature.txt # 将内容重定向至文件(没有自动创建)
git add feature.txt # 添加文件到暂存区
git commit -m "Add new feature in dev branch" # 提交信息

2)切换回 master 分支并合并 dev 分支

在开发完成后,切换回 master 分支并将 dev 分支的更改合并到 master 分支:

git checkout master
git merge dev

4.2.3 实现与解决 MR 冲突

1.MR 冲突的介绍

在 Git 中,合并冲突(Merge Conflict)是指在合并两个分支时,Git 无法自动将它们合并,因为在两个分支中有文件的相同部分进行了不同的修改。此时需要人工干预来决定最终的合并结果。

合并冲突通常在以下情况下产生:

  • 同一文件的同一区域被不同分支修改:

当两个分支对同一个文件的同一个位置进行了不同的修改时,Git 无法自动确定该保留哪一个修改,因此会产生冲突。

  • 同一文件在一个分支中被删除而在另一个分支中被修改:

如果一个分支删除了一个文件,而另一个分支修改了同一个文件,Git 不知道是该删除文件还是保留修改后的版本,因此会产生冲突。

  • 文件被重命名:

当一个分支对文件进行了重命名而另一个分支对文件进行了修改,Git 可能无法自动合并这些更改。

2. 实现与解决 MR 冲突

首先创建一个新分支 branch1 并进行修改:

git checkout -b branch1 # 创建分支并切换
echo "Content added in branch1" >> example.txt # 将内容重定向至文件
git add example.txt # 添加至暂存区
git commit -m "Add content in branch1" # 提交

然后切换回 master 分支,创建另一个新分支 branch2 并进行不同的修改:

git checkout master
git checkout -b branch2 # 创建另一个分支并切换
echo "Content added in branch2" >> example.txt # 将内容重定向至与上述相同文件
git add example.txt # 添加至暂存区
git commit -m "Add content in branch2" # 提交,此时不会报错

切换回 master 分支,并尝试合并 branch1 分支,然后合并branch2 分支以产生 MR 冲突:

git checkout master
git merge branch1
git merge branch2

Git 会在冲突文件中插入冲突标记,打开 example.txt 并查看:

为了解决这个冲突,我可以手动编辑文件以解决冲突。比如,合并两个分支的内容:

Initial content
Content added in branch1
Content added in branch2

保存文件后,标记冲突为已解决并完成合并:

git add example.txt
git commit -m "Resolve merge conflict between branch1 and branch2"

至此,完成了简单的MR冲突模拟与解决。

4.2 远程仓库的连接与管理

4.2.1 远程仓库网址

对于远程仓库的网址,例举有以下几个:

GitHubhttps://github.com

  • 全球最流行的Git代码托管平台,支持开源和仓库仓库,提供CI/CD、Issue跟踪、Pull Request等功能。

GitLabhttps://gitlab.com

  • 提供完整的DevOps解决方案,支持部署,适用于企业级管理项目和CI/CD集成。

Gitee(码云)(https://gitee.com

  • 由开发者内部维护的Git托管平台,适用于内部访问,支持仓库仓库和企业版服务。

Bitbuckethttps://bitbucket.org

  • 适用于小型团队和企业,支持 Git 和 Mercurial,深度集成 Atlassian 生态(如 Jira)。

SourceForgehttps://sourceforge.net

  • 主要用于开源项目托管,支持Git、SVN和Mercurial,适合老牌开源项目管理。

本文选取Gitee作为远程仓库进行演示。

4.2.2 远程仓库初始化

1)访问 Gitee 官网:https://gitee.com/,并进行注册。还记得在Git的基本配置中,设置的用户信息吗,在连接远程仓库提交信息的时候将会有所体现。

2)创建远程仓库

使用 SSH 秘钥地址进行 Git 远程操作时,不需要输入用户名和密码,而是通过 SSH 公私钥认证方式进行身份验证。本地的私钥(id_rsa)与远程仓库的公钥(存储在 GitHub/Gitee 等平台)匹配后,才能安全访问远程仓库。所以配置SSH协议,对于安全的管理仓库有重要意义。

4.2.3 配置SSH协议

1.本地没有配置过SSH秘钥

1)生成SSH秘钥

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

可以选择是否输入密码,不需要密码一直按回车即可。

2)查看文件

当生成SSH秘钥时,用户根目录的.ssh文件将会生成多个文件,如下所示。

1. id_rsa(私钥)

  • 这是默认的 SSH 私钥,用于 SSH 认证(比如 GitHub、Gitee)。
  • 你必须 保密 这个文件,不能泄露,否则你的账户可能被盗用。

2. id_rsa.pub(公钥)

  • 这是 id_rsa 对应的 公钥,用于提交到远程服务器(如 GitHub、Gitee),让它识别你的身份。
  • 公钥可以公开,不影响安全性。

3. id_rsa.gitee(另一个 SSH 私钥)

  • 这个是你为 Gitee 生成的 SSH 私钥,你应该在 Gitee 账户中配置它的公钥。
  • 由于你已经有默认的 id_rsa,这说明你可能是为了区分 GitHub 和 Gitee 生成了不同的密钥。

4. id_rsa.gitee.pub(Gitee SSH 公钥)

  • 这是 id_rsa.gitee 对应的 公钥,你需要把它添加到 Gitee 账号的 SSH key 设置中。

5. config(SSH 配置文件)

  • 这个文件用于 配置 SSH 连接的不同私钥,让 Git/Gitee 选择正确的密钥。

6. known_hosts(已知主机列表)

  • 这个文件存储了 你连接过的 SSH 服务器的指纹,比如 GitHub、Gitee 的服务器信息。
  • 每次你用 SSH 连接新的主机时,它会要求确认主机指纹,并存入 known_hosts,防止 MITM(中间人攻击)。

在上述文件中,需要将id_rsa.gitee.pub(Gitee SSH 公钥)的内容复制到Gitee平台中。

3)将公钥添加到远程 Git 仓库

复制新生成的公钥(以Gitee为例):

cat ~/.ssh/id_rsa_gitee.pub # 获取公钥内容并复制

4)测试连接

ssh -T example_name@gitee.com # 测试远程仓库连接

2.本地配置过SSH秘钥

如果本地已经存在SSH秘钥,需要再新建一个,为不同的 Gitee 账户或不同的平台配置多个密钥,可以使用以下步骤进行。

1)生成新的 SSH 密钥(防止覆盖)

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/github_work # 指定生成目录

然后再次将生成的公钥文件内容复制到Gitee平台中。

2)配置config文件并测试连接

还记得之前的config文件吗,其用于 配置 SSH 连接的不同私钥,让 Git/Gitee 选择正确的密钥。新建的SSH秘钥并不是默认的,需要进行配置,打开config文件输入:

如果找不到config文件,可以使用命令:

vi ~/.ssh/config # 使用编辑器打开并修改

还记得在Git基本配置中说明可以切换编辑器的代码吗:

git config --global core.editor "nano" # 或者 "vim", "code" (Visual Studio Code)

你可以使用任何一个编辑器打开你的文件进行编辑。

最后测试连接:


五、Git远程仓库与本地仓库交互

5.1 远程仓库的添加与查看

5.1.1 添加远程仓库

在本地仓库中添加远程仓库地址:

git remote add origin <远程仓库地址>
  • origin 是远程仓库的默认名称(可自定义)。
  • <远程仓库地址> 可以是 HTTPS 或 SSH 地址,如:
    • HTTPS: https://gitee.com/user/repo.git
    • SSH: git@gitee.com:user/repo.git

5.1.2 查看远程仓库

git remote -v

5.1.3 修改远程仓库地址

如果远程仓库地址变了,可以修改:

git remote set-url origin <新的远程仓库地址>

5.1.4 删除远程仓库

git remote remove origin # 删除
git remote rm origin # 另一种方式

删除后,原来的远程仓库地址就失效了,需要重新添加。

5.2 代码推送(本地 → 远程)

5.2.1 推送本地代码到远程仓库

git push -u origin <分支名>
  • -u 选项将本地分支与远程分支关联,后续可以直接 git push
  • <分支名> 通常是 mainmaster

5.2.2 推送指定分支

git push origin <分支名>

5.2.3 强制推送(谨慎使用)

git push -f origin <分支名>
  • 强制推送会覆盖远程仓库的代码,谨慎使用。

5.2.4 推送所有分支

git push --all origin
  • 推送所有本地分支到远程仓库。

5.3 代码克隆(远程 → 本地)

git clone <远程仓库地址>

示例:

git clone git@gitee.com:user/repo.git
  • 这将在当前目录创建一个文件夹,并将远程仓库的代码下载到本地。

5.4 获取远程代码(拉取与抓取)

5.4.1 仅获取最新代码(fetch)

git fetch origin
  • 只获取最新代码 但不合并,不会影响本地代码。

5.4.2 拉取代码并合并(pull)

git pull origin <分支名>
  • fetch + merge 的组合,获取远程最新代码并合并到本地当前分支。

5.4.3 解决冲突后继续拉取

如果拉取时遇到冲突:

git pull --rebase origin main
  • 先应用远程的更改,再应用本地的更改。

5.5 远程分支管理

5.5.1 查看远程分支

git branch -r # 只列出远程分支
git branch -a # 列出所有分支(本地 + 远程)

5.5.2 拉取远程分支到本地

git checkout -b <本地分支名> origin/<远程分支名>

5.5.3 删除远程分支

git push origin --delete <分支名>

5.5.4 推送本地新建分支到远程

git push origin <本地分支名>

5.6 远程标签管理

5.6.1 创建并推送标签

git tag <标签名>
git push origin <标签名>

5.6.2 删除远程标签

git push origin --delete <标签名>

5.6.3 拉取远程标签

fetch --tags

5.7 其他远程仓库操作

5.7.1 强制同步本地与远程

如果想让本地代码与远程完全一致:

git reset --hard origin/<分支名>
  • 会丢失本地未提交的修改,请谨慎操作。

5.7.2 清除本地无用的远程分支

如果远程删除了某个分支,本地 git branch -r 仍然会显示它,使用以下命令清理:

git remote prune origin

六、小结

本文的内容包括了Git安装配置、Git仓库管理、Git远程仓库与本地仓库的交互,涵盖了Git的基本操作,读者若能够理解大部分的内容,则可以回到第二小结:Git 基本工作流程中回忆理解全部的内容,完成Git的基本入门。

对应项目开发使用到的IDE,如VS Code,IDEA等等,其内部均兼容Git仓库管理,并有很多便捷的功能,由于篇幅原因,在此不展开说明,若有后续,则在Git开发篇讲解。

感谢你的观看,对应本文有疑惑、存在错误或者其它问题欢迎联系我yaoshengliy@gmail.com。

原文作者:© 风影 版权所有


原文链接:https://sily.showbyte.top/git/


本作品采用 CC BY-NC-ND 4.0 许可协议。禁止修改原文内容,引用时务必注明文章标题、原文链接及作者信息


评论

  1. 博主 置顶
    Windows Chrome
    9 月前
    2025-3-23 14:56:31

    留下你的发言叭😘

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇