Git分布式版本控制工具
目录
1.了解Git基本概念
2.Git的配置和下载
3.概述Git工作流程
4.Git常用命令
5.ideal的Git操作
一. Git基本概念
1.集中式版本控制工具(CVCS)
将文件的版本都存放在中央服务器里,每个人都要连接到服务器获取和提交文件的版本.这类工具的典型代表有 SVN 和 CVS。
SVN和CVS的区别
(1)、版本编号方面
在SVN中,是对目录进行版本控制。而在CVS中则相反,是对文件进行版本控制.
例:目录下有a.txt、b.txt、c.txt文件
SVN: 修改a.txt和c.txt.提交后目录版本会从r1变成r2
CVS : 修改a.txt和c.txt.文件版本a.txt(1.0)->a.txt(1.1), b.txt(1.0)->b.txt(1.0), c.txt(1.0)->c.txt(1.1)
(2)、目录的版本控制
由于CVS只能对文件进行版本控制,不能对目录进行版本控制,
当执行move(移动文件),rename(重命名文件),copy(拷贝文件)操作时会失去记录历史版本的信息.
例:reaname doc/a.txt doc/b.txt.
CVS会认为:
1.删除a.txt(删除相关的历史版本)
2.创建全新的b.txt(版本重1.0开始)
结果: b.txt与a.txt无关,b.txt无法回退为a.txt文件和历史版本.
(3)、原子性提交
CVS 的非原子性提交(中断不会回滚)
SVN的原则性提交(若全部成功 → 整个提交生效,生成新的全局版本号。若任一失败(如网络中断)→ 自动回滚:)
(4)、变更集概念的支持
| 场景 | CVS(无变更集) | SVN(有变更集) |
|---|---|---|
| 标识方式 | 多个独立文件版本号(如 1.5、1.3、1.2) | 单个全局版本号(如 r108) |
| 逻辑关联性 | 无关联,零散文件修改 | 强关联,绑定为 “修复优惠券 BUG” 的整体 |
| 团队沟通成本 | 高(需额外说明修改目的) | 低(版本号直接关联逻辑意图) |
| 操作效率 | 低(回滚 / 追溯需逐个处理文件) | 高(一次操作覆盖所有关联文件) |
(5)、差异化的二进制文件处理
| 类型 | CVS | SVN |
|---|---|---|
| 文本文件 | 差异存储和差异传输 | 差异存储和差异传输 |
| 二进制文件 |
冗余存储和低效传输 |
差异存储和差异传输 |
假设有一个 5MB 的图片文件 logo.png,第一次提交到版本库:
CVS 和 SVN 都会存储完整的 5MB 文件(因为是初始版本,没有上一版本可比较)。
第二次你修改了图片的颜色(差异仅 0.5MB)并提交:
CVS:会再存储一个完整的 5MB 新文件,版本库中该文件总占用空间变为 5MB + 5MB = 10MB。
SVN:只存储 0.5MB 的差异部分,版本库中该文件总占用空间约为 5MB + 0.5MB = 5.5MB。
当他人需要更新这个图片时:
CVS:会传输整个 5MB 的新文件。
SVN:只传输 0.5MB 的差异,他人的客户端会自动用旧版本 + 差异还原出完整的新版本。
集中式版本控制工具问题
1.需要与服务器联网通讯,无法离线操作.2.一旦中央服务器数据丢失,之前提交的数据就彻底丢失.
2. 分布式版本控制工具(DVCS)
分布式版本控制工具的工作模式与集中式不同,每个开发者的本地环境都是一个完整的版本库,包含了项目的所有历史记录和分支。Git 是分布式版本控制工具的典型代表。
GIT与SVN的区别:
(1). 存储模型:分布式 vs 集中式
| Git(分布式) | SVN(集中式) |
|---|---|
| 每个开发者本地拥有完整的版本库副本,包括所有历史记录和分支。操作(如提交、查看历史)通常在本地完成,无需联网。 | 版本库集中存储在服务器,客户端只能通过网络访问。所有操作(如提交、更新)必须与服务器交互。 |
| 优势:离线工作、分支管理高效、灾难恢复能力强(任意副本可还原整个项目)。 | 劣势:依赖网络,断网时无法提交或查看历史;服务器故障可能导致数据丢失。 |
(2). 分支与合并:轻量级 vs 重量级
Git
分支创建成本极低:创建分支相当于创建一个指针,几乎瞬间完成。
分支操作高效:本地分支切换、合并无需网络,适合频繁创建和销毁临时分支。
SVN
分支创建成本高:分支本质是目录复制,涉及大量文件操作,耗时较长。
分支操作繁琐:每次分支切换需从服务器拉取数据,合并时易产生冲突且难以解决。
(3). 提交与版本号
Git
提交是本地操作:提交仅记录在本地仓库,不影响远程服务器。
版本号是全局哈希值:如 a1b2c3d4,基于提交内容计算,全球唯一
SVN
提交是原子性的服务器操作:所有修改必须一次性提交到服务器,失败则回滚。
版本号是全局递增数字:如 r100,由服务器分配。
(4). 冲突处理
| 环节 | Git 的处理方式 | SVN 的处理方式 |
|---|---|---|
| 冲突发现时机 | 推送前拉取时发现(本地合并阶段) | 更新服务器内容时发现(同步阶段) |
| 辅助工具 | 内置 git mergetool 等可视化工具 |
无内置工具,依赖第三方或手动编辑 |
| 冲突标记 | 简洁的 <<<<<<< HEAD 等标记 |
类似标记,但额外生成 3 个辅助文件 |
| 解决流程 | 编辑后直接提交,无需额外标记 “已解决” | 必须执行 svn resolved 标记后才能提交 |
| 灵活性 | 支持 ours/theirs 等合并策略 |
无策略可选,必须手动处理每个冲突点 |
二. Git下载和配置
Git下载:Git
Git配置
解决GitBash乱码问题
# 打开GitBash执行以下命令
git config --global core.quotepath false
vim ${git_home}/etc/bash.bashrc
# 在文件末尾写入
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
获取本地仓库
# 创建新文件夹
mkdir git-test
# 获取本地仓库
cd git-test
git init
为命令取别名
# 打开~/.bash_profile文件在末尾加入以下内容
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
# 查看隐藏文件
alias ll='ls -al'
| 参数 | 作用 |
|---|---|
--pretty=oneline |
将每个提交压缩到一行显示,格式为:<简短哈希值> <提交信息>。 |
--all |
显示所有分支的提交记录(包括本地分支、远程分支),不局限于当前分支。 |
--graph |
用 ASCII 字符绘制分支合并的图形,直观展示分支演化历史。 |
--abbrev-commit |
将提交哈希值缩写为简短形式(如 a1b2c3d 而非完整的 40 位哈希)。 |
三. Git工作流程

描述:(1)文件创建和修改时其属性属于工作区;(2)修改后需要add添加到暂存区和commit提交到本地仓库.(3)本地仓库使用push将数据提交到远程仓库;(4)可以使用clone(获得整个仓库数据),fetch(抓取分支但不合并)和pull(拉取分支并合并)获取远程仓库数据形成闭环
四.Git常用命令
1、基础操作命令
| 命令 | 作用 |
|---|---|
git config --global user.name "用户名" |
设置用户身份信息(用户名) |
git config --global user.email "邮箱" |
设置用户身份信息(邮箱) |
git init |
初始化本地仓库 |
git clone <远程地址> |
克隆远程仓库到本地 |
git status |
查看工作区和暂存区的状态 |
git add <文件> |
将文件修改添加到暂存区 |
git add . |
将所有修改添加到暂存区 |
git commit -m "描述" |
将暂存区内容提交到本地仓库 |
git commit --amend |
修改上一次提交(追加内容或修改提交信息) |
创建初始化本地仓库
# 创建git-test目录(之后初始化为git本地仓库)
mkdir git-test
# 切换到 git-test目录下
cd git-test/
# 初始化本地仓库
git init
# 查看目录下内容
ls -al

设置用户信息
# 设置用户身份信息-用户名
git config --global user.name '用户名'
# 设置用户身份信息-用户邮箱
git config --global user.email '邮箱'
# 查看全局信息的用户名
git config --global user.name
# 查看全局信息的用户邮箱
git config --global user.email
# 查看全局信息
git config --global --list
# 查看当前仓库配置信息
git config --local --list
# 查看(系统 + 全局 + 本地)配置信息
git config --list

创建文件并提交到本地仓库
(1).创建文件并查看状态
# 创建文件
touch file1.txt
# 查看状态
git status

新创建文件file1.txt为未跟踪状态
(2).跟踪文件(git add .)
# 跟踪文件
git add file1.txt
git add .
# 查看状态
git status

文件file1.txt已经在暂存区,但未提交到本地仓库
(3).仅删除暂存区文件
# 删除暂存区单个文件
git rm --cached file.txt
# 递归删除文件夹暂存区
git rm --cached -r .
# 查看状态
git status

(4).提交文件(git commit -m 'update file1.txt')
# 提交文件
git commit -m file1.txt
git commit file1.txt

(5).修改前一次提交的注解
# 修改前一次提交的注解
git commit --amend

2、分支管理命令
| 命令 | 作用 |
|---|---|
git branch |
列出本地所有分支 |
git branch -r |
列出远程分支 |
git branch -a |
列出所有分支(本地 + 远程) |
git branch <分支名> |
创建新分支 |
git branch -m old_name new_name |
分支重命名 |
git checkout <分支名> |
切换到指定分支 |
git checkout -b <分支名> |
创建并切换到新分支 |
git merge <分支名> |
将指定分支合并到当前分支 |
git branch -d <分支名> |
删除已合并的分支 |
git branch -D <分支名> |
强制删除未合并的分支 |
git switch <分支名> |
切换分支(Git 2.23+ 推荐) |
git switch -c <分支名> |
创建并切换分支(Git 2.23+ 推荐) |
创建分支,切换分支,删除分支,查看分支
# 查看分支
git branch
# 创建分支
git branch dev01
# 创建并切换到dev01
git checkout -b dev01
# 切换分支
git checkout dev01
# 删除分支
git branch -d dev01
# 强制删除未合并分支
git branch -D dev01

合并分支
(1). 无冲突合并
main 分支下有: file1.txt文件,内容:hello world 共一个文件
dev01 分支下有: file1.txt文件,内容:hello world file2.txt文件,内容:123 共两个文件
将dev01分支下内容合并到main分支下
git-log命令别名
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
# 无冲突合并分支
git merge dev01
结果:main分支也有两个文件:file1.txt, file2.txt
(2). 有冲突合并
main分支下file1.txt 内容是hello world(c++)
dev01分支下file1.txt 内容是hello world(python)
git merge dev01 # 将dev01合并到main分支
# 修改main分支下的file1.txt
git checkout main
vim file1.txt # hello world(c++)
# 修改dev01分支下的file1.txt
git checkout dev01
vim file1.txt # hello world(python)
# 在main分支下合并
git checkout main
git merge dev01
# 修改合并冲突文件
vim file1.txt


把<<<<HEAD ======= >>>>>dev01冲突标志删去
保留hello world(c++)或者hello world(python)或者都保留,但要把冲突标志删去
# 编辑文件,删除冲突标志
vim file1.txt
# 跟踪文件
git add .
# 提交文件(合并完成)
git commit -m "main merge dev01"


未提交的修改文件跟着分支切换
# 修改文件
vim file1.txt
vim file2.txt
# 直接切换分支
git checkout main
git checkout dev01

线性合并分支
将当前分支的提交 “复制” 到指定分支(如 main)的末尾,形成一条直线的提交历史。
git checkout feature
git rebase main # 将 feature 的提交移到 main 末尾
原提交历史:
main: A → B → C
feature: A → D → E
执行结果
main: A → B → C
feature: A → B → C → D → E # 线性排列
3、历史记录与版本回退
| 命令 | 作用 |
|---|---|
git log |
查看提交历史 |
git log --oneline |
单行模式查看提交历史 |
git log --graph |
图形化查看分支合并历史 |
git log -p <文件> |
查看文件的修改历史 |
git blame <文件> |
查看文件每行的最后修改者 |
git reset --hard <版本号> |
回退到指定版本(工作区内容丢失) |
git reset <版本号> |
回退到指定版本(保留工作区修改) |
git revert <提交号> |
创建一个新提交,撤销指定提交的修改(用于远程协作时的安全回滚) |
git checkout <版本号> <文件> |
恢复文件到指定版本的状态 |
git reset <提交>(默认行为,不带选项)
作用:将当前分支的 HEAD 移动到指定提交,但保留工作区和暂存区的修改git reset --hard <提交>
作用:将当前分支的 HEAD、暂存区和工作区全部强制重置为指定提交的状态,彻底丢弃所有未提交的修改。
创建file3.txt文件并回退创建前
# 创建file3.txt文件并提交到仓库
touch file3.txt
git add .
git commit -m "file3.txt"
# 查看提交记录
git log
git-log
# 查看文件每行修改者
git blame <文件名>
# 回退到创建file3.txt前
git reset --hard <版本号>
4、Gitee创建远程仓库
仓库创建



完成创建
客户机与仓库密钥连接
客户机创建密钥
# ssh密钥生成(一直回车)
ssh-keygen -t rsa
# 查看生成的密钥
cat ~/.ssh/id_rsa.pub

将密钥填写到Gittee
在Gitee设置中找到ssh公钥功能,并完成密钥复制

验证是否能访问gitee
# 验证是否能访问gitee
ssh -T git@gitee.com

5、远程协作命令
| 命令 | 作用 |
|---|---|
git remote -v |
查看远程仓库信息 |
git remote add <名称> <地址> |
添加远程仓库 |
git fetch <远程名> |
从远程获取最新更新(不合并) |
git pull <远程名> <分支名> |
从远程获取并合并到当前分支(等价于 fetch + merge) |
git push <远程名> <分支名> |
将本地分支推送到远程 |
git push -u <远程名> <分支名> |
推送并关联本地与远程分支(首次推送需使用) |
git push origin --delete <分支名> |
删除远程分支 |
git pull --rebase |
以变基方式拉取(避免不必要的合并提交) |
git remote -v
显示远程仓库的名称(如
origin)和对应的 URL,分为 fetch 和 push 两个方向。git remote -vv
在
-v的基础上,额外显示本地分支与远程分支的跟踪关系,以及远程分支的最新提交信息。git branch -v
显示本地分支列表,并附带 最后一次提交的 SHA 和提交信息。
git branch -vv
在
-v的基础上,额外显示本地分支与远程分支的跟踪关系,以及状态提示(如[behind 1]表示落后远程 1 个提交)。
连接远程仓库(实现仓库托管)
复制远程仓库的ssh地址

绑定远程仓库
# 添加远程仓库
git remote add <名称> <地址>
# 查看远程仓库信息
git remote -v
# 查看有什么远程仓库
git remote
# 详细查看远程仓库信息
git remote show origin

推送本地分支到远程仓库
# 将本地分支main推送到远程仓库分支main
git push remote origin main:main
# 冲突是强制推送到远程仓库
git push -f origin main:main
# 推送到远程仓库时与远程仓库分支关联,后续可直接git push推送关联分支
git push --set-upstream origin main:main
# 或者
git push -u origin main:main(当远程分支名相同时,可直接写为main)
# 本地仓库分支以关联远程分支,直接推送
git push
# 查看本地仓库分支与远程仓库关联
git branch -vv
推送本地仓库当前分支(假设当前分支为:main)
git push -u origin main:main
git push --set-upstream origin main:main
git push
推送其他分支且不切换分支
# 语法:git push <远程仓库> <本地分支>:<远程分支>
git push origin dev01 # 将本地 dev01 分支推送到 origin/dev01
git push --all origin # 推送所有本地分支到远程仓库
# 如果你想推送一个尚未关联远程分支的本地分支,可以使用 -u 选项同时建立关联:
git push -u origin new-feature # 推送 new-feature 分支并关联到 origin/new-feature
本地仓库克隆远程仓库
克隆远程仓库
# 克隆仓库会自动新建文件夹git clone [ssh地址] [别名]
git clone git@gitee.com:lan-zebin/today.git

创建远程仓库其他分支
创建远程分支的引用:Git 会在本地仓库中创建指向远程分支的引用,这些引用以
origin/为前缀(例如origin/main和origin/dev01),它们代表远程仓库中分支的状态。检出默认分支:Git 会自动检出远程仓库的默认分支(通常是
main或master),并在本地创建一个同名的跟踪分支(例如main)。这个本地分支会自动与远程的origin/main建立关联。不自动创建其他分支:对于远程仓库中的其他分支(如
dev01),Git 不会自动在本地创建对应的分支。这些分支的状态会被记录在origin/dev01中,但你需要手动创建本地分支来跟踪它们。
# 创建其他分支并跟踪的方法
# 方法一:使用 checkout -b 和 --track
git checkout -b dev01 --track origin/dev01
# 方法二:简化写法(Git 会自动检测远程分支)
git checkout -b dev01 origin/dev01
# 方法三:先切换到远程分支,再创建本地分支
git checkout origin/dev01 # 进入“分离 HEAD”状态
git switch -c dev01 # 创建并切换到新的本地分支
抓取远程仓库
# 获取所有远程分支的更新
git fetch
# 只获取特定分支的更新
git fetch origin main # 只获取远程的 main 分支
git fetch origin dev01 # 只获取远程的 dev01 分支
# 查看所有远程分支的最新状态
git branch -r
# 查看本地 main 分支与远程 main 的差异
git log main..origin/main
# 将更新合并到本地分支
git merge origin/main 或 git rebase origin/main
(1)抓取 (2)查看提交历史 (3)查看本地与远程main分支差异 (4)合并

拉取远程仓库
只拉取远程仓库中与本地已跟踪分支相关的更新,并仅合并当前分支的对应远程分支,并非 “拉取所有更新的分支”。
# 拉取远程仓库所以分支
git pull
# 拉取指定分支
git pull origin main:main
当dev01执行git pull时,抓取了,main和dev01分支,但只合并了dev01当前分支


远程合并冲突
无冲突:本地未修改 + 远程有新修改 → 快进合并,直接应用远程修改。
有冲突:本地和远程对同一文件的同一部分有不同修改 → 需要手动解决冲突。
本地仓库和远程仓库不一致的拉取时冲突
本地仓库1

本地仓库2

本地仓库1修改远程仓库file1.txt文件第三行是hello world(java)
本地仓库2的file1.txt文件的第三行是hello world(js)
当本地仓库2从远程仓库拉取时,就会产生冲突,和之前一样需要手动去除file1.txt冲突标准.
# git push或者git pull发生冲突时
git pull
vim file1.txt
git add .
git commit -m ""
五. ideal的Git操作
1.配置在idea中配置Git路径
打开idea->点击文件->设置(settings)->版本控制->Git
将配置Git可执行文件路径

2.初始化本地仓库
在idea打开项目,为配置.gitignore文件
在版本控制中选择创建Git仓库

选择创建Git仓库的文件目录

3.项目提交到远程仓库
创建远程仓库获取ssh地址:git@gitee.com:lan-zebin/ascent-sys.git
点击main->选择提交

勾选提交文件->填写备注->点击提交并推送

填写仓库ssh地址


4.提交和推送功能入口

5.指定历史版本分支创建

6.Pull拉取更新代码
点击main->选择更新项目

7.冲突修改
关闭窗口

8.手动删除冲突标志
选择接受您的更改


然后进行提交操作
9.切换(签出)分支

10.合并删除分支

11.还原提交(版本回退)

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐




所有评论(0)