GIT(了解)

什么是(软件)版本控制?

作用:软件源码版本管理、多人协作开发,版本的多分支开发,代码回滚(回退)等功能。

版本控制(Version Control)是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它可以帮助我们:

  • 追踪文件的修改历史,查看谁在何时做了什么更改
  • 恢复到之前的版本,当出现错误时可以快速回滚
  • 多人协作时管理代码,避免文件冲突和覆盖
  • 并行开发不同功能,最后再合并到一起

简单来说,版本控制就像给你的项目创建了一系列"快照",你可以随时回到过去的任何一个状态。

版本控制系统的类型

1.本地版本控制系统

  • 在本地磁盘上保存文件的不同版本
  • 例如:RCS(通过补丁集记录文件差异)

2.集中式版本控制系统

将代码仓库放在一台服务器上,下载,开发是要依赖这台服务器。都从这台服务器上获取源代码

优点:简单,方便管理,适用于中小型项目

缺点:一旦服务器宕机,会严重影响开发

SVN,CVS

  • 所有版本数据存储在中央服务器
  • 开发者从中央服务器拉取代码,完成后再推回
  • 例如:SVN、CVS
  • 缺点:中央服务器故障时无法协作,数据有丢失风险

3.分布式版本控制系统

每个开发者的本地都有完整的版本库副本

  • 无需联网即可提交、查看历史
  • 拥有更强的分支管理能力
  • 例如:Git、Mercurial、Bazaar
  • 优势:容错性高,协作灵活,支持离线工作

远程仓库

公网仓库:gitee、githup(开源,私有)

私有(局域网)仓库:gitlab、gitea

本地仓库:git客户端创建或者clone

git核心概念

diff:对比

checkout:切换

1.工作区(Working Directory)

  • 你当前正在编辑的文件目录
  • 这些文件可能处于未跟踪或已修改状态

2.暂存区(Staging Area)

  • 一个文件(通常位于.git/index),用于临时保存你打算提交的修改
  • 可以理解为待提交内容的缓冲区

3.本地仓库(Local Repository)

  • 存储所有版本历史的数据库
  • 位于工作区的.git目录中
  • 包含所有提交记录、分支信息等

4.远程仓库(Remote Repository)

  • 托管在网络上的仓库(如GitHub、GitLab)
  • 用于多人协作时同步代码

5.提交(Commit)

  • 对工作区修改的一次永久记录
  • 每个提交都有一个唯一的哈希值作为标识

6.分支(Branch)

  • 指向某个提交的指针
  • 默认分支通常名为main或master
  • 可以创建多个分支并行开发不同功能

Git的工作流程

1.修改文件:在工作区编辑文件

2.暂存修改 :将需要提交的修改添加到暂存区(git add

3.提交修改 :将暂存区的内容提交到本地仓库(git commit

4.同步远程 :将本地仓库的修改推送到远程仓库(git push),或从远程拉取他人的修改(git pull

什么是Git?

Git是目前最流行的分布式版本控制系统,由Linux内核开发者Linus Torvalds于2005年创建。它的设计目标是:

  • 速度快
  • 支持非线性开发(强大的分支能力)
  • 完全分布式
  • 能高效处理大型项目(如Linux内核)

Git与其他版本控制系统的主要区别在于:它对待数据的方式更像是一个"快照流",而不是文件变化的列表。每次提交,Git都会对当时的全部文件创建一个快照并保存引用,而不是只记录差异。

为什么选择Git?

1.性能卓越:Git的所有操作几乎都是本地执行,速度极快

2.强大的分支管理:创建和合并分支非常高效,支持复杂的工作流

3.分布式架构:每个开发者都有完整副本,不怕数据丢失

4.广泛采用:几乎成为行业标准,大量开源项目和企业使用

5.丰富的生态:有GitHub、GitLab等平台提供托管服务,以及众多工具支持

常见的Git工作流

1.集中式工作流:类似SVN,所有人在同一个分支上工作

2.功能分支工作流:每个功能在单独分支开发,完成后合并到主分支

3.GitFlow工作流:有严格的分支模型,区分功能开发、发布准备和bug修复

4.Forking工作流:适合开源项目,通过Fork和Pull Request协作

无论选择哪种工作流,Git的核心功能和概念都是一致的,掌握了基础操作后可以灵活应用于各种场景。

Git的学习曲线虽然有些陡峭,但一旦掌握,将极大提升开发效率和代码管理能力,是现代软件开发不可或缺的工具。


安装步骤

、下载git并安装:

下载地址: https://git-scm.com/downloads

2、注册并登录码云:https://gitee.com/login

登录成功之后到选择【头像--设置--账号管理】绑定手机号,然后到邮箱管理中绑定邮箱,必须绑定邮箱,不然后期加入不了仓库成员,如果加入不了仓库成员,那么就没有权限修改仓库里面的代码。注意不要勾选不公开我的邮箱地址。

3、点击头像旁边的+号按钮选择创建仓库,然后输入仓库的名称,仓库的介绍,选择仓库是开源(所有人可见)还是私有(仅仓库成员可见)。最后点击创建。即可创建一个仓库(存放项目代码的一个云盘)。

4、创建完成之后,点击初始化readme文件。


常用命令:

创建git仓库: mkdir test

cd test

初始化仓库,.git目录,记录配置与每次提交的内容。

git init

将一个文件添加到缓存区

git add .

将缓存区内容提交到本地仓库

git commit -m "注释信息"

同步本地仓库到远程仓库

git push

第一次同步,需要远程地址(创建远程仓库时,自动生成)

类型仓库:

https方式:(直接在仓库那边克隆复制)

git remote add origin https://gitee.com/.......路径

ssh方式:

git remote add origin git@gitee.com:.....路径

克隆仓库

git clone git@gitee.com:瓜酷月/yun11......路径

查看分支:

git branch

创建分支:

git branch dev

切换分支:

git checkout dev

合并分支:

git checkout master

git merge dev


1. 暂存与提交

命令 说明
git add <文件名> 将指定文件从工作区添加到暂存区
git add . 将当前目录所有修改/新增文件添加到暂存区
git add -p 交互式暂存(按块选择文件内容)
git commit -m "提交信息" 将暂存区内容提交到本地仓库
git commit -am "提交信息" 跳过暂存区,直接提交已跟踪文件的修改
git commit --amend 补充提交(合并到上一次提交,修改提交信息)

如果我们想要将本地的一个东西上传上去步骤:

windows中

本地创一个:touch 1.txt

windows中

git add . #把文件添加到缓存区

git commit -m "命令解释随便写"

可以通过git log 查看日志做了什么

git pull origin master --allow-unrelated-histories 拉取远程仓库并允许合并无关历史

git push ( git push --set-upstream origin master)推送本地当前分支到远程对应分支

第一次要输入用户名和密码(电话号和密码)

ubuntu中想要上传本地的代码

apt install git 下载git这个软件

git config --global user.name "姓名"

git config --global user.email "邮箱"

git config --global credential.helper store

git clone 复制的https链接地址

git pull #将代码同步到本地

创文件 vim 2.txt

git add .

git commit -m "备注"

git push (输入用户名和密码)

上传成功

但是每次上传时都需要输入用户名和密码,有时候太麻烦了。我们可以

做一个ssh免密

在windows上

以管理员身份运行

mkdir -p ~/.ssh

ssh-keygen -t ed25519 -C "15635838257@163.com"

cd c/Users/瓜酷月/.ssh/

cat pub文件

把公钥传上来

git push 发现不用密码了,然后就实现了免密。

例如:在ubuntu上,

ssh-keygen生成密钥,cd /root/.ssh/在这里找到公钥文件 cat id_rsa.pub复制内容

git remote -v 查看当前配置的远程地址,这里开头实时https。你当前使用的是 HTTPS 协议 的仓库地址,而 SSH 免密只对 SSH 协议的仓库地址生效。需要调整仓库的远程地址为 SSH 格式

git remote set-url origin git@gitee.com:你的用户名/仓库名.git

例如:

git remote set-url origin git@gitee.com:guakuyue/y11test.git

git push

完整一次

ssh-keygen -t rsa -b 4096 -C "你的邮箱地址"

cat ~/.ssh/id_ed25519.pub

把密码复制到git仓库里面

ssh -T git@gitee.com #查看ssh连接是否成功

git remote -v #查看当前仓库的远程地址

git remote set-url origin git@gitee.com:你的用户名/你的仓库名.git #如果上一条出来https那么执行替换

再次push时发现不用密码了。


2. 撤销操作,回滚

查看提交记录:

git log

回滚到某次提交的内容:

git reset --soft 哈希值:软回滚保留缓存区和工作区数据,用于下次提交

git reset --hard哈希值:硬回滚,清除缓存区和工作区数据,版本回滚

git reset --mixed 哈希值:混合回滚

命令 说明
git restore <文件名> 撤销工作区修改(未暂存的文件)
git restore --staged <文件名> 将暂存区文件撤回工作区
git reset --soft <提交哈希> 回滚到指定提交(保留暂存区和工作区)
git reset --mixed <提交哈希> 回滚到指定提交(清空暂存区,保留工作区)
git reset --hard <提交哈希> 强制回滚(清空暂存区+删除工作区修改)
git revert <提交哈希> 生成撤销提交(保留原历史,适合已推送的代码)
撤销操作命令详解:

1.撤销工作区修改

git restore src/login.js:适用于:修改了文件但未执行 git add,想放弃修改,恢复到文件上一次提交或暂存的状态。修改会丢失,执行前确保无需保留。

2.取消暂存

git restore --staged src/login.js:适用于:执行 git add 后发现文件有错误,想取消暂存但保留修改。执行后文件从暂存区回到工作区,可重新修改后再 git add

3.软回滚(保留变更)

git reset --soft HEAD~1

  • HEAD~1 表示上一次提交(HEAD~2 表示上上次,也可直接用提交哈希)
  • 效果:本地仓库回滚到指定提交,暂存区和工作区的修改完全保留(适合合并多次连续提交) 示例:最近两次提交可合并为一次,执行后最近一次提交的内容会回到暂存区,重新 git commit 即可合并。

4.混合回滚(默认模式)

git reset --mixed HEAD~1

  • 效果:本地仓库回滚到指定提交,暂存区清空,工作区修改保留(适合"提交后发现代码需调整,想重新提交")
  • 示例:提交后发现代码有小问题,执行后可直接修改工作区文件,重新 git addgit commit

5.强制回滚(危险操作)

git reset --hard a1b2c3d

  • 效果:本地仓库回滚到指定提交(a1b2c3d 为目标提交哈希),暂存区和工作区的所有修改永久删除
  • 适用场景:提交了错误代码(如包含密码、病毒文件),需彻底清除
  • 警告:执行前务必确认修改无需保留,且该提交未推送到远程(否则会影响团队协作)。

6.生成撤销提交(安全回滚)

git revert a1b2c3d

  • 适用于:已推送到远程的错误提交,需撤销但保留原历史(避免修改共享的提交记录)
  • 效果:创建一个新提交,内容为"抵消 a1b2c3d 提交的修改",原提交仍保留在历史中
  • 操作:执行后会打开编辑器填写撤销原因,提交后远程仓库会新增一个撤销提交,团队成员拉取后即可同步修改。

多人协同开发

1.邀请仓库成员,选择自己的仓库,然后点击【管理-仓库成员管理-可以添加仓库管理成员】。选择仓库权限为开发者,邀请成功之后,成员就可以在自己的账户中看到该仓库,就可以共同开发一个项目。

2、可以在【管理-仓库设置-基本信息】修改仓库是否开源。也可以删除修改仓库。

3、https与ssh克隆的区别,ssh安全性更高,必须设置密钥才能克隆拉取代码。配置完成之后可以用ssh拉取

团队协作中,需与 GitHub/GitLab 等远程仓库同步代码(拉取/推送/关联)。

命令 说明
git remote 查看已关联的远程仓库列表
git remote -v 查看远程仓库的详细地址
git remote add <远程名> <远程地址> 关联远程仓库
git pull 拉取远程分支代码并合并到本地当前分支
git pull <远程名> <远程分支>:<本地分支> 拉取指定远程分支到本地指定分支
git push 推送本地当前分支到远程对应分支(首次需 -u 绑定)
git push <远程名> <本地分支>:<远程分支> 推送本地分支到远程指定分支
git fetch 拉取远程仓库信息(不合并,仅更新本地跟踪分支)
git remote set-url <远程名> <新地址> 修改远程仓库地址

远程协作命令详解:

1.查看远程仓库名称

git remote:列出本地已关联的远程仓库名称,默认克隆的仓库名通常为 origin

复制代码
origin
upstream  # 若关联了上游仓库(如 Fork 项目后)

2.查看远程仓库地址

git remote -v:显示每个远程仓库的拉取(fetch)和推送(push)地址:

复制代码
origin  https://github.com/your-name/your-repo.git (fetch)
origin  https://github.com/your-name/your-repo.git (push)
upstream  https://github.com/original-owner/original-repo.git (fetch)
upstream  https://github.com/original-owner/original-repo.git (push)

3.关联远程仓库

本地新建仓库后,需关联远程仓库才能推送代码:

复制代码
git remote add origin https://github.com/your-name/new-repo.git

其中 origin 是远程仓库的别名(可自定义,通常用 origin),后续推送/拉取时直接使用别名即可。

4.拉取远程代码(默认分支)

git pull:拉取远程仓库中与本地当前分支对应的分支(如本地 main 对应远程 origin/main),并自动合并到本地分支。相当于 git fetch + git merge,拉取前建议提交本地修改,避免冲突。

5.拉取指定远程分支

git pull origin dev:local-dev:拉取远程 origin/dev 分支的代码,合并到本地 local-dev 分支(本地分支不存在时会自动创建)。适用于同步远程非对应分支的场景。

6.推送本地分支到远程

  • 首次推送:需绑定"上游分支"(远程分支与本地分支关联)

    git push -u origin feature/payment # 推送本地 feature/payment 到远程 origin/feature/payment

  • 后续推送:绑定后直接执行 git push 即可,无需重复指定远程和分支。

7.推送本地分支到远程指定分支

git push origin local-test:remote-test:将本地 local-test 分支的代码推送到远程 remote-test 分支(远程分支不存在时会自动创建),适用于本地与远程分支名不同的场景。

8.拉取远程信息(不合并)

git fetch origin:拉取远程仓库的所有分支信息到本地(更新本地的远程跟踪分支,如 origin/main),但不合并到本地分支。适合先查看远程最新代码,再决定是否合并:

复制代码
git fetch origin          # 拉取远程信息
git checkout origin/main  # 查看远程 main 分支的最新代码
git merge origin/main     # 手动合并到本地 main 分支(如需)

9.修改远程仓库地址 当远程仓库迁移(如从 GitHub 迁移到 GitLab)时,需更新地址:

复制代码
git remote set-url origin https://new-url.git

执行后可用 git remote -v 验证地址是否更新。


git多分支管理

仓库最高的权限是master主分支,多人开发,master主分支不允许修改上传代码的。他是最高权限,一般都是由架构师来操作,其他人是不允许修改,一般master只修改一次上传项目需要的框架以及素材。

如果我们想上传代码?

新建一个属于自己的分支ceshi,这个分支叫子分支。子分支继承了主分支master所有的代码。一个仓库由很多分支,每个分支的代码都是一套独立的代码,都是从master继承过来的,每个人只在自己的分支上修改代码。

每个人进公司都会给你一个git地址,这个git是有权限的,然后再给你一个子分支。你做完项目先提交到自己的分支上,当你做完之后, 确定自己子分支的内容没有问题之后,然后将子分支中的内容合并到主分支上。

1、新建分支:在码云仓库中点击master选择新建分支,然后输入分支名称,分支起点从哪个分支继承代码,选择master点击确定。此时这个仓库有两个分支。

【同步远程代码】 git pull

【查看所有的分支】 git branch -a

【切换分支】git checkout 分支名称

4、提交分支代码:在ceshi分支上,新建ceshi.txt,并执行下面命令提交到ceshi分支。

复制代码
git pullgit add .git commit -m"提交到子分支"git push

但是我们会发现分支里的内容并不会主分支里

这时候就有了合并功能:

复制代码
【查看所有分支】 git branch -a【切换回主分支】 git checkout 主分支名【然后合并分支】 git merge 子分支名【上传线上仓库】 git push

注意切换分支必须保证当前分支没有可以提交的内容,然后合并到哪个分支就切换到哪个分支。如果合并出现问题只需要输入:qa回车,最后git push即可


标签

3. 标签(版本标记)

用于标记重要版本(如发布版本 v1.0.0),方便后续回溯。

命令 说明
git tag 查看所有本地标签
git tag -a <标签名> -m "标签说明" 创建带注释的标签(推荐)
git tag <标签名> 创建轻量标签(仅存哈希,无注释)
git push origin <标签名> 推送指定标签到远程
git push origin --tags 推送所有本地标签到远程
git tag -d <标签名> 删除本地标签
git push origin --delete <标签名> 删除远程标签
标签命令详解:

1.创建带注释的标签(推荐)

git tag -a v1.0.0 -m "第一个正式发布版本,支持登录、支付功能" :带注释的标签包含标签名、创建者、时间、说明,适合正式版本标记,便于后续查看标签含义。

2.推送标签到远程

  • 推送单个标签:git push origin v1.0.0
  • 推送所有标签:git push origin --tags(批量推送本地所有未推送的标签)

3.基于历史提交打标签 若需为过去的提交打标签,先通过 git log --oneline 找到目标提交哈希,再执行:

复制代码
git tag -a v0.9.0 a1b2c3d -m "修复上线前的最后一个bug"

其中 a1b2c3d 是历史提交的哈希。

4.删除标签

  • 删除本地标签:git tag -d v0.9.0
  • 删除远程标签:git push origin --delete v0.9.0

Git 别名配置(提高效率)

为常用命令设置别名,减少输入量,提升操作效率。通过 git config 配置后,可使用简称代替完整命令。

命令 说明 示例效果
git config --global alias.st status git st 代替 git status git st 等价于 git status
git config --global alias.co checkout git co 代替 git checkout git co main 等价于 git checkout main
git config --global alias.br branch git br 代替 git branch git br 等价于 git branch
git config --global alias.cm "commit -m" git cm 代替 git commit -m git cm "fix: xxx" 等价于 git commit -m "fix: xxx"
git config --global alias.unstage "restore --staged" git unstage 取消暂存 git unstage file.js 等价于 git restore --staged file.js
git config --global alias.last "log -1 HEAD" git last 查看最后一次提交 git last 等价于 git log -1 HEAD

配置示例:

复制代码
# 一次性配置常用别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm "commit -m"
git config --global alias.unstage "restore --staged"

配置后,日常操作可简化为:

复制代码
git st          # 查看状态
git co -b dev   # 创建并切换分支
git br          # 查看分支
git cm "feat: xxx"  # 提交代码

八、其他实用命令

处理特殊场景的辅助命令,如清理工作区、查看差异、暂存工作区等。

命令 说明 示例
git clean -fd 清理工作区的未跟踪文件和目录(-f 删文件,-d 删目录) 执行 git clean -fd 会删除所有未 git add 的新增文件和文件夹(谨慎使用)
git diff 查看工作区与暂存区的差异(未暂存的修改内容) git diff 显示所有未暂存的修改,git diff file.js 仅显示指定文件的修改
git diff --staged 查看暂存区与本地仓库的差异(已暂存但未提交的内容) 执行 git diff --staged 可确认 git add 后的内容是否正确
git stash 暂存当前工作区的修改(未提交的内容),用于临时切换分支 开发到一半需切换分支,执行 git stash 暂存修改,切换回来后用 git stash pop 恢复
git stash pop 恢复最近一次 git stash 暂存的内容,并删除暂存记录 git stash pop 会将暂存的修改恢复到工作区
git stash list 查看所有暂存的记录 执行后显示 stash@{0}: WIP on feature/login: a1b2c3d ... 等暂存列表
git cherry-pick <提交哈希> 将指定提交复制到当前分支(适用于跨分支复用单个提交) main 分支执行 git cherry-pick e4f5g6h,将 e4f5g6h 提交复制到 main

实用命令详解:

1.清理未跟踪文件

git clean -fd:用于删除工作区中所有未被 Git 跟踪的文件(如编译产物、临时文件),执行前建议先用 git clean -nfd 预览会删除的内容(-n 表示模拟操作)。

2.查看差异

  • git diff:对比工作区与暂存区,显示未暂存的修改(如新增、删除的代码行)。
  • git diff --staged:对比暂存区与本地仓库,确认即将提交的内容是否正确。

3.暂存工作区(stash) 场景:正在开发分支 A,需紧急切换到分支 B 修复 bug,但分支 A 的修改未完成不想提交。

复制代码
git stash       # 暂存分支 A 的修改
git checkout B  # 切换到分支 B 修复 bug
# 修复完成后切换回分支 A
git checkout A
git stash pop   # 恢复暂存的修改,继续开发

4.复制提交(cherry-pick) 场景:分支 feature/login 有一个修复 e4f5g6h 需同步到 main 分支,但不想合并整个分支。

复制代码
git checkout main       # 切换到目标分支
git cherry-pick e4f5g6h # 复制 e4f5g6h 提交到 main 分支

若复制时出现冲突,解决方式与合并冲突相同,解决后执行 git cherry-pick --continue 完成操作。

九、常见问题与解决方法

1.提交后发现用户名/邮箱错误 若需修改历史提交的用户信息(仅限未推送到远程的提交):

复制代码
git commit --amend --author="用户名 <邮箱>" --no-edit

若已推送且必须修改(不推荐,会改写历史),需强制推送:

复制代码
git commit --amend --author="用户名 <邮箱>" --no-edit
git push --force origin 分支名  # 谨慎使用,可能覆盖团队成员的提交

2.误将敏感文件提交到仓库 需彻底从历史中删除(以 config.ini 为例):

复制代码
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch config.ini" \
--prune-empty --tag-name-filter cat -- --all
# 推送修改(会改写历史,需通知团队)
git push origin --force --all

同时在 .gitignore 中添加该文件,避免再次提交。

3.拉取代码时提示"Your local changes would be overwritten by merge" 原因:本地有未提交的修改,拉取会覆盖。 解决:

  • 提交本地修改:git add . && git commit -m "暂存本地修改"
  • 暂存本地修改:git stash,拉取后恢复:git stash pop

附:常用场景命令组合

1.新功能开发完整流程

复制代码
# 1. 切换到主分支并拉取最新代码
git checkout main
git pull

# 2. 创建并切换到功能分支
git checkout -b feature/user-profile

# 3. 开发代码(修改/新增文件)...

# 4. 提交代码到本地仓库
git add .
git commit -m "feat: 实现用户资料页编辑功能"

# 5. 推送分支到远程(首次需 -u 绑定)
git push -u origin feature/user-profile

2.修复线上紧急 bug 流程

复制代码
# 1. 切换到主分支并拉取最新代码
git checkout main
git pull

# 2. 创建 bug 修复分支
git checkout -b bugfix/critical-error

# 3. 修复代码...

# 4. 提交修复
git add .
git commit -m "fix: 修复支付接口超时导致的订单异常"

# 5. 推送分支并申请合并到主分支
git push -u origin bugfix/critical-error

3.版本发布流程

复制代码
# 1. 确保主分支代码最新且稳定
git checkout main
git pull

# 2. 打版本标签
git tag -a v1.2.0 -m "v1.2.0 发布:新增用户资料页,修复支付bug"

# 3. 推送标签到远程(触发发布流程)
git push origin v1.2.0
相关推荐
misty youth10 小时前
git命令常用指南
git·github
持续迷茫11 小时前
lint-staged 中 --verbose 选项的深度解析
前端·git
lostElk12 小时前
团队 Git 分管理全流程规范
git·github
亦是行人!16 小时前
删除git中已经提交的target、logs、.idea文件
git
匆叔17 小时前
Git下载全攻略
前端·git
奇树谦19 小时前
Git配置:禁用全局HTTPS验证
git·网络协议·https
小安同学iter1 天前
在idea当中git的基础使用
git
初级代码游戏1 天前
Git或TortoiseGit的小BUG(可解决):空库报错Could not get hash of ““
git·bug
来一碗刘肉面1 天前
git中使用SSH的配置
运维·git·ssh