一、主要区域
- 工作目录
- 作用:本地系统中的文件夹
- 文件状态
- 未跟踪:文件刚添加到工作目录,还没有被Git管理(还没有
git add
) - 已跟踪:Git已经对这个文件进行过管理,Git在本地仓库中有这个文件的历史记录。
- 未修改:该文件没有再做任何修改。
- 已修改:修改过了,但是没有使用
git add
来通知Git,这个文件被修改了。 - 已删除:删除了,但是没有使用
git add
来通知Git,这个文件已经被删除了。
- 未跟踪:文件刚添加到工作目录,还没有被Git管理(还没有
- 暂存区
- 作用:存储经过
git add
,但是没有git commit
的文件。可以认为是缓存区域。
- 作用:存储经过
- 本地仓库
- 作用:存储所有的提交记录、分支信息、标签等数据。
- 提交历史:每次使用
git commit
,Git会将暂存区内容保存到本地仓库,并为该提交创建一个唯一的提交ID。这些提交记录形成了项目的版本历史。 - 本地分支:可以在本地仓库中创建和切换分支
- 远程仓库
- 作用:远程仓库可以托管代码。
- 同步:远程仓库允许不同的开发者之间共享代码,并且支持推送(git push)和拉取(git pull)。
二、各个区域的交互
- 工作区→暂存区:
- 对文件做出修改后,可以使用
git add file
,将这些修改添加到暂存区。
- 对文件做出修改后,可以使用
- 暂存区→工作区
- 撤销暂存区中的文件,决定不提交
git restore --staged file
,相当于撤销git add
- 撤销暂存区中的文件,决定不提交
- 工作区→本地仓库
- 直接提交,不先放入暂存区
git commit -a
,把所有【已跟踪的文件】全部提交- 【未跟踪的文件】不会被提交
- 【暂存区的文件】同样会被提交
- 直接提交,不先放入暂存区
- 本地仓库→工作区
- 变回之前提交的状态
git reset --hard 提交版本号
- 变回之前提交的状态
- 暂存区→本地仓库:
- 使用
git commit -m "注释"
命令将暂存区中的所有文件提交到本地仓库。
- 使用
- 本地仓库→暂存区
- 使用
git reset --soft 提交版本号
- 使用
- 本地仓库→远程仓库
- 想要把本地仓库的更新推送到远程仓库时,可以使用
git push
- 想要把本地仓库的更新推送到远程仓库时,可以使用
- 远程仓库→本地仓库
- 使用
git fetch
或git pull
命令将远程仓库的最新更新拉取到本地仓库。前者仅更新本地的【远程跟踪分支】,而后者会拉取远程更新并尝试自动合并。
- 使用
三、案例演示
-
新建了一个文件a.txt,此时的状态是
上图,a.txt是一个新文件,此时,就是工作目录中的【未被跟踪状态】
-
使用
git add a.txt
后
此时,文件已经被放到了暂存区。 -
此时,我不想跟踪这个文件了,可以使用
git rm --cached a.txt
可以看见,文件又处于工作目录的【未被跟踪】状态 -
然后使用
git add
放入暂存区,同时使用git commit -m "第一次提交"
,放入本地仓库中。
此时,内容全部提交了。 -
然后修改了a.txt的内容,再次查看状态。
可以看见和新建文件时的状态不一样,现在的状态是工作目录中的【已跟踪】 -
此时,我发现修改的内容出错了,可以使用
git restore a.txt
恢复到上次【已提交的状态】
可以看见,恢复成上次提交的内容了 -
然后正确修改了a.txt的内容,同时
git add a.txt
将其加入到暂存区中(这里涉及到工作目录到暂存区的转移)
-
此时,发现a.txt的内容少了一部分,我希望补上之后,再一起提交,此时我可以先
git restore --staged a.txt
,从暂存区移回到工作目录。(这里涉及到暂存区到工作目录的转移)
可以看见,又回到了工作目录了 -
添加完内容之后,我希望直接提交了,不希望先到暂存区。使用
git commit -a -m "第二次提交"
。(这里涉及到工作目录到本地仓库的转移)。git commit -a
相当于先把【已被跟踪】的文件全部放入暂存区,然后再git commit
。(git commit
是将暂存区转移到本地仓库)
可以看见,全部提交了。 -
我突然发现,最近一次提交的部分内容有问题,希望回退到暂存区,使用
git reset --soft 3d35
(这里涉及到本地仓库到暂存区的转移),后面的3d35是使用git log
查找上一次提交的版本号
可以看见,已经回到了暂存区了。 -
提交内容,
$ git commit -m "第二次正确的提交"
-
突然发现,最近一次提交的内容,都有问题,要全部修改了,希望回退到第一次提交的内容。使用
git reset --hard 3d35
(这里涉及到本地仓库到工作目录的转移)
注意,这和10有什么区别?假设第一次提交的内容是111,然后增加了2222和3333,同时git add
和git commit
,此时如果是10这种情况,文件的内容就是111和2222和3333;如果是12这种情况,文件内容就只有111了。