概念
- 工作区
即项目所在目录
- 暂存区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
将本地主分支推送到远程主分支