Git 核心概念与常用操作详解
Git 基本结构理解
在项目根目录中,.git 是一个隐藏文件夹,它并不属于工作区,而是 Git 的版本库所在位置。版本库内部包含多个关键组件:
- 工作区(Working Directory):你当前编辑的文件所在的目录。
- 暂存区(Index/Stage):用于临时存放即将提交的更改。
- 分支(Branch):默认创建的主分支为
master。 - HEAD 指针:指向当前所在的分支。
Git 将添加和提交分为两个步骤(add 和 commit),是为了支持一次性提交多个不同修改。你可以多次使用 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 push 或 git 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 pull 或 git 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