Git分区
在 Git 眼里,你的文件只存在于三个地方:
- 工作区(Working Directory):你电脑磁盘上看到的实体文件(你正在编辑的地方)。
- 暂存区(Staging Area / Index):一个临时的“购物车”,存放下一次要提交的快照。
- 本地仓库(Repository / HEAD):已经提交保存的永久历史记录。
三个区域可以理解为三个独立的仓库版本
文件在这三个区域之间流转,对应了四种状态:
- 未跟踪(Untracked):全新文件,Git 从未见过(在仓库和暂存区都没有)。
- 已修改(Modified):在工作区改了,但还没放入暂存区。
- 已暂存(Staged):已放入暂存区,等待提交。
- 已提交(Committed):数据已安全存储在本地仓库中。
基础指令
git add
- 操作对象: 工作区中的文件,新添加的或者修改过的文件
- 作用: 将工作区的文件复制到暂存区,准备提交。让 Git 开始跟踪新文件,或暂存旧文件的改动
git commit
- 操作对象: 暂存区中的文件
- 作用: 将暂存区的内容打包成一个新的提交对象,存入本地仓库。提交后,暂存区会与最新提交一致
git commit -a
- 操作对象: 工作区中已跟踪的文件(即不包含新文件)
- 作用: 自动将所有已跟踪文件的当前工作区修改先复制到暂存区,再立刻提交。注意:新文件(未跟踪)不会被包含
git rm
- 操作对象: 工作区和暂存区中的文件
- 作用: 物理删除磁盘文件,同时抹掉暂存区的记录,并把“删除”这个动作暂存起来(等待提交)
下次提交时,显示删除该文件
git rm —cached
- 操作对象: 暂存区中的文件
- 作用: 只把文件从暂存区抹掉,让 Git 停止跟踪它,但磁盘上的实体文件完好无损(变为未跟踪状态)
git mv
- 操作对象: 工作区和暂存区中的文件
- 作用: 相当于执行了三步:重命名磁盘文件 + 删除暂存区里的旧记录 + 添加暂存区里的新记录(一站式完成改名和暂存)
git restore
- 操作对象: 工作区中的文件
- 作用: 丢弃你工作区还没暂存的修改。用暂存区里的内容覆盖磁盘文件(相当于“撤销未 add 的改动”)
git restore —staged
- 操作对象: 暂存区中的文件
- 作用: 把暂存区回退到 HEAD 的版本。文件修改还在工作区,只是撤销了 git add(将文件变为“已修改未暂存”)
远程
远程分支
远程分支例如origin/main是存在本地.git目录下面的只读分支,用来记录上次查看时,远程仓库的 main 分支指向哪一次提交
远程分支无法在本地直接修改,只能被动被git fetch或者git push更新
git fetch
执行git fetch origin时,只做了两件事:
- 下载:去远程服务器拉取本地没有的新提交和数据,存入你的本地仓库(.git 文件夹)
- 移动:把本地的 origin/main 指针,移动到刚刚下载的最新提交上
git fetch重要在于
- 不动工作区
- 不动暂存区
- 不动本地
main分支
所以,git fetch 之后,项目文件看起来毫无变化
git pull
执行git pull origin main时,做了两件事:
git fetch origin main:去远程服务器拉取本地没有的新提交和数据,更新本地origin/main分支git merge origin/main:把刚刚下载的 origin/main 分支,合并到当前分支上
git push
执行git push origin main时,做了3件事
- 上传:把本地仓库的 main 分支中远程还没有的提交和文件对象,上传到远程服务器
- 更新:更新远程服务器的 main 分支指针,指向最新提交
- 同步:同步本地的
origin/main分支指针,与刚刚推送的本地main指向同一个分支