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

相关推荐
V搜xhliang02462 小时前
医疗场景多模态交互
大数据·人工智能·机器人·交互·语音识别·xcode
yhdata2 小时前
自卸车软件市场规模锁定18.15亿元,精准数据勾勒行业进阶新图景
大数据·人工智能
jixingkj2 小时前
手机截屏失败全解析:从操作误区到系统设置的深度解密
大数据·安全·智能手机
MonkeyKing_sunyuhua2 小时前
中国传统企业怎么应对AI时代
大数据·人工智能
大力财经3 小时前
阿里发布全球首个企业级Agent平台“悟空”
大数据·人工智能
爱敲代码的菜菜3 小时前
【项目】基于正倒排索引的Java文档搜索引擎
java·开发语言·前端·javascript·搜索引擎·servlet
D愿你归来仍是少年4 小时前
Apache Spark 从入门到精通:完整学习指南
大数据·spark
搭贝4 小时前
河南爱彼爱和新材料 | 打造低成本高敏捷数字化转型的“河南标杆“
大数据·低代码·制造业
b***25114 小时前
定制化组装锂电池设备:精准匹配需求的技术实践
大数据