Git的工作原理和基本使用

四个区域:

  1. 远程仓库(Remote Repository)

    1. 位于服务器上的代码仓库(如 GitHub、Gitee、GitLab 等)。

    2. 是团队协作的中心,所有成员通过它同步代码。

  2. 本地仓库(Local Repository)

    1. 你电脑上 .git 目录所管理的仓库。

    2. 存储了完整的提交历史(commit history),是"只读"的历史记录库。

  3. 缓存区 / 暂存区(Staging Area / Index)

    1. 也叫 "index",是你准备下一次提交的地方。

    2. 你用 git add 把修改加入这里,然后才能 commit。

  4. 工作区间(Working Directory)

    1. 你实际编辑文件的目录。

    2. 包含当前项目的真实文件,你可以随意修改、删除、新增。

远程仓库

↑↓ (fetch/clone, push)

本地仓库

↑↓ (reset, commit)

缓存区

↑↓ (checkout, add)

工作 区间

数据流向与对应命令:

➤ 从 远程仓库 → 本地仓库

  • git fetch:下载远程更新,但不合并到当前分支。

  • git clone:首次克隆整个远程仓库到本地(包含 fetch + checkout)。

  • ✅ 用于获取他人提交的最新代码。

➤ 从 本地仓库 → 远程仓库

  • git push:将本地 commits 推送到远程仓库。
  • ✅ 用于分享你的工作成果。

➤ 从 本地仓库 → 缓存区

  • git reset --files(注意:这个写法不太标准,应为 git reset <file>git reset HEAD <file>

    • 实际上更常见的是:

      • ⚠️ 图中写的是 git reset --files,可能是笔误或简化表达,实际应理解为"从本地仓库恢复文件到缓存区/工作区"。
      • git reset HEAD <file>:把文件从暂存区撤回工作区(取消 staged)。

      • git reset --hard:彻底回退到某个 commit(危险!会丢失未提交更改)。

➤ 从 缓存区 → 本地仓库

  • git commit:将暂存区的改动打包成一个新版本(commit),存入本地仓库。
  • ✅ 保存一次有意义的变更。

➤ 从 缓存区 → 工作区间

  • git checkout --files(同样,标准写法是 git checkout -- <file>

    • ✅ 用于撤销未暂存的修改。
    • 作用:丢弃工作区的修改,从缓存区(或最近一次 commit)恢复文件。

➤ 从 工作区间 → 缓存区

  • git add files:把工作区修改过的文件添加到暂存区。
  • ✅ 准备提交前的第一步。

主要使用场景

场景一:第一次拉取项目 (Clone)

目标:把服务器上的代码完整下载到你的电脑上,建立本地仓库。

1. 数据流动路径

远程仓库 --(git clone)--> 本地仓库 + 工作区间 + 缓存区

  • 解释:git clone 是一个"超级命令"。它不仅从远程仓库下载了所有历史记录到本地仓库,还自动把最新版本的代码解压到了你的工作区间,并且此时缓存区和工作区间是同步的(没有未提交的修改)。

2. 操作步骤与命令

bash 复制代码
# 假设你新建了一个文件 hello.txt 并修改了它

# 1. 查看状态 (确认哪些文件在 Working Directory 被修改了)
git status

# 2. 添加到缓存区 (Staging Area)
# "." 代表添加所有修改的文件,也可以指定文件名如 "git add hello.txt"
git add .

# 3. 提交到本地仓库 (Local Repository)
# -m 后面跟的是提交信息,说明这次改了啥
git commit -m "feat: 初始化项目,添加 hello.txt"

# 4. 推送到远程仓库 (Remote Repository)
# 如果是第一次推送,可能需要设置上游分支 (-u)
git push -u origin main
# 注意:分支名可能是 main 或 master,视仓库设置而定

3. 此时各区域状态

  • 远程仓库:原封不动。

  • 本地仓库:拥有了完整的提交历史。

  • 工作区间:有了最新的项目文件,你可以开始编辑了。

  • 缓存区:干净,与工作区一致。

场景二:第一次更新项目 (Pull / Update)

目标:过了一段时间,队友提交了新代码,你需要把他们的代码同步到你的电脑上,以免冲突。

数据流动路径

远程仓库 --(git pull)--> 本地仓库 --(自动合并)--> 工作区间

  • 解释:git pull 其实是两个命令的组合:git fetch + git merge

    • Fetch 阶段:从远程仓库下载新数据到本地仓库(此时你的工作区还没变)。

    • Merge 阶段:把本地仓库刚下载的新版本,合并到你当前的工作区间和缓存

    2、操作步骤与命令

bash 复制代码
# 1. 执行克隆命令 (假设远程地址是 https://github.com/user/project.git)
git clone https://github.com/user/project.git

# 2. 进入项目目录
cd project

3、此时各区域状态

  • 远程仓库:拥有最新的代码。

  • 本地仓库:更新了历史,包含了队友的 commit 和你的 commit。

  • 工作区间:文件变成了最新版本(包含队友的和你自己的)。

  • 缓存区:通常也是干净的,除非合并过程中产生了冲突需要手动解决。

场景三:第一次提交项目 (First Commit & Push)

目标:你在本地写了一些新代码,想要保存并上传到服务器让大家看到。

数据流动路径

工作区间 --(git add)--> 缓存区 --(git commit)--> 本地仓库 --(git push)--> 远程仓库

  • 解释:

    • 你在工作区间修改/新建了文件。

    • git add:把修改好的文件"快照"放入缓存区(准备打包)。

    • git commit:把缓存区的东西打包成一个永久版本,存入本地仓库。

    • git push:把本地仓库的新版本推送到远程仓库

      2、操作步骤与命令

bash 复制代码
# 确保你在正确的分支上 (比如 main)
git checkout main

# 1. 拉取并合并 (Pull = Fetch + Merge)
git pull origin main

# 【进阶情况】如果此时你有未提交的修改:
# Git 会阻止 pull,提示你先 commit 或 stash (暂存) 你的修改。
# 推荐做法是先提交你自己的修改 (参考场景二),然后再 pull。

3、此时各区域状态

  • 工作区间:干净(因为修改已提交)。

  • 缓存区:干净。

  • 本地仓库:多了一个新的 Commit 节点。

  • 远程仓库:同步了本地的新 Commit,别人能看到了。

Git文件状态与操作

文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上

  • Untracked: 未跟踪,此文件在文件夹中,,但并没有加入到git库,不参与版本控制。通过git add 状态变为Staged.

  • Unmodify: 文件已经入库,未修改, 即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改, 而变为Modified。如果使用git rm移出版本库,则成为Untracked文件

  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作。这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !

  • Staged: 暂存状态。执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。执行git reset HEAD filename取消暂存, 文件状态为Modified

查看文件状态

上面说文件有4种状态,通过如下命令可以查看到文件的状态:

bash 复制代码
#查看指定文件状态
git status [filename]
 
#查看所有文件状态
git status
 
# git add .                  添加所有文件到暂存区
# git commit -m "消息内容"    提交暂存区中的内容到本地仓库 -m 提交信息

忽略文件

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

在主目录下建立".gitignore"文件,此文件有如下规则:

  1. 忽略文件中的空行或以井号(#)开始的行将会被忽略。

  2. 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。

  3. 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。

  4. 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。

  5. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。

bash 复制代码
*.txt        //忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt     //但lib.txt除外
/temp        //仅忽略项目根目录下的所有文件,不包括其它目录temp
build/       //忽略build/目录下的所有文件
doc/*.txt    //会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

Git分支常用的命令

bash 复制代码
# 列出所有本地分支
git branch
 
# 列出所有远程分支
git branch -r
 
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
 
#切换分支
git checkout [branch-name]
 
# 新建一个分支,并切换到该分支
git checkout -b [branch]
 
# 合并指定分支到当前分支
$ git merge [branch]        //快进式合并
git merge --no-ff [branch]  //完整合并
# --no-ff 这个参数可以确保即使可以进行快进式合并,也要创建一个新的合并提交,否则只是简单地把一个分支的头指针移动到另一个分支的头上
 
# 删除分支
$ git branch -d [branch-name]
 
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

分支合并

大致流程:

分支A有代码出了bug

开一个分支B专门解决这个bug

最后合并分支A和分支B

相关推荐
慕诗客4 小时前
repo管理多仓库
大数据·elasticsearch·搜索引擎
yaoyouzhong7 小时前
MySQL 批量插入详解:快速提升大数据导入效率的实战方法
大数据·数据库·mysql
云栖梦泽9 小时前
AI安全合规与治理:行业发展趋势与职业展望
大数据·人工智能·安全
得物技术9 小时前
财务数仓 Claude AI Coding 应用实战|得物技术
大数据·llm·aiops
rainy雨10 小时前
免费且好用的精益工具在哪里?2026年精益工具清单整理
大数据·人工智能·信息可视化·数据挖掘·数据分析·精益工程
蚂蚁数据AntData10 小时前
破解AI“机器味“困境:HeartBench评测实践详解
大数据·人工智能·算法·机器学习·语言模型·开源
Jane - UTS 数据传输系统10 小时前
立足国家“十五五”数智化战略大局,紧扣上海“2+3+6+6”产业布局,UTS数据传输系统筑牢数智化转型数据底座
大数据·人工智能·跨平台·信创·跨数据库·十五五·国产数据库适配
xcbrand11 小时前
口碑好的品牌策划厂家
大数据·人工智能·python
运营小白11 小时前
用 SEONIB批量生成 SEO 博客来提升 Google 排名
搜索引擎·ai自动写作·关键词抓取·seonib·多平台流量复用·规模化内容生产·seo更新节奏
刘佬GEO12 小时前
【无标题】
网络·人工智能·搜索引擎·ai·语言模型