2023-12-05
工具与效率
00
请注意,本文编写于 731 天前,最后修改于 11 天前,其中某些信息可能已经过时。

目录

一、Git 核心概念
1.1 三个核心区域
1.2 四种文件状态
二、Git 环境搭建(首次使用)
2.1 安装 Git
2.2 配置用户信息
三、Git 基础操作(核心流程)
3.1 初始化仓库或克隆远程仓库
3.1.1 本地项目初始化
3.1.2 克隆远程仓库
3.2 暂存修改(git add)
3.3 提交到版本库(git commit)
3.4 查看状态与历史(git status/git log)
四、远程仓库操作(团队协作核心)
4.1 关联远程仓库(git remote)
4.2 推送本地提交到远程(git push)
4.3 从远程拉取最新代码(git pull/git fetch)
4.4 拉取远程分支到本地(git checkout)
五、分支操作(Git 核心优势)
5.1 分支核心概念
5.2 常用分支命令
5.3 解决分支合并冲突
六、Git 进阶操作(实用技巧)
6.1 撤销修改(针对不同场景)
6.2 忽略文件(.gitignore)
但保留 README.txt(排除规则)
忽略 dist 目录及其下所有内容
忽略 IDE 配置文件
忽略日志文件
6.3 stash 暂存工作区(git stash)
七、常见问题与解决方案
7.1 推送失败:fatal: refusing to merge unrelated histories
7.2 忘记提交修改,直接切换分支导致修改丢失
7.3 SSH 连接远程仓库失败:Permission denied (publickey)
八、总结与学习资源
推荐学习资源

本文档针对 Git 初学者及需要巩固基础的开发者,梳理 Git 核心概念与高频操作,结合实际场景示例,帮助快速上手并解决日常使用中的常见问题。

一、Git 核心概念

在使用 Git 前,需明确三个核心区域与四种状态,这是理解所有操作的基础。

1.1 三个核心区域

  • 工作区(Working Directory):本地正在编辑的文件目录,即日常操作的文件所在位置。

  • 暂存区(Stage/Index):用于临时存放待提交的文件修改,是工作区与版本库之间的“中转站”,可通过命令将工作区修改添加至此。

  • 版本库(Repository):Git 管理的核心区域,存储所有提交的版本信息,位于工作区下的 .git 隐藏目录中,包含本地分支、提交记录等关键数据。

1.2 四种文件状态

  1. 未跟踪(Untracked):新创建的文件,Git 未对其进行任何管理,需通过 git add 命令纳入跟踪。

  2. 已跟踪 - 未修改(Unmodified):文件已被 Git 跟踪,且当前内容与版本库中最新版本一致,若修改则变为“已修改”状态。

  3. 已跟踪 - 已修改(Modified):文件内容被修改,但未添加到暂存区,需通过 git add 提交到暂存区。

  4. 已跟踪 - 已暂存(Staged):文件修改已添加到暂存区,等待通过 git commit 命令提交到版本库。

二、Git 环境搭建(首次使用)

包括 Git 安装与用户信息配置,仅需执行一次。

2.1 安装 Git

  • Windows:访问 Git 官网 下载安装包,按向导完成安装(建议默认选项,可勾选“Add Git Bash Here”方便右键调用)。

  • macOS:通过 App Store 安装 Xcode,或使用 Homebrew 命令 brew install git

  • Linux:Debian/Ubuntu 系统使用 sudo apt-get install git;CentOS/RHEL 系统使用 sudo yum install git

验证安装:打开终端(Windows 为 Git Bash 或命令提示符),输入 git --version,若显示版本号则安装成功。

2.2 配置用户信息

Git 需通过用户信息关联提交记录,全局配置一次即可(若需为单个项目配置不同信息,可进入项目目录后去掉 --global 参数):

bash
# 配置用户名(建议与代码托管平台一致,如 GitHub/GitLab 用户名) git config --global user.name "Your Name" # 配置邮箱(建议与代码托管平台绑定邮箱一致) git config --global user.email "your.email@example.com" # 验证配置 git config --global --list

三、Git 基础操作(核心流程)

Git 核心工作流程:修改文件 → 暂存修改 → 提交到版本库 → 推送至远程仓库,以下按流程详解。

3.1 初始化仓库或克隆远程仓库

两种场景:新建本地项目后初始化 Git 仓库,或从远程平台(如 GitHub)克隆已有仓库。

3.1.1 本地项目初始化

bash
# 1. 进入本地项目目录(替换为你的项目路径) cd /path/to/your/project # 2. 初始化 Git 仓库,生成 .git 目录 git init

3.1.2 克隆远程仓库

从远程仓库复制完整项目到本地,适用于参与已有项目开发:

bash
# 格式:git clone 远程仓库地址(HTTPS 或 SSH 地址) # 示例:克隆 GitHub 上的 test 仓库 git clone https://github.com/your-username/test.git # 克隆后自动生成与仓库同名的目录,进入目录即可操作 cd test

远程地址选择:HTTPS 地址无需配置密钥,每次推送需输入账号密码;SSH 地址需配置 SSH 密钥,配置后可免密操作,推荐开发环境使用 SSH 地址。

3.2 暂存修改(git add)

将工作区的修改添加到暂存区,是提交前的必要步骤。

bash
# 1. 暂存单个文件(替换为具体文件名) git add filename.txt # 2. 暂存多个指定文件(空格分隔) git add file1.txt file2.jpg # 3. 暂存当前目录下所有修改(包括新增、修改、删除) git add . # 4. 暂存指定目录下所有修改(替换为目录路径) git add ./src # 5. 取消暂存指定文件(已暂存后想撤回) git reset HEAD filename.txt

3.3 提交到版本库(git commit)

将暂存区的修改提交到本地版本库,生成一条不可修改的提交记录,需填写提交说明(描述本次修改内容)。

bash
# 1. 基本提交(执行后会打开默认编辑器填写提交说明) git commit # 2. 快捷提交(直接在命令后填写提交说明,推荐简单修改使用) git commit -m "feat: 新增用户登录功能" git commit -m "fix: 修复移动端适配问题" # 3. 提交所有已跟踪文件的修改(无需先执行 git add,新增文件不生效) git commit -am "refactor: 优化数据处理逻辑" # 4. 修改最近一次提交(未推送到远程时可用,避免生成多余记录) git commit --amend -m "feat: 新增用户登录功能(补充:添加验证码校验)"

提交说明规范:建议遵循 Conventional Commits 规范,格式为“类型: 描述”,常见类型包括 feat(新功能)、fix(修复 bug)、docs(文档修改)、style(代码格式调整)、refactor(重构)、test(测试相关)、chore(构建/工具配置)。

3.4 查看状态与历史(git status/git log)

日常开发中常用命令,用于查看文件状态和提交历史。

bash
# 1. 查看当前工作区与暂存区状态(核心命令,高频使用) git status # 2. 查看提交历史(按时间倒序显示,最新提交在最前) git log # 3. 简化显示提交历史(仅显示提交哈希前7位、作者、时间、说明) git log --oneline # 4. 显示分支合并历史(清晰看到分支创建与合并记录) git log --graph --oneline --all # 5. 查看指定文件的提交历史(跟踪文件修改记录) git log filename.txt # 6. 查看最近 n 次提交(n 为数字,如查看最近3次) git log -3

四、远程仓库操作(团队协作核心)

远程仓库是团队协作的桥梁,常用平台包括 GitHub、GitLab、Gitee 等,核心操作包括关联远程、推送、拉取、拉取请求等。

4.1 关联远程仓库(git remote)

本地仓库需关联远程仓库后,才能进行推送和拉取操作。

bash
# 1. 关联远程仓库(origin 是远程仓库的默认别名,可自定义) git remote add origin 远程仓库地址 # 示例:git remote add origin git@github.com:your-username/test.git # 2. 查看已关联的远程仓库 git remote -v # 3. 修改远程仓库地址(如远程仓库地址变更) git remote set-url origin 新的远程仓库地址 # 4. 删除关联的远程仓库 git remote rm origin

4.2 推送本地提交到远程(git push)

将本地版本库的提交推送到远程仓库,实现代码同步。

bash
# 1. 首次推送当前分支到远程(--set-upstream 关联本地与远程分支,后续可简化命令) git push --set-upstream origin 本地分支名 # 示例:推送本地 main 分支到远程 main 分支 git push --set-upstream origin main # 2. 后续推送(已关联分支后,直接执行) git push # 3. 强制推送(谨慎使用!覆盖远程分支内容,仅在本地提交修正远程错误时使用) git push -f origin 分支名 # 更安全的强制推送(保留远程新增提交,推荐) git push --force-with-lease origin 分支名

4.3 从远程拉取最新代码(git pull/git fetch)

团队协作中,需定期拉取远程最新代码,避免冲突。

bash
# 1. 拉取远程指定分支并合并到本地当前分支(常用,等价于 git fetch + git merge) git pull origin 远程分支名 # 示例:拉取远程 main 分支并合并到本地当前分支 git pull origin main # 2. 已关联分支后,简化命令 git pull # 3. 仅拉取远程代码到本地缓存,不合并(需手动合并,适合复杂场景) git fetch origin 远程分支名 # 查看拉取的内容与本地差异 git diff 本地分支名 origin/远程分支名 # 手动合并到本地分支 git merge origin/远程分支名

4.4 拉取远程分支到本地(git checkout)

当远程有新分支(如同事创建的开发分支),需拉取到本地进行开发。

bash
# 方法1:直接创建并切换到本地分支,关联远程分支 git checkout -b 本地分支名 origin/远程分支名 # 示例:拉取远程 dev 分支到本地 dev 分支 git checkout -b dev origin/dev # 方法2:先拉取远程分支信息,再切换(适用于已知道远程分支存在) git fetch origin git checkout 远程分支名 # 本地分支名与远程一致时可省略本地分支名

五、分支操作(Git 核心优势)

分支可实现并行开发,如主分支保持稳定,开发分支用于功能开发,修复分支用于紧急 bug 修复,避免代码混乱。

5.1 分支核心概念

  • 主分支(main/master):默认主分支,存储正式发布的代码,禁止直接在主分支开发。

  • 开发分支(dev):团队共用开发分支,所有功能开发完成后合并至此。

  • 功能分支(feature/*):基于 dev 分支创建,用于单个功能开发(如 feature/login),开发完成后合并回 dev 分支。

  • 修复分支(hotfix/*):基于 main 分支创建,用于修复线上紧急 bug(如 hotfix/payment-error),修复完成后同时合并到 main 和 dev 分支。

5.2 常用分支命令

bash
# 1. 查看本地所有分支(当前分支前有 * 标记) git branch # 2. 查看本地与远程所有分支 git branch -a # 3. 创建本地分支(基于当前分支创建) git branch 分支名 # 示例:基于 dev 分支创建 feature/login 分支(需先切换到 dev 分支) git checkout dev git branch feature/login # 4. 创建并切换到新分支(常用,等价于先创建再 checkout) git checkout -b 分支名 # 示例:基于 dev 分支创建并切换到 feature/pay git checkout -b feature/pay dev # 5. 切换分支 git checkout 分支名 # 简化命令(Git 2.23+ 支持) git switch 分支名 # 6. 合并分支(将目标分支合并到当前分支) # 示例:当前在 dev 分支,合并 feature/login 分支 git checkout dev git merge feature/login # 7. 删除本地分支(分支已合并到主分支后使用) git branch -d 分支名 # 强制删除未合并的分支(谨慎使用) git branch -D 分支名 # 8. 删除远程分支 git push origin --delete 远程分支名 # 示例:删除远程 feature/login 分支 git push origin --delete feature/login

5.3 解决分支合并冲突

当两个分支修改了同一文件的同一部分内容时,合并会触发冲突,Git 无法自动判断保留哪部分内容,需手动解决。

  1. 冲突提示:执行 git merge 后,终端会提示 “Automatic merge failed; fix conflicts and then commit the result.”。

  2. 查看冲突文件:冲突文件中会出现特殊标记,标记冲突的两部分内容: `<<<<<< HEAD # 当前分支的内容 当前分支修改的内容 ======= 目标分支修改的内容

feature/login # 被合并分支的内容`

  1. 手动解决冲突:打开冲突文件,根据业务需求删除特殊标记和无用内容,保留正确代码。

  2. 完成合并:解决所有冲突后,执行以下命令提交合并结果: git add 冲突文件名 # 暂存解决后的文件 git commit -m "merge: 合并 feature/login 分支,解决登录功能冲突"

六、Git 进阶操作(实用技巧)

6.1 撤销修改(针对不同场景)

bash
# 1. 撤销工作区未暂存的修改(单个文件) git checkout -- filename.txt # 2. 撤销工作区所有未暂存的修改(谨慎使用,会丢失未保存的修改) git checkout . # 3. 撤销暂存区的修改(已 git add 但未 commit,回到已修改状态) git reset HEAD filename.txt # 撤销所有暂存区修改 git reset HEAD . # 4. 回退到指定版本(已 commit,未推送到远程) # 先通过 git log --oneline 查看目标版本的哈希值(如 a1b2c3d) git reset --hard 版本哈希值 # 回退到上一个版本(简化写法,^ 表示上一个,^^ 表示上两个) git reset --hard HEAD^ # 5. 回退已推送到远程的版本(谨慎使用!会覆盖远程记录) git reset --hard 版本哈希值 git push -f origin 分支名

6.2 忽略文件(.gitignore)

用于指定 Git 无需跟踪的文件/目录,如编译产物、日志、IDE 配置文件等,避免提交到版本库。

  1. 在项目根目录创建 .gitignore 文件。

  2. 按规则编写需要忽略的内容,示例: `# 忽略所有 .txt 文件 *.txt

但保留 README.txt(排除规则)

!README.txt

忽略 dist 目录及其下所有内容

dist/

忽略 IDE 配置文件

.idea/ .vscode/

忽略日志文件

*.log`

若文件已被 Git 跟踪(曾提交过),修改 .gitignore 后需先执行 git rm --cached 文件名 移除跟踪,再提交 .gitignore 文件。

6.3 stash 暂存工作区(git stash)

当正在开发的功能未完成,需临时切换到其他分支(如修复紧急 bug)时,可使用 stash 暂存当前工作区的修改,切换分支后再恢复。

bash
# 1. 暂存当前工作区所有未提交的修改(包括已修改和已暂存) git stash # 2. 暂存时添加说明,便于后续识别 git stash save "feat: 未完成的用户注册功能" # 3. 查看所有 stash 记录(列表形式,最新的在最前) git stash list # 4. 恢复最近一次 stash 的修改,并保留 stash 记录 git stash apply # 5. 恢复指定 stash 记录(通过 stash@{n} 标识,n 为索引) git stash apply stash@{1} # 6. 恢复最近一次 stash 的修改,并删除该 stash 记录(常用) git stash pop # 7. 删除指定 stash 记录 git stash drop stash@{1} # 8. 删除所有 stash 记录 git stash clear

七、常见问题与解决方案

7.1 推送失败:fatal: refusing to merge unrelated histories

原因:本地仓库与远程仓库无关联历史(如本地初始化仓库后,远程已存在提交)。

解决方案:首次拉取时允许合并无关历史:

bash
git pull origin 分支名 --allow-unrelated-histories

7.2 忘记提交修改,直接切换分支导致修改丢失

原因:未暂存/提交的修改会跟随分支切换,若新分支有同名文件且内容不同,可能被覆盖。

解决方案:使用 git stash 暂存修改后再切换分支,或先提交修改(可后续使用 git commit --amend 优化提交记录)。

7.3 SSH 连接远程仓库失败:Permission denied (publickey)

原因:未配置 SSH 密钥,或密钥未添加到远程平台。

解决方案:

bash
# 1. 生成 SSH 密钥(一路回车,无需设置密码) ssh-keygen -t ed25519 -C "your.email@example.com" # 2. 查看公钥内容(Windows 路径:C:\Users\用户名\.ssh\id_ed25519.pub) cat ~/.ssh/id_ed25519.pub # 3. 复制公钥,添加到 GitHub/GitLab 等平台的 SSH 密钥配置中 # GitHub 路径:Settings → SSH and GPG keys → New SSH key

八、总结与学习资源

Git 核心在于“版本控制”与“分支协作”,日常开发需熟练掌握 add/commit/push/pull 基础流程,分支操作与冲突解决是团队协作的关键。

推荐学习资源

本文作者:夏至十二

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!