git总结

作者: Young_Jeff | 来源:发表于2019-07-31 11:11 被阅读0次

一、首先理解下Git工作区、版本库和暂存区概念

工作区(Working Directory):是对项目的某个版本独立提取出来的内容。这些从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
版本库(Repository):目录是Git用来保存项目的元数据和对象数据库的地方。这是Git中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
暂存区域(Staging Area):是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作“索引”,不过一般说法还是叫暂存区域。

二、存在位置

工作区:就是你在电脑里能看到的目录。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
暂存区:一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

三、文件在三个区块的转换

当对工作区修改(或新增)的文件执行 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 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

概念采用:https://blog.csdn.net/Miracle_Yan/article/details/80224839

常用命令

  • 初始化仓库
git init  //会在当前的目录下增加一个 .git 目录,可以开始记录项目版本
git init <directory>  //在指定目录创建一个空的 Git 仓库
git init --bare <directory>  //初始化一个裸的 Git 仓库
  • 克隆
git clone <repo>  //将位于 <repo> 的仓库克隆到本地机器。原仓库可以在本地文件系统中,或是通过 HTTP 或 SSH 连接的远程机器
git clone <repo> <directory>  //将位于 <repo> 的仓库克隆到本地机器上的 <directory> 目录。
  • 配置
git config user.name <name>  //定义当前仓库所有提交使用的作者姓名
git config --global user.email <email>  //定义当前用户所有提交使用的作者邮箱。
git config --global --edit  //用文本编辑器打开全局配置文件,手动编辑
  • 添加到缓存
git add <文件>  //缓存 <文件> 中的更改,准备下次提交。
git add <目录>  //缓存 <目录> 下的所有更改,准备下次提交。
git add -p  //开始交互式的缓存
  • 检出
    git checkout 有三个不同的作用:检出文件、检出提交和检出分支
git checkout master  //切换到 master 分支
git checkout <commit> <file>  //查看文件之前的版本,它将工作目录中的 <file> 文件变成 <commit> 中那个文件的拷贝,并将它加入缓存区。
git checkout <commit>  //更新工作目录中的所有文件,使得和<commit>这个提交中的文件一致,也可以将提交的哈希字符串,或是标签作为 <commit> 。
  • 回滚方案:Reset、Checkout、Revert
    git revert 命令用来撤销一个已经提交的快照;它是在时间轴末端加上一个 “撤销了更改” 的新提交,而不是从项目历史中移除这个提交,避免丢失项目历史
git revert <commit>  //生成一个撤消了 <commit> 引入的修改的新提交,然后应用到当前分支

撤销(revert)应该用在你想要在项目历史中移除一整个提交的时候。比如说,你在追踪一个 bug,然后你发现它是由一个提交造成的,这时候撤销就很有用;因为git revert 回滚了「单独一个提交」,它没有移除后面的提交,然后回到项目之前的状态。

如果说 git revert 是一个撤销更安全的方式,那 git reset 就可以看做一个危险的方式,当用 git reset 来重设更改时,无法获得原来的样子 ——这个撤销是永远的

git reset <file>  //从缓存区移除特定文件,但不改变工作目录。它会取消这个文件的缓存,而不覆盖任何更改。
git reset  //重设缓冲区,匹配最近的一次提交,但工作目录不变。它会取消 所有 文件的缓存,而不会覆盖任何修改,给你了一个重设缓存快照的机会。
git reset --hard  //重设缓冲区和工作目录,匹配最近的一次提交。除了取消缓存之外,--hard 标记告诉 Git 还要重写所有工作目录中的更改。换句话说:它清除了所有未提交的更改,所以在使用前确定你想扔掉你所有本地的开发。
git reset <commit>  //将当前分支的末端移到 <commit>,将缓存区重设到这个提交,但不改变工作目录。所有 <commit> 之后的更改会保留在工作目录中,这允许你用更干净、原子性的快照重新提交项目历史。
git reset --hard <commit>  //将当前分支的末端移到 <commit>,将缓存区和工作目录都重设到这个提交。它不仅清除了未提交的更改,同时还清除了 <commit> 之后的所有提交。

撤销(revert)和重设(reset)对比:
revert 和 reset 相比有两个重要的优点;
首先,它不会改变项目历史,对那些已经发布到共享仓库的提交来说这是一个安全的操作。
其次,git revert 可以针对历史中任何一个提交,而 git reset 只能从当前提交向前回溯。比如,你想用 git reset 重设一个旧的提交,你不得不移除那个提交后的所有提交,再移除那个提交,然后重新提交后面的所有提交。

  • 日志
git log  //使用默认格式显示完整地项目历史。如果输出超过一屏,你可以用 空格键 来滚动,按 q 退出。
git log -n <limit>  //用 <limit> 限制提交的数量。比如 git log -n 3 只会显示 3 个提交。
git log --oneline  //将每个提交压缩到一行。当你需要查看项目历史的上层情况时这会很有用。
git log --stat  //除了 git log 信息之外,包含哪些文件被更改了,以及每个文件相对的增删行数。
git log -p  //显示代表每个提交的一堆信息。显示每个提交全部的差异(diff),这也是项目历史中最详细的视图。
git log --author="<pattern>"  //搜索特定作者的提交。<pattern> 可以是字符串或正则表达式。
git log --grep="<pattern>"  //搜索提交信息匹配特定 <pattern> 的提交。<pattern> 可以是字符串或正则表达式。
git log <since>..<until>  //只显示发生在 <since> 和 <until> 之间的提交。两个参数可以是提交 ID、分支名、HEAD 或是任何一种引用。
git log <file>  //只显示包含特定文件的提交。查找特定文件的历史这样做会很方便。

打印日志高级用法

  • --oneline 标记把每一个提交压缩到了一行中。它默认只显示提交ID和提交信息的第一行
  • --decorate 标记让 git log 显示指向这个提交的所有引用(比如说分支、标签等)
  • --stat 选项显示每次提交的文件增删数量(注意:修改一行记作增加一行且删去一行,还可以将 -p 选项传入git log。这样提交所有的删改都会被输出
  • --shortlog 是一种特殊的 git log,把每个提交按作者分类,显示提交信息的第一行,可以容易看到谁做了什么;默认情况下,git shortlog 把输出按作者名字排序,但你可以传入 -n 选项来按每个作者提交数量排序
  • --graph 选项绘制一个 ASCII 图像来展示提交历史的分支结构。它经常和 --oneline 和 --decorate 两个选项一起使用,这样会更容易查看哪个提交属于哪个分支
  • --after 或 --before 标记来按日期筛选,也可传入相对日期,如:("2 week ago")或者("yesterday"),也可同时提供--before 和 --after 来检索两个日期之间的提交
    git log --after="2018-8-1"  
    get log --after="yesterday"
    git log --after="2018-8-1" --before="2018-8-4"
    //注意 --since、--until 标记和 --after、--before 标记分别是等价的。
    
  • --author 标记,作者名不一定是全匹配,只要包含那个子串就会匹配;也可以用正则表达式来创建更复杂的检索。比如,如检索名叫 kangkang 或 xiaoming 的作者的提交,也可按邮箱检索(作者的邮箱地址也算作是作者的名字)
    git log --author="xiaoming"
    git log --author="kangkang\|xiaoming"
    
  • --grep 标记,按提交信息检索,也可以传入 -i 参数来忽略大小写匹配
    git log --grep="更改index文件" 
    
  • 按文件检索,-- 告诉 git log 接下来的参数是文件路径而不是分支名。如果分支名和文件名不可能冲突,你可以省略 --
    git log -- login.js
    
  • 按照内容
    git log -S "Hello, World!"
    

常用命令整理 采用文章链接:https://github.com/geeeeeeeeek/git-recipes/wiki

相关文章

  • 工具集#01 Git 代码版本控制

    目录:Git 入门Git 进阶Git 高阶总结 1. Git 入门 Git global setup Create...

  • 工具集#01 Git 代码版本控制

    目录:Git 入门Git 进阶Git 高阶总结 1. Git 入门 Git global setup Create...

  • Git与Github的使用总结 - day 03

    git常用命令总结 git配置(config): git仓库(repository): git分支(branch)...

  • git使用总结

    git使用总结 git --version //查看所安装的git的版本 git config --global ...

  • git 命令

    Git常用命令总结Git常用命令总结 git init 在本地新建一个repo,进入一个项目目录,执行git ...

  • 2018-04-18

    git学习小结 关于git init,git add,git commit 用法总结 1.首先配置git 全局配置...

  • GitHub创建远程仓库及连接

    总结:使用的git命令 git init git remote add origin (远程仓库地址) git r...

  • git总结

    git总结 标签(空格分隔): git 本文是对廖雪峰的git教程的总结 [TOC] 创建版本库 创建版本库:gi...

  • Git 常用指令

    Git常用命令总结 Git常用命令总结 git init 在本地新建一个repo,进入一个项目目录,执行git i...

  • Git Summary Template

    Git Summary Template ​ git 提交模板,个人总结 ( ) : <空行> ...

网友评论

      本文标题:git总结

      本文链接:https://www.haomeiwen.com/subject/mwdzrctx.html