Git学习

Git-Study

 


 

<u> 作者:jason-wrj </u>

<u> 分类:软件开发/Git </u>

<u> 标签:Software Develop, Git </u>

<u> 更多:www.dioit.com——迪欧IT——dio智能科技 </u>

<u> 更多:www.dioit.com——dioIT——嵌入式电子智能技术 </u>

 


 

1 简介

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):开发的独立线,如 maindev,默认的主分支叫 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 官网下载 Git for Windows,按向导安装(建议勾选 "Add Git to PATH"),安装后会有 Git Bash 这个命令行工具。

  • 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 的核心在于分支和提交的历史管理,其余命令都是对这些基本概念的扩展和操作。

分支本质是提交的指针,默认主分支为 mainmaster

分支用于隔离开发任务(如功能开发、bug 修复),避免影响主代码。

  • Fork-Pull 请求(GitHub 流程)

    • Fork 项目 → Clone 到本地 → 创建新分支 → 提交更改 → 提交 Pull Request。

    • Pull Request流程:

      1. 基于 develop 创建功能分支。

      2. 提交代码后发起 PR。

      3. 团队审查通过后合并。

  • Git Flow 工作流,标准化分支模型,适合中大型项目

    • 主分支 main(稳定版本)

    • 开发分支 develop

    • 功能分支feature/xxx

    • 发布分支 release/xxx

    • 热修复分支 hotfix/xxx

  • 隔离案例:修复线上bug时,从main创建hotfix/login分支,修复后合并到maindevelop

  • 查看分支

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 基本流程(多人协作)

  1. 进入工作项目文件夹目录内部,创建并初始化新仓库:git init

  2. 关联远程仓库,管理远程仓库:git remote add origin <远程仓库 URL>

  3. 从远程仓库克隆代码到本地:git clone <远程地址 URL>

  4. 每个新功能独立分支开发,创建新分支开发功能:git switch -c feature/xxx

  5. 开发中频繁添加文件到暂存区、提交更改到本地仓库:git add .git commit -m "xxx"

  6. 查看当前仓库状态、查看提交历史日志:git statusgit log

  7. 定期从远程仓库拉取最新代码,更新本地仓库(避免冲突):git pull origin main

  8. 本地仓库功能开发完成后,推送代码到远程:git push -u origin feature/xxxgit push -u origin main

  9. 在远程仓库(如 GitHub/Gitee/GitLab)发起 Pull Request(PR),等待审核合并。

  10. 解决推送冲突,先 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 学习资源

  1. 官方文档

  2. 在线课程

    • GitHub Learning Lab(互动式教程)

    • freeCodeCamp Git 教程(英文)

  3. 工具辅助

    • 图形化工具 (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 问题网上都有答案。

  1. 个人仓库

    • 在GitHub创建仓库,模拟完整流程:

      • 初始化 → 分支开发 → 合并 → 部署

    • 学习基本的提交、分支和推送操作。

    • 实践标签管理:git tag v1.0.0

  2. 协作项目

    • GitHub Gitee 创建仓库练习协作。

    • 在 GitHub 上参与开源项目,练习 Pull Request 和 Issue 跟踪。

    • 实践clone→修改→commitpush→创建PR的全流程。

  3. 模拟团队开发

    • 与朋友一起克隆同一仓库,练习合并分支和解决冲突。

    • 分支命名规范

    • 代码审查流程

    • 解决合并冲突

  4. 交互式练习

    • Learn Git Branching (可视化分支操作,交互式学习游戏,通过游戏直观理解分支和合并)

    • Git Exercises(命令实战)。

  5. 实践

    • 在自己的项目上用起来!从 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 实践避坑

  1. 慎用git push -f:强制推送会覆盖远程分支,需团队确认

  2. 共享分支避免变基:已推送至远程的分支禁止使用git rebase

  3. 临时修改用git stash:避免污染提交记录

 


 

内容目录

 


 

迪欧IT——dio智能科技

服务器_网站图标_dioIT_128x128

 

公众号_二维码_迪欧智慧_128x128

 

 

 

 
posted @ 2025-10-25 15:12  jason-wrj  阅读(2)  评论(0)    收藏  举报