当前位置:首页 > 技术 > 正文内容

Git 核心概念与常用操作详解

访客 技术 2026年7月18日 1

Git 基本结构理解

在项目根目录中,.git 是一个隐藏文件夹,它并不属于工作区,而是 Git 的版本库所在位置。版本库内部包含多个关键组件:

  • 工作区(Working Directory):你当前编辑的文件所在的目录。
  • 暂存区(Index/Stage):用于临时存放即将提交的更改。
  • 分支(Branch):默认创建的主分支为 master
  • HEAD 指针:指向当前所在的分支。

Git 将添加和提交分为两个步骤(addcommit),是为了支持一次性提交多个不同修改。你可以多次使用 git add 添加各类变更,最后统一提交。

# 添加单个文件到暂存区
git add README.md

# 批量添加多个文件
git add src/ test/

# 提交所有暂存内容
git commit -m "完成用户登录功能开发"

初始化本地仓库与基础配置

开始使用 Git 前,需进行基本设置:

# 初始化空仓库
git init

# 设置用户名和邮箱(用于标识提交者)
git config user.name "Zhang San"
git config user.email "zhangsan@example.com"

# 查看当前配置信息
git config --list

# 验证用户身份设置是否成功
git config user.name
git config user.email

通过创建 .gitignore 文件可指定不纳入版本控制的内容:

# 忽略编译生成的类文件
*.class

# 忽略 IDE 配置目录
/.idea/
/node_modules/

# 忽略日志文件
*.log

查看提交历史记录

Git 提供多种方式查看版本演进过程:

# 显示完整提交历史
git log

# 精简输出,每条记录占一行
git log --oneline

# 显示每次修改的具体差异
git log -p

# 显示最近三次提交
git log -3

# 图形化展示分支合并情况
git log --graph --oneline --all

# 更丰富的格式化输出(含颜色、作者、时间等)
git log --graph --pretty=format:'%Cred%h%Creset - %s %Cgreen(%cr)%Creset by %an' --abbrev-commit

此外,可以使用 git reflog 查看所有执行过的命令记录,即使某些提交已被回退也能找回其哈希值。

自定义命令别名提升效率

为简化复杂命令,可通过别名机制快速调用:

# 创建一个名为 lg 的别名,用于可视化日志
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

# 使用时只需输入
git lg

连接远程仓库

将本地仓库与远程服务(如 GitHub、Gitee)关联:

# 添加远程地址,命名为 origin
git remote add origin git@gitee.com:user/project.git

# 推送本地 master 分支到远程同名分支
git push origin master

# 首次推送并建立上游跟踪关系(推荐)
git push -u origin master

建立跟踪后,后续可以直接使用 git pushgit pull 而无需重复指定分支。

从远程检出并关联新分支:

# 切换到远程 dev 分支并在本地创建对应分支
git checkout -b dev origin/dev

远程仓库状态查询

# 列出已配置的远程仓库名称
git remote

# 显示详细远程地址(包括 fetch 和 push 地址)
git remote -v

# 查看所有远程分支
git branch -r

# 查看本地与远程所有分支
git branch -a

# 查看本地分支与其上游分支的关联状态
git branch -vv

克隆远程项目

获取远程代码仓库的副本:

# 克隆主分支
git clone https://github.com/user/repo.git

# 克隆特定分支并指定本地目录
git clone -b develop https://github.com/user/repo.git my-project

fetch 与 pull 的区别

  • git fetch:仅下载远程更新,不会自动合并到当前分支。
  • git pull:相当于 fetch + merge,会尝试将远程更改合并至本地。

注意:当工作区或暂存区有未提交的更改时,不能直接执行 git pullgit checkout。解决方案包括:

  • 先提交更改:git commit -m "临时保存"
  • 暂存更改:git stash,之后再恢复。

处理合并冲突

以下场景容易引发冲突:

  • 合并两个修改了同一文件的分支
  • 执行 git pull 时本地与远程存在冲突
  • 恢复 stash 中保存的工作进度

解决方法是手动编辑冲突文件,保留所需内容,然后重新提交。

分支管理操作

# 创建新分支
git branch feature/user-auth

# 切换分支
git checkout feature/user-auth

# 一步完成创建并切换
git checkout -b feature/user-auth

# 合并某分支到当前分支
git merge feature/user-auth

# 删除已合并的本地分支
git branch -d feature/user-auth

# 强制删除未合并分支
git branch -D old-experiment

# 删除远程分支(方式一)
git push origin --delete old-branch

# 删除远程分支(方式二)
git push origin :old-branch

临时保存工作现场:git stash

当你需要切换分支但又不想立即提交当前修改时,可以使用 stash 功能。

# 保存当前未提交的修改
git stash save "正在修复登录bug"

# 查看所有暂存记录
git stash list

# 恢复最新一次暂存(并从列表中移除)
git stash pop

# 恢复指定暂存但保留记录
git stash apply stash@{1}

# 删除某个暂存项
git stash drop stash@{0}

# 清空所有暂存
git stash clear

撤销操作指南

适用于已跟踪文件的撤销策略:

# 用暂存区内容覆盖工作区(放弃工作区修改)
git checkout -- file.txt

# 用指定版本替换工作区和暂存区
git checkout a1b2c3d file.txt

# 取消暂存(保留工作区修改)
git reset HEAD -- file.txt
git reset HEAD -- .

版本回退机制

使用 git reset 实现版本倒退:

# 回退到上一个提交(彻底丢弃后续更改)
git reset --hard HEAD^

# 回退十次提交
git reset --hard HEAD~10

# 回退到特定提交(根据 commit ID)
git reset --hard e4f5a6b

其中:

  • HEAD 表示当前提交
  • HEAD^ 表示前一个提交
  • HEAD~n 表示往前第 n 个提交

reset 与 checkout 的核心区别

  • git checkout <commit> .:将其他版本的内容复制到当前工作区,**当前分支指针不变**。
  • git reset --hard <commit>:移动当前分支指针指向目标提交,**HEAD 发生变化**。

删除文件的正确做法

若要让 Git 跟踪文件删除动作:

# 删除文件并提交记录
git rm filename.txt
git commit -m "移除废弃配置文件"

若仅删除物理文件而不通知 Git,则下次提交仍可能包含该文件。

生成 SSH 密钥实现免密通信

为了安全高效地连接远程仓库,建议配置 SSH Key:

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

生成的公钥(通常位于 ~/.ssh/id_rsa.pub)应添加至 GitHub/Gitee 等平台账户中。一台设备对应一个密钥,多台设备可分别添加各自的公钥。

发布版本标签管理

为重要里程碑打标签便于后续追溯:

# 创建带注释的本地标签
git tag -a v1.2.0 -m "正式发布版本 1.2.0"

# 推送标签到远程
git push origin v1.2.0

# 推送所有本地标签
git push origin --tags

# 删除本地标签
git tag -d v1.1.0

# 删除远程标签
git push origin --delete tag v1.1.0

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。