概念
-
工作区
即项目所在目录 -
暂存区stage
每次我们都会通过git add将修改的文件加入暂存区,然后再通过commit提交到分支上 -
版本库/.git目录
版本库中有stage暂存区,和git给我们创建的master分支,以及分支的头指针HEAD---------------------------------------- -
版本库——.git/objects
objects目录中有很多文件,使用sha-1前两位创建文件夹,剩下38位作为文件名,这些obj文件主要有四种:blob、tree、commit、tag -
blob
用来存放项目文件的内容,但是不包括文件的路径、名字、格式等其它描述信息。项目的任意文件的任意版本都是以blob的形式存放的 -
tree
表示目录, tree 中有 blob、子tree,且都是使用 sha-1值引用的。这是与目录对应的。从顶层的 tree 纵览整个树状的结构,叶子结点就是blob,表示文件的内容,非叶子结点表示项目的目录,顶层的 tree 对象就代表了当前项目的快照 -
commit
表示一次提交,有parent字段,用来引用父提交。指向了一个顶层 tree,表示了项目的快照
创建版本库
-
git init
在项目根目录使用可以把目录变成git仓库,此时所有文件处于untracked状态
添加
-
git add file
添加文件到暂存区
提交
-
git commit -m message
将缓存区文件提交到版本库
查看
-
git status
查看所有文件的状态---------------------------------------- -
git log
查看提交历史,只能查看头指令以及之前的日志,如图不能查看append GPL的日志信息,git log主要用于查看版本号,以便确定要回退到哪个版本 -
git log –graph
查看提交历史树 -
git reflog
查看所有的提交历史,在git log无法查看版本号的 时候,可以使用git reflog来查看---------------------------------------- -
git diff branch1..branch2
比较两个分支的差异 -
git diff –staged
比较暂存区和版本库差异 -
git diff file
比较当前文件和暂存区文件差异 -
git diff commitId1 commitId2
比较两次提交的差异---------------------------------------- -
git branch
查看所有 -
git branch -r
查看所有远程分支---------------------------------------- -
git show commitId
查看某次提交的详情
回退
-
git checkout – file
将modified状态的文件回退到最近一次的staged状态或者commit状态 -
git checkout .
将modified状态的所有文件回退到最近一次的staged状态或者commit状态---------------------------------------- -
git reset file
把文件从暂存区恢复到工作文件 -
git reset
把所有文件从暂存区恢复到工作 -
git reset –soft commitId
回退到commit_id,头指针恢复,缓存区和工作区保持不变 -
git reset commitId =git reset –mixed commitId
回退到commit_id,头指针恢复,缓存区丢失,工作区不变 -
git reset –hard commitId
回退到commit_id,一切都恢复,缓存区丢失,工作区丢失
参考:git reset soft,mixed,hard区别解析---------------------------------------- -
git revert commitId
恢复某次提交的状态,恢复动作本身也创建一次提交对象
分支管理
-
git branch branch_name
创建分支---------------------------------------- -
git branch -d branch_name
删除某个分支 -
git branch -D branch_name
强制删除某个分支(未被合并的分支被删除的时候需要强制)---------------------------------------- -
git checkout branch_name
切换到某个分支---------------------------------------- -
git merge branch_name
将branch_name分支合并到当前分支 -
git merge branch_name –no-ff
禁止Fast-Foward合并,这样可以生成merge提交
暂存管理
-
git stash
暂存当前分支工作区和暂存区 -
git stash pop
恢复暂存分支的内容并删除暂存分支 -
git stash clear
清除暂存分支 -
git stash list
列出所有暂存分支
stash的工作原理是什么?git stash与git add相同吗?为什么?
stash 实现思路将我们的修改提交到本地仓库,使用特殊的分支指针(.git/refs/stash)引用该提交,然后在恢复的时候,将该提交恢复即可。我们可以更进一步,看看 stash 做的提交是什么样的结构
如图所示,如果我们提供了 —include-untracked 选项,git 会将 untracked 文件做一个提交,但是该提交是一个游离的状态,接着将暂存区的内容做一个提交。最后将工作区的修改做一个提交,并以untracked 的提交、暂存区 的提交、基础提交为父提交。
搞这么复杂,是为了提供更灵活地选项,我们可以选择性的恢复其中的内容。比如恢复 stash 时,可以选择是否重建 index,即与 stash 操作时完全一致的状态。
参考:Git玩法
远程分支
-
git pull
抓取远程仓库所有分支更新并合并到本地 -
git pull –no-ff
抓取远程仓库所有分支更新并合并到本地,不要快进合并---------------------------------------- -
git push origin master
将本地主分支推送到远程主分支