Git学习
<u> 作者:jason-wrj </u>
<u> 分类:软件开发/Git </u>
<u> 标签:Software Develop, Git </u>
<u> 更多:
<u> 更多:
Git 是一款分布式版本控制系统,主要用于跟踪文件的修改历史、协调多人协作开发,是软件开发中不可或缺的工具。
1.1 Git 优势
-
本地版本控制 vs 集中式版本控制(SVN) vs 分布式版本控制(Git)。
-
Git 的核心优势:分布式、高效、支持非线性开发。
1.2 Git 核心概念
学习 Git 最难的不是命令,而是理解它的核心思想。Git 三区模型:工作区 → 暂存区 → 仓库。
-
工作区(Working Directory):电脑上能看到的项目目录,在这里编辑文件。
-
暂存区(Staging Area / Index):一个“预存区域”,用于标记要提交的内容,准备要提交的文件会先放在这里,但不实际保存。通过
git add命令将文件添加到暂存区。 -
本地版本仓库(Local Repository):项目文件夹,用于存储代码的地方,创建时会生成一个隐藏的
.git文件夹(Git 的“数据库”),里面存储了项目历史版本控制信息与元数据,Git 会记录这个文件夹里所有文件的历史变化。-
提交(Commit):一次快照,正式保存暂存区的内容,代码的变更记录到提交历史。包含文件快照、作者信息、时间戳的唯一标识(SHA-1哈希值)。使用
git commit -m "提交信息"命令进行提交。 -
分支(Branch):开发的独立线,如
main、dev,默认的主分支叫main(旧版也叫master)。是独立的提交历史线,允许开发者分叉开发。可以创建新的分支来开发新功能,而不会影响主分支的稳定代码。使用git branch创建分支,git checkout切换分支。 -
合并(Merge):将不同分支的更改整合。
-
-
远程版本仓库(Remote Repository):放在互联网或其他网络上的版本库,比如 GitHub, GitLab, Gitee。用于团队协作和备份。
核心工作流程可以概括为:
工作区 -> (git add -> 暂存区) -> (git commit -> 本地版本仓库) -> (git push -> 远程版本仓库)
工作区 <- (git checkout -- <file> <- 暂存区) <- (git reset HEAD <- 本地版本仓库)
删除 <- (git rm --cached <file> <- 暂存区)
2 Git 核心概念
2.1 本地三大区域
-
工作区(Working Directory):
本地当前编辑文件的目录(能看到的文件夹)。
-
暂存区(Index / Staging Area):
文件暂存的位置,临时存储待提交的修改(类似 "缓存区")。
通过
git add将工作区的修改放入暂存区。 -
本地仓库(Local Repository):
永久存储所有版本历史记录的数据库(隐藏目录
.git)。通过
git commit将暂存区的内容提交到本地仓库。
2.2 远程第四区域
-
远程仓库(Remote Repository) 托管在网络上的仓库(如 GitHub、GitLab),用于多人共享代码。
通过
git push/git pull与本地仓库同步。
2.3 分布式架构
-
每个开发者拥有完整仓库副本(含完整历史),不依赖中央服务器。
2.4 数据存储原理
-
以文件快照(非差异)存储数据,通过SHA-1哈希保证数据完整性。
3 Git 安装与初始配置
3.1 安装 Git
-
Windows:在 Git 官网下载
-
macOS:使用 Homebrew(
brew install git)安装,或通过 Xcode 命令行工具(xcode-select --install),或从官网下载安装。 -
Linux:通过包管理器安装,如 Debian/Ubuntu 用(
sudo apt install git),如 CentOS 用(sudo yum install git)。
3.2 初始配置(必做)
全局配置:安装后需配置用户信息,打开终端(或 Git Bash),设置用户名和邮箱(每次提交会关联此“签名“信息):
git config --global user.name "Your Name" # 配置用户
git config --global user.email "Your eMail@example.com"
查看配置:
git config --list # 列出所有配置
3.3 可选配置
git config --global alias.st status # 设置别名
git config --global pull.rebase true # 自动变基
4 常用命令
4.1 仓库初始化与克隆
-
创建新仓库:在项目目录中初始化本地仓库
git init # 初始化本地仓库,生成 .git 目录(隐藏)
-
克隆远程仓库:将远程仓库下载到本地
git clone <远程仓库地址URL> # 例如:git clone https://github.com/username/repo.git
4.2 添加文件与跟踪提交
-
查看工作区状态:
git status # 显示哪些文件被修改、未跟踪等
-
将文件添加到暂存区:
git add <文件名> # 添加单个文件
git add . # 添加所有修改的文件(不包括被忽略的)
-
提交到本地仓库:
git commit -m "提交说明" # 提交暂存区内容,说明需简洁明了(如"修复登录bug")
-
跳过暂存区直接提交(仅修改已跟踪的文件):
git commit -am "提交说明"
4.3 查看历史与版本回退
-
查看提交历史:
git log # 详细历史(按 q 退出)
git log --oneline # 简洁历史(一行一个提交)
git log --pretty=oneline # 查看提交历史
git log --graph # 图形化展示分支合并历史,可视化分支关系
git log -- <file> # 查看某个文件的历史修改
-
回退到指定版本(谨慎使用!):
git reset --soft HEAD~1 # 回退提交,撤销上一次的提交,并保留修改到工作区
git reset --soft HEAD^ # 撤销提交但保留修改
git reset --mixed HEAD~1 # 保留修改,回退暂存区(默认)
git reset --hard HEAD~1 # 彻底撤销上一次的提交,回退到上一个版本,慎用!(~1 表示上1个,~2 表示上2个)
git reset --hard <提交ID> # 彻底回退到指定版本(提交ID可从 git log 获取前几位)
git reset --hard HEAD^ # 回退到上一版本,(可用`git reflog`恢复找回)
-
撤销工作区修改(未 add 的文件):
git restore <文件名> # 恢复文件,恢复到最近一次提交的状态
# 下面这两个操作很危险!会丢失修改,会清除工作区中未添加到暂存区中的改动,不可恢复。
git checkout . # 撤销工作区修改,会用暂存区(全部)的文件替换工作区的文件
git checkout -- <file> # 撤销工作区修改,会用暂存区(指定)的文件替换工作区的文件
-
撤销暂存区修改(已 add 但未 commit):
git reset HEAD <file> # 撤销暂存区修改
git restore --staged <文件名> # 将文件从暂存区的修改退回工作区(取消 add)
-
撤销(工作区+暂存区)修改(已 add ,已 commit):
# 撤销(工作区+暂存区)修改
# 下面这两个操作很危险,会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
git checkout HEAD . # 会用 HEAD 指向的分支中的(全部文件)替换暂存区和以及工作区中的文件
git checkout HEAD <file> # 会用 HEAD 指向的分支中的(指定文件)替换暂存区和以及工作区中的文件
-
创建反向提交
git revert <commit> # 创建反向提交(不修改历史)
4.4 分支操作(核心)
Git 的核心在于分支和提交的历史管理,其余命令都是对这些基本概念的扩展和操作。
分支本质是提交的指针,默认主分支为 main 或 master。
分支用于隔离开发任务(如功能开发、bug 修复),避免影响主代码。
-
Fork-Pull 请求(GitHub 流程)
-
Fork 项目 → Clone 到本地 → 创建新分支 → 提交更改 → 提交 Pull Request。
-
Pull Request流程:
-
基于
develop创建功能分支。 -
提交代码后发起 PR。
-
团队审查通过后合并。
-
-
-
Git Flow 工作流,标准化分支模型,适合中大型项目
-
主分支
main(稳定版本) -
开发分支
develop -
功能分支
feature/xxx -
发布分支
release/xxx -
热修复分支
hotfix/xxx
-
-
隔离案例:修复线上bug时,从
main创建hotfix/login分支,修复后合并到main和develop -
查看分支:
git branch # 列出本地分支,查看所有分支(* 表示当前分支)
git branch -r # 列出远程分支
-
创建分支:
git branch <分支名> # 创建新分支(基于当前分支)
git branch feature-xxx # 创建一个新分支,名为 feature-xxx
-
切换分支:
git switch <分支名> # 切换到指定分支(Git 2.23+ 推荐)
git checkout <分支名> # 切换到指定分支
git checkout feature-xxx # 切换到 feature-xxx 分支
-
创建并切换分支:
git switch -c <分支名>
git switch -c feature-xxx
git checkout -b <分支名> # 等价于 git branch + git checkout
git checkout -b feature-xxx # 创建并切换到 feature-xxx 分支
-
合并分支:
-
快进合并 (Fast-Forward):目标分支无新提交时自动合并。
-
三方合并 (3-way Merge):解决分支冲突后提交。
-
git merge <分支名A> # 合并指定分支到当前分支。例如:在 main 分支执行 git merge feature,合并feature 到 main 分支 git merge feature-xxx # 将 feature-xxx 分支的修改合并到当前分支 (main) git merge <name> --no-ff # 合并分支(保留记录) git mergetool # 使用工具解决冲突
-
删除分支(需先切换到其他分支):
git branch -d <分支名> # 删除已合并的本地分支
git branch -d feature-xxx # 删除已合并的分支 feature-xxx
git branch -D <分支名> # 强制删除未合并的本地分支(谨慎使用)
git push origin -d <分支名> # 删除远程分支
-
解决分支合并冲突
多人修改同一文件,当合并分支时出现冲突,需手动编辑冲突文件(标记为
<<<<<<<,=======,>>>>>>>),保存后执行:
git add <冲突文件>
git commit
-
变基 (Rebase)(谨慎操作):
风险注意:不要对已推送的分支执行变基(会重写提交历史,破坏协作,谨慎操作)。
git rebase main # 将当前分支修改“移植”到main分支最新提交后 <x-preset class="no-tts reference-tag disable-to-doc" data-index="1">1</x-preset><x-preset class="no-tts reference-tag disable-to-doc" data-index="3">3</x-preset>
git rebase # 会重写提交历史,破坏协作,谨慎操作
git rebase -i HEAD~3 # 交互式 rebase,合并修改最近3次提交
4.5 远程仓库交互
-
关联远程仓库(本地仓库首次关联远程时):
# 需要在 GitHub 上创建一个新的空仓库,再将本地仓库与一个远程仓库关联起来
git remote add origin <远程仓库地址URL> # 连接远程仓库,origin 是远程仓库的默认别名
# git remote add origin https://github.com/你的用户名/你的仓库名.git
-
查看已关联的远程仓库
git remote -v # 查看已关联的远程仓库
-
推送本地分支到远程:
git push -u origin <分支名> # 首次推送,-u 参数表示建立追踪关联远程分支,后续直接用 git push
# 将本地 main 分支的提交推送到远程仓库的 main 分支
git push -u origin main
-
拉取远程最新代码(同步远程修改到本地):
# 从远程仓库拉取最新的更新到本地(非常常用!)
git pull origin <分支名> # 等价于( git fetch + git merge )
git pull --rebase origin master # 拉取并合并
-
获取远程最新信息(不合并):
git fetch origin # 拉取远程分支信息,但不合并到本地
-
克隆一个已有的远程仓库到本地
# 克隆一个已有的远程仓库到本地(是参与别人的项目)
git clone https://github.com/别人的用户名/项目名.git
5 高频工作流
5.1 本地操作(个人)
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 初始化仓库 | git init |
当前目录创建新仓库 |
| 添加缓存 | git add . / git add <file> |
添加文件到暂存区 |
| 提交修改 | git commit -m "描述msg" |
提交到本地仓库 |
| 查看状态/历史 | git status / git log --oneline |
检查修改或查看提交记录 |
| 撤销修改 | git checkout -- <file> |
丢弃工作区未暂存的修改 |
-
代码提交规范:
使用语义化提交消息(如
feat:、fix:、docs:),参考 Conventional Commits。
5.2 基本流程(多人协作)
-
进入工作项目文件夹目录内部,创建并初始化新仓库:
git init -
关联远程仓库,管理远程仓库:
git remote add origin <远程仓库 URL> -
从远程仓库克隆代码到本地:
git clone <远程地址 URL> -
每个新功能独立分支开发,创建新分支开发功能:
git switch -c feature/xxx -
开发中频繁添加文件到暂存区、提交更改到本地仓库:
git add .→git commit -m "xxx" -
查看当前仓库状态、查看提交历史日志:
git status→git log -
定期从远程仓库拉取最新代码,更新本地仓库(避免冲突):
git pull origin main -
本地仓库功能开发完成后,推送代码到远程:
git push -u origin feature/xxx,git push -u origin main -
在远程仓库(如 GitHub/Gitee/GitLab)发起 Pull Request(PR),等待审核合并。
-
解决推送冲突,先
git pull→ 解决冲突 → 重新提交。
# 1.1 进入项目文件夹目录内部
cd project
# 1.2 创建并初始化一个新的 Git 仓库
git init
# 2 关联远程仓库,管理远程仓库
git remote add origin <URL>
# 3 从远程仓库克隆代码到本地
git clone <URL>
# 4 创建新分支开发功能
git switch -c feature/xxx
# 5.1 开发中频繁添加文件到暂存区
git add <file> # 添加指定单个文件到暂存区
git add . # 添加所有变化的文件到暂存区(新增、修改)
git add -u # 添加所有修改和删除的文件,但不包括新文件
git add -p # 拆分文件提交
# 5.2 开发中频繁提交更改到本地仓库
git commit -m "描述本次修改"
git commit -m "写一句清晰的提交说明,比如:添加了用户登录功能"
# 6.1 查看当前仓库状态,包括暂存区和工作区的对比。(常用!哪些被修改了、哪些已暂存)
git status
# 6.2 查看提交历史日志,包含提交的哈希码、日期、提交者、提交信息等。
git log
# 7 定期从远程仓库拉取最新代码,更新本地仓库(避免冲突)。git pull(= fetch + merge)
git pull origin main
# 8 本地仓库功能开发完成后,将本地代码推送到远程仓库
git push -u origin feature/xxx
git push -u origin main
git push origin main
# 9 在远程仓库(如 GitHub)发起 Pull Request(PR),等待审核合并。
# 10 解决推送冲突,先 `git pull` → 解决冲突 → 重新提交。
6 实用技巧
6.1 忽略文件
创建一个名为 .gitignore 的文件,列出希望 Git 忽略,不需要跟踪的文件和文件夹(如日志、依赖、本地配置文件、IDE 配置、编译产物、node_modules 等等):
-
.gitignore忽略文件示例:-
node_modules/:表示忽略 node_modules 依赖目录 -
*.log:表示忽略所有 .log 文件 -
!important.log:表示不要忽略 important.log 文件 -
.idea/:表示忽略 IDEA 配置
-
6.2 解决合并冲突
合并分支时若出现冲突(同一文件同一位置修改),Git 会在文件中标记冲突位置:
<<<<<<< HEAD(当前分支内容)
这是当前分支的代码
=======
这是待合并分支的代码
>>>>>>> feature/xxx(待合并分支)
冲突解决方式流程:
执行git pull后若冲突,手动编辑修改文件保留需要的内容,然后 git add <冲突文件> 和 git commit 完成合并。
6.3 Stash 储藏更改
当需要切换分支,但又不想提交未完成的工作时,即工作区未提交时(暂存未提交的更改),可用 stash 临时储藏,暂存当前修改,临时存储工作区:
git stash # 储藏当前工作区和暂存区的修改,保存工作进度
git stash pop # 恢复进度,恢复最近一次暂存储藏并删除储藏记录
git stash list # 查看暂存储藏列表
git stash save "描述" # 暂存修改
git stash apply # 应用暂存
6.4 查看文件差异
git diff # 查看工作区与暂存区的差异
git diff --cached # 查看暂存区与上次提交的差异
git diff --staged # 查看暂存区和最新提交的差异
git diff commit_id1 commit_id2 # 查看两次提交之间的差异
6.5 图形化工具推荐
-
VS Code(内置Git支持)、GitKraken(可视化分支)、SourceTree。
6.6 特殊场景
-
回退目录:
git reset <commit> -- src/ -
精准移植提交:
git cherry-pick abc123
7 进阶技能
7.1 标签(Tag)
-
为特定提交打标签(如版本号),创建版本标签:
git tag -a v1.0 -m "Release"→git push origin v1.0。
git tag v1.0
git push origin v1.0 # 推送标签到远程
7.2 子模块(Submodule)
-
添加子模块:
git submodule add <url>。 -
克隆含子模块项目:
git clone --recurse-submodules <url>。
8 Git 练习
8.1 学习资源
-
官方文档
-
Git 官方文档:https://git-scm.com/doc (最权威,有书和多国语言版本)。
-
Pro Git 书籍(免费电子书)
-
-
在线课程
-
GitHub Learning Lab(互动式教程)
-
freeCodeCamp Git 教程(英文)
-
-
工具辅助
-
图形化工具 (GUI):初学者可以先用 GUI 工具辅助理解,如 GitHub Desktop, GitKraken, Sourcetree, VS Code 内置的 Git 功能。它们能可视化地看到分支、提交历史的变化。
-
托管平台:GitHub、GitLab、Bitbucket。
-
8.2 学习路径
-
学习目标
掌握Git核心功能,能够独立完成项目版本管理、分支协作及远程开发,具备解决常见冲突和优化工作流程的能力。
-
分阶段学习
graph LR
A[核心概念] --> B[安装配置]
B --> C[本地操作:add/commit/status/log]
C --> D[分支管理:branch/merge]
D --> E[远程协作:clone/push/pull/PR]
E --> F[高级技巧:stash/revert/rebase]
8.3 学习实践
最重要的建议:实践是学习 Git 的关键!不要怕犯错! Git 几乎所有的操作都是可以撤销或挽回的。大胆地去使用它,遇到问题时,善用 git help <命令> 或搜索解决方案(如 Stack Overflow),99% 的 Git 问题网上都有答案。
-
个人仓库
-
在GitHub创建仓库,模拟完整流程:
-
初始化 → 分支开发 → 合并 → 部署
-
-
学习基本的提交、分支和推送操作。
-
实践标签管理:
git tag v1.0.0
-
-
协作项目
-
在
-
在 GitHub 上参与开源项目,练习 Pull Request 和 Issue 跟踪。
-
实践
clone→修改→commit→push→创建PR的全流程。
-
-
模拟团队开发
-
与朋友一起克隆同一仓库,练习合并分支和解决冲突。
-
分支命名规范
-
代码审查流程
-
解决合并冲突
-
-
交互式练习
-
-
Git Exercises(命令实战)。
-
-
实践
-
在自己的项目上用起来!从
git init,add,commit,push开始。 -
在 GitHub 上找一个开源项目,Fork 它,克隆到本地,尝试修改然后提交,最后发起一个 Pull Request (PR)。这是最真实的协作体验。
-
8.4 关键提示
-
动手实践: 理解 Git 核心思想,遇到冲突时善用
git diff和图形化工具(如VSCode内置Git)。 -
高频练习:实际使用中,多练习分支操作和远程协作。
-
原子化提交:每次提交只解决一个问题。
-
频繁拉取更新:
push前务必先pull,减少冲突。 -
.gitignore:忽略日志、编译产物等无关文件(例:添加
node_modules/)。 -
工作流:掌握工作流逻辑后,命令自然熟练。
-
遇到问题多查阅
git --help或官方文档,实践是掌握Git的核心!
8.5 实践避坑
-
慎用
git push -f:强制推送会覆盖远程分支,需团队确认 -
共享分支避免变基:已推送至远程的分支禁止使用
git rebase -
临时修改用
git stash:避免污染提交记录
内容目录
2.1 本地三大区域2.2 远程第四区域2.3 分布式架构2.4 数据存储原理
3.1 安装 Git3.2 初始配置(必做)3.3 可选配置
4.1 仓库初始化与克隆4.2 添加文件与跟踪提交4.3 查看历史与版本回退4.4 分支操作(核心)4.5 远程仓库交互
6.1 忽略文件6.2 解决合并冲突6.3 Stash 储藏更改6.4 查看文件差异6.5 图形化工具推荐6.6 特殊场景


本文来自博客园,作者:jason-wrj,更多请查看:www.dioit.com,转载请注明原文链接:https://www.cnblogs.com/jason-wrj/p/19165416

浙公网安备 33010602011771号