浅谈Git

Posted 胡育诚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈Git相关的知识,希望对你有一定的参考价值。

概念

  • 工作区 即项目所在目录
  • 暂存区stage 每次我们都会通过git add将修改的文件加入暂存区,然后再通过commit提交到分支上
  • 版本库/.git目录 版本库中有stage暂存区,和git给我们创建的master分支,以及分支的头指针HEAD
    ----------------------------------------
  • 版本库——.git/objectsobjects目录中有很多文件,使用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 将本地主分支推送到远程主分支

以上是关于浅谈Git的主要内容,如果未能解决你的问题,请参考以下文章

Git 2:创建仓库(bitbucket)

二、配置多个git仓库和账户

浅谈git常用命令

浅谈对GIT的认识

浅谈GIT之通讯协议

浅谈GIT之底层对象理解