关于Git的一些小秘密

git

一、git概述

git是一个版本控制工具,可以在开发中帮助开发者管理代码的变更、回溯版本历史、实现多人协作等。

1.1 集中式与分布式

特性 集中式(如 SVN、CVS) 分布式(如 Git、Mercurial)
代码存储位置 所有历史版本仅存于中央服务器 每个开发者本地都有完整仓库副本(含全部历史、分支、标签)
工作依赖网络 必须联网才能提交、查看历史、创建分支等 可完全离线工作:提交、分支、合并、回滚均在本地完成
数据安全性 中央服务器宕机或磁盘损坏 → 可能永久丢失全部历史 即使主服务器损毁,任意一个开发者的本地仓库都可恢复整个项目历史
协作方式 所有操作围绕中央服务器进行 开发者之间可直接交换变更(如 git pull 别人仓库),不强制依赖单一中心

1.2 git用途

  1. 记录历史:保存每次代码修改的完整记录(谁、何时、改了什么)。
  2. 版本回退:一键恢复到任意之前的版本,不怕改错。
  3. 分支开发:在独立分支上安全地开发新功能或修复 Bug,不影响主代码。
  4. 多人协作:通过远程仓库(如 GitHub)高效共享和合并代码。
  5. 本地完整备份:每个开发者都拥有全部历史,离线也能提交、回溯。

一句话总结:Git 让代码变更可追踪、可回滚、可协作、更安全。

1.3 仓库结构与状态

  • 仓库结构:
  1. 工作区:位置在你的项目根目录,你直接能看到和编辑的文件
  2. 暂存区(Index) :是一个中间区域,通过git add将工作区的修改"挑选"出来,放入暂存区。下次提交会提交暂存区的内容。
  3. 本地仓库:开发人员自己电脑上的Git仓库。
  4. 远程仓库:远程服务器上的 Git 仓库。
  • 四种状态
  • 未跟踪 (Untracked):新文件,Git 未管理
  • 已修改 (Modified):已修改但未暂存
  • 已暂存 (Staged):已添加到暂存区,准备提交
  • 未修改 (Unmodified):已提交,与最新版本一致
状态 所在区域 说明
未跟踪(Untracked) 工作区 新建文件,从未被 git add
已修改(Modified) 工作区 跟踪过的文件被修改了,但未暂存
已暂存(Staged) 暂存区 git add,准备提交
已提交(Committed) 本地仓库区 git commit,安全保存到历史中

二、Git下载安装与配置

2.1下载安装

官网链接:Git - Install 自行下载安装

在任意目录右键(点击显示更多选项),看到以下内容就代表安装成功:

  • Git GUI Here:打开 Git 图形界面。
  • Git Bash Here:打开 Git 命令行。

2.2配置

基础用户配置(重要:这会记录在每次提交中)

bash 复制代码
git config --global user.name "你的姓名" git config --global user.email "你的邮箱@example.com"

查看所有配置

bash 复制代码
git config --list

三、基本操作(按最基本工作流程)

目标 :完成一次完整的代码修改 → 提交 → 推送流程
前提 :已安装 Git 并配置好 user.nameuser.email

1. 获取代码仓库

情况一:已有远程项目(如 GitHub 上的仓库)
bash 复制代码
git clone https://github.com/用户名/项目名.git
cd 项目名

这是最常见的开始方式,会自动创建本地仓库并关联远程。

情况二:新建本地项目

在选好的本地文件夹输入这个命令,可以在那里建立一个本地git仓库,

初始化当前目录为仓库,初始化后会自动将当前仓库设置为master

bash 复制代码
# 初始化 Git 仓库
git init

可以配合mkdir和cd使用

bash 复制代码
# 创建项目目录
mkdir 项目文件夹名
cd 项目文件夹名

加到暂存区:git add

把新建文件添加到暂存区

bash 复制代码
# 添加特定文件
git add 文件名

# 添加所有变化(包括新文件和修改)
git add .

提交:git commit -m "本次提交的描述信息"

使用git commit命令为其添加修改的描述信息,这样就从暂存区提交到了本地仓库

bash 复制代码
# 基础提交
git commit -m "feat: 添加用户登录功能"

# 修改上一次提交(未推送时)
git commit --amend

链接远程仓库:git remote add origin 你的仓库链接

关联你的仓库,一般origin是默认名字,一看就知道是远程仓库

git commit 会为我们生成40位的哈希值,用于作为id,并把刚刚用git add添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。

推送到远程仓库:git push origin master

推送你master分支上的内容过去,第一次要输入git push -u origin master

加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令

就是说当你第一次用了-u参数后,本地和远程会创建同名分支(如master),本地的master和远程origin的master分支关联起来。以后直接git push即可,此时git push就相当于git push origin master

拉取远程仓库:git pull

git pull命令的作用是从远程仓库获取最新版本并合并到本地仓库。

bash 复制代码
git pull 远程仓库简称 分支名称

注:不要在未提交的修改上直接pull!!!会把你工作区的东西覆盖掉

拉取远程分支:git fetch

bash 复制代码
git fetch 远程仓库简称 

git pull和git fetch的区别

基本定义区别

  • git fetch:从远程仓库下载最新数据,但不改变本地工作状态
  • git pull:从远程仓库下载并合并最新数据到当前分支

更准确地说:

git pull = git fetch + git merge(默认行为)

scss 复制代码
远程仓库 (GitHub/服务器)
    ↓ fetch (只下载)
本地远程跟踪分支 (origin/main)
    ↓ merge/rebase (整合)
本地当前分支 (main)

Pull 实际上是两个命令的组合:

bash 复制代码
# git pull = git fetch + git merge
git fetch origin main
git merge origin/main

git fetch可以安全地查看远程仓库的更新

bash 复制代码
# 想看看别人提交了什么,但不影响当前工作区
git fetch origin

# 查看具体的更新内容
git log origin/main --oneline -5
git show origin/main --stat

# 决定是否合并
git merge origin/main

四、其他常用命令(关于仓库与版本)

1、仓库基本信息查询

命令 具体作用 示例 输出说明
git remote -v 查看远程仓库名称与 URL(fetch/push 地址) git remote -v origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push)
git remote show origin 查看远程仓库详细信息(分支、HEAD、跟踪状态) git remote show origin 显示远程有哪些分支、本地哪些分支已跟踪等
git branch -r 仅列出远程分支(如 origin/main git branch -r origin/dev origin/main
git branch -a 列出所有本地 + 远程分支 git branch -a * main remotes/origin/main
  • 提示:若远程分支未显示,先执行 git fetch --all

2、提交历史查看(Log)

命令 作用 示例 说明
git log 完整提交历史(含 author, date, commit ID, message) git log 按时间倒序显示,按 q 退出
git log --oneline 单行简洁格式(7位 commit ID + message) git log --oneline -5 显示最近 5 条: a1b2c3d fix: 登录按钮样式
git log --graph --all --oneline 图形化显示所有分支合并历史 git log --graph --all --oneline 可见分支分叉与合并线
git log --author="张三" 查看某人提交记录 git log --author="zhangsan" --oneline 支持邮箱或姓名
git log --since="2025-01-01" 查看某日期之后的提交 git log --since="1 week ago" 支持自然语言
git log -p -2 显示最近 2 次提交的完整代码差异 git log -p -2 -p = patch,显示 diff 内容

3、版本穿梭与回退(Reset / Checkout / Revert)

3.1 git checkout(只读切换,不改变历史)
bash 复制代码
# 临时切换到某次提交(进入 "Detached HEAD" 状态)
git checkout a1b2c3d 
# 切换到远程分支的最新状态(只读) 
git checkout origin/main

⚠️ 此时不能直接提交!如需基于此创建新分支:
git checkout -b new-feature a1b2c3d

3.2 git reset(修改提交历史,慎用!)
命令 作用 是否丢弃工作区? 典型场景
git reset --soft HEAD~1 回退 1 次提交,保留暂存区和工作区 ❌ 否 撤销提交但保留代码,重新编辑提交信息
git reset --mixed HEAD~1 回退 1 次提交,清空暂存区,保留工作区(默认) ❌ 否 修改提交内容后重新 add
git reset --hard HEAD~1 彻底删除最近 1 次提交及所有修改 ✅ 是 误提交敏感信息,需彻底清除

💡 HEAD~1 = 上一次提交,HEAD~2 = 上上次,HEAD@{2} = reflog 中第 2 条

3.3 git revert(安全回退,新增反向提交)
bash 复制代码
# 创建一个新提交,撤销指定 commit 的变更(不改历史)
git revert a1b2c3d

推荐用于已推送的公共分支,避免重写历史

四、标签管理(Tag)------ 用于版本发布

命令 作用 示例
git tag 列出所有标签(按字母排序) git tagv1.0.0 v1.1.0
git tag -l "v1.*" 模糊匹配标签 git tag -l "v2.*"
git tag v1.2.0 创建轻量标签(仅指向 commit) git tag v1.2.0
git tag -a v1.2.0 -m "正式发布 v1.2" 创建带注解标签(含作者、日期、消息) ✅ 推荐方式
git show v1.2.0 查看标签详情(含对应 commit 和 diff) git show v1.2.0
git push origin v1.2.0 推送单个标签 git push origin v1.2.0
git push origin --tags 推送所有本地标签 git push origin --tags
git tag -d v1.2.0 删除本地标签 git tag -d v1.2.0
git push origin :refs/tags/v1.2.0 删除远程标签 ⚠️ 注意冒号语法

五、引用日志(Reflog)------ "后悔药"

bash 复制代码
# 查看 HEAD 移动历史(包括 reset、checkout、merge 等操作)
git reflog

输出示例:

text 复制代码
a1b2c3d HEAD@{0}: reset: moving to HEAD~1 
b2c3d4e HEAD@{1}: commit: feat: add user login 
c3d4e5f HEAD@{2}: checkout: moving from dev to main

💡 救命场景 : 误执行 git reset --hard 后,用 git reflog 找到之前的 commit ID,再:

bash 复制代码
git reset --hard b2c3d4e # 恢复到丢失的提交

六、差异比较(Diff)

命令 比较范围 说明
git diff 工作区 vs 暂存区 查看未暂存的修改
git diff --staged 暂存区 vs 最近提交(HEAD) 查看即将提交的内容
git diff HEAD 工作区 vs HEAD 所有本地修改(无论是否暂存)
git diff main..dev 分支 maindev 的差异 等价于 git diff main dev
git diff a1b2c3d..b2c3d4e 两个 commit 之间的差异 可省略 ..
git diff --name-only 仅显示文件名(不显示内容) 适合快速扫描改动范围

实战示例:

bash 复制代码
# 查看本次修改了哪些文件 
git diff --name-only 
# 确认即将提交的内容是否正确 
git diff --staged

七、其他高价值命令

命令 作用 示例
git shortlog -sn 统计贡献者提交次数 git shortlog -sn15 张三 8 李四
git describe 生成人类可读的版本号(基于最近标签) git describev1.2.0-3-ga1b2c3d (表示 v1.2.0 后第 3 次提交)
git archive --format=zip -o v1.2.0.zip v1.2.0 打包指定版本为 zip(不含 .git) 用于发布源码包
git ls-files 列出 Git 跟踪的所有文件 git ls-files '*.js' → 所有 JS 文件

总结:关键命令速查表(最常用)

场景 命令
查看远程地址 git remote -v
查看简洁提交历史 git log --oneline -10
安全回退一次提交(保留代码) git reset --soft HEAD~1
彻底找回"消失"的提交 git refloggit reset --hard <ID>
创建带注释的版本标签 git tag -a v2.0.0 -m "Release"
推送所有标签 git push origin --tags
查看即将提交的内容 git diff --staged

五、分支管理操作

查看所有分支

bash 复制代码
git branch -av

创建新分支

bash 复制代码
git branch 分支名

切换分支

bash 复制代码
git checkout 分支名

删除已合并分支

bash 复制代码
git branch -d 分支名

强制删除分支

bash 复制代码
git branch -D 分支名

重命名分支

bash 复制代码
git branch -m 新分支名

合并分支

当我们新建分支并做完工作之后,要把分支提交至master,就切换到master仓,并执行git merge:

bash 复制代码
git merge 分支名

六、团队开发建议与规范

一、分支策略模型

推荐模型:简化 Git Flow(适合大多数团队)
text 复制代码
main(或 master) ← 稳定生产环境 
│ 
├── develop ← 集成测试环境 
│ 
├── feature/* ← 功能开发(如 feature/user-login)
├── release/v1.2.0 ← 发布准备(冻结新功能,只修 Bug)
└── hotfix/* ← 紧急线上修复(直接从 main 拉出)
规范要求:
  • main / develop 分支受保护(禁止直接 push)
  • 所有功能必须通过 Pull Request / Merge Request 合并
  • 分支命名统一前缀(见下表)
分支类型 命名规范 生命周期
功能分支 feature/描述(如 feature/payment 开发完成即删
修复分支 fix/问题简述(如 fix/login-bug 合并后删除
发布分支 release/vX.Y.Z 发布后合并到 main 和 develop
热修分支 hotfix/紧急问题 修复后立即合并到 main 和 develop

二、提交规范(Commit Message)

常用 type:
  • feat: 新功能
  • fix: 修复 Bug
  • docs: 文档更新
  • style: 格式调整(不影响逻辑)
  • refactor: 重构
  • test: 测试相关
  • chore: 构建/依赖更新
示例:
bash 复制代码
git commit -m "feat(auth): add SMS login support" 
git commit -m "fix(order): resolve timeout on payment page"

三、代码审查Pull Request 标准流程

1、创建功能分支

bash 复制代码
git checkout -b 分支名 #分支名最好写:类型/描述

2、开发并提交

bash 复制代码
git add .
git commit -m "feat: 实现用户登录基础功能"
git push origin 分支名 #分支名最好写:类型/描述

3、创建 Pull Request ,在 GitHub 页面创建 PR并填写清晰的标题和描述,关联相关 Issue,让团队进行审查合并。

4、合并与清理

bash 复制代码
# 合并后删除远程分支
git push origin --delete 分支名 #分支名最好写:类型/描述

# 清理本地分支
git branch -d 分支名 #分支名最好写:类型/描述

# 更新本地 main 分支
git checkout main
git pull origin main

日常开发工作流程

bash 复制代码
# 开始干活
git checkout main
git pull origin main
git branch 分支名 #分支名最好写:<类型>/<简短描述>
git checkout 分支名 #分支名最好写:<类型>/<简短描述>

# 干活...
git add .
git commit -m "feat: 完成某个模块"

# 同步远程更新
git fetch origin
git rebase origin/main  # 或 git merge origin/main

# 干完活推送
git push origin 分支名 #分支名最好写:<类型>/<简短描述>

注:不要在未提交的修改上直接pull!!!

相关推荐
无限进步_2 小时前
【C语言&数据结构】二叉树链式结构完全指南:从基础到进阶
c语言·开发语言·数据结构·c++·git·算法·visual studio
claem4 小时前
Mac端Git基于Pycharm使用心得与理解
git
muddjsv4 小时前
Git 命令版本变迁:从简陋工具到分布式协作的史诗级进化
git
王老邪13 小时前
Windows下利用PowerShell实现Git自动推送
windows·git
极客先躯14 小时前
如何自动提取Git指定时间段的修改文件?Win/Linux双平台解决方案
linux·git·elasticsearch
小邓的技术笔记14 小时前
Git 中模糊搜索分支名称并创建本地跟踪分支
git
A half moon18 小时前
【从开发到上线-全栈开发教程】Git上传本地项目到仓库
git
三水吉吉19 小时前
git commit 后,取消其中一个文件的提交
git
Albert Edison20 小时前
【Git】多人协作二(不同分支下)
git·elasticsearch·svn·github