Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第5章 Git暂存区 #43

Open
GH1995 opened this issue Jan 13, 2020 · 3 comments
Open

第5章 Git暂存区 #43

GH1995 opened this issue Jan 13, 2020 · 3 comments
Labels

Comments

@GH1995
Copy link
Owner

GH1995 commented Jan 13, 2020

修改不能直接提交吗

这时如果与HEAD(当前版本库的头指针)或 master分支(当前工作分支)进行比较就会发现有差异。这个差异才是正常的,因为尚未真正提交嘛。

git diff HEAD

image

不带任何选项和参数调用 git diff显示工作区的最新改动,即工作区与提交任务(提交暂存区, stage)中相比的差异。

work---index

git diff

将工作区和HEAD(当前工作分支)相比,会看到更多的差异。

work---HEAD

git diff HEAD

通过参数--cached--staged调用 git diff命令,看到的是提交暂存区(提交任务, stage)和版本库中文件的差异。

index---HEAD

git diff --cached
@GH1995 GH1995 added the git label Jan 13, 2020
@GH1995
Copy link
Owner Author

GH1995 commented Jan 13, 2020

理解Git暂存区(stage)

  • .git/index实际上就是一个包含文件索引的目录树

  • 文件的内容.git/objects目录中

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 index的区域是暂存区,标记为 master的是 master分支所代表的目录树。

  • 图中可以看出,此时HEAD实际是指向 master分支的一个“游标”,所以图示的命令中出现HEAD的地方可以用 master来替换。

  • 图中的 objects标识的区域为Git的对象库,实际位于,.git/ objects目录下,这一点会在后面的章节中重点介绍。

  • 当对工作区修改(或新增)的文件执行 git add命令时,暂存区的目录树将被更新,同时工作区修改(或新增)的文件内容会被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

  • 当执行提交操作(git commit)时,暂存区的目录树会写到版本库(对象库)中,master分支会做相应的更新,即 master最新指向的目录树就是提交时原暂存区的目录树。

  • 当执行 git reset HEAD命令时,暂存区的目录树会被重写,会被 master分支指向的目录树所替换,但是工作区不受影响。

  • 当执行 git rm --cached<file>命令时,会直接从暂存区删除文件,工作区则不做出改变。

  • 当执行 git checkout .git checkout-- <file>命令时,会用暂存区全部的文件或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

  • 当执行 git checkout HEAD .git checkout HEAD <file>命令时,会用HEAD指向的 master分支中的全部或部分文件替换暂存区和工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

@GH1995
Copy link
Owner Author

GH1995 commented Jan 13, 2020

Git Diff魔法

工作区、暂存区和版本库的目录树浏览
对于HEAD(版本库中当前提交)指向的目录树,可以使用Git底层命令1s-tree来查看。

git ls-tree -l HEAD
  • git clean -fd清除当前工作区中没有加入版本库的文件和目录(非跟踪文件和目录)
  • git checkout .用暂存区内容刷新工作区
git write-tree # 将暂存区的目录树写入Git对象库
git ls-files -s # 显示暂存区的目录树

image

@GH1995
Copy link
Owner Author

GH1995 commented Jan 13, 2020

不要使用 git commit-a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant