四个区域:
-
远程仓库(Remote Repository)
-
位于服务器上的代码仓库(如 GitHub、Gitee、GitLab 等)。
-
是团队协作的中心,所有成员通过它同步代码。
-
-
本地仓库(Local Repository)
-
你电脑上
.git目录所管理的仓库。 -
存储了完整的提交历史(commit history),是"只读"的历史记录库。
-
-
缓存区 / 暂存区(Staging Area / Index)
-
也叫 "index",是你准备下一次提交的地方。
-
你用
git add把修改加入这里,然后才能 commit。
-
-
工作区间(Working Directory)
-
你实际编辑文件的目录。
-
包含当前项目的真实文件,你可以随意修改、删除、新增。
-
远程仓库
↑↓ (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"文件,此文件有如下规则:
-
忽略文件中的空行或以井号(#)开始的行将会被忽略。
-
可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
-
如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
-
如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
-
如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
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