Git-Notes

引言:

Git学习记录

基本操作

  • Git的记录
    • git记录所有版本的存储
    • 三棵树:工作区(你所用到的)、暂存区、git仓库(存放所有版本的数据)
  • Git的工作流程
    • 工作目录的添加修改
    • 需要进行版本管理的文件放入暂存区域
    • 暂存区域文件提交到git仓库
    • git管理文件的三个状态
      • 已修改(modified)
      • 已暂存(staged)
      • 已提交(committed)

  • Git操作
    • 将工作目录文件刚入git仓库:
      • 新建文件夹,命令提示符切换到该目录下
      • git init 初始化仓库
      • git add 文件名
      • git commit -m "注释"
    • 查看状态
      • git status
    • 回撤上次操作(谨慎操作)
      • git checkout -- 文件名(可选)
      • git reset HEAD 文件名(可选)
    • 查看历史状态
      • git log

reset和checkout

  • reset 命令

    • reset命令的选项

      • git reset HEAD~

        移动HEAD的指向,将其指向上一个快照(版本),修改的第三棵树
        将HEAD移动后指向的快照回滚到暂存区域,修改的第二棵树

      • git reset --soft HEAD~

        移动HEAD的指向,将其指向上一个快照(相当于撤销上一次提交)

      • git reset --hard HEAD~(谨慎操作)

        移动HEAD的指向,将其指向上一个快照(状态),修改第一棵树
        将HEAD移动后指向的快照回滚到暂存区域,修改第二棵树
        将暂存区域文件还原到工作目录,修改第一棵树

    • reset命令总结

      • --soft 移动HEAD的指向,改变第三棵树仓库里面的内容
      • 默认,是将快照回滚到暂存区域
      • 将暂存区域内容还原到工作目录(谨慎操作)
    • 回滚到指定快照

      使用快照的特定哈希,即 git log中的每个操作对应的字符串

图片解释:工作区完成 README.md(v1) add到暂存区,commit到仓库区,即上左,又完成LICENSE(v1)addcommit,即上中,最后修改完成LICENSE(v2)addcommit,即上右,最新HEAD指向最右;图下显示各时段三棵树状态。

在这里插入图片描述

图片解释:执行git reset HEAD~,HEAD就会指向前一个快照(版本),即上中,该指令会将暂存区域内容返回为HEAD移动后指向的快照内容(即上一个版本内容),这是若查看git status则会显示原工作区修改并提交的LICENSE(v2)文件未被git追踪到(之前的add操作以往,文件在命令符中是红色的)

在这里插入图片描述

图片解释:这是接着执行git reset --hard HEAD~操作,根据指令HEAD指向上左,且将HEAD移动后指向的快照回滚到暂存区域,且将暂存区域文件还原到工作目录,这里就会出现工作区内容被覆盖,即LICENSE(v2)文件消失。

在这里插入图片描述

  • git diff命令
    • 会出现diff --git a/filename b/filename,即对比工作区和暂存区文件差异
    • ---三个减号对应的是暂存区文件(未修改旧文件)
    • +++三个加号对应工作区文件(修改后文件)
    • 输入h可获取帮助
    • 比较两个历史快照
      • git diff id1 id2一般写哈希序列的前5、6个值就行了
    • 比较当前工作区与仓库快照
      • git diff id 与仓库中某个版本对比
      • git diff HEAD 与仓库中最新的版本对比
    • 比较暂存区与仓库快照
      • git diff --cached 暂存区与仓库中最新版本对比
      • git diff --cached id 暂存区与仓库中指定版本对比
        图片解释:git diff 的相关图示

在这里插入图片描述

修改最后一次提交

  • 状况一、版本commit到仓库后,发现忘记还有文件没有add
  • 状况二、版本commit后发现版本说明写的不够全面

处理方法:使用带 --amend 选项的 commit 提交命令,git 会“更正”最近一次提交(git commit --amend ,)

删除文件

  • git checkout -- filename恢复误删文件
  • git rn filename删除误传文件(错误add,commit到仓库的文件),该命令删除的只是工作区和暂存区的文件,也就是取消跟踪,在下次提交时不纳入版本管理,在仓库日志中还收有信息的,加上git reset --soft HEAD~命令后可完全消除记录。
  • 当对暂存区文件,工作区修改后,想要进行删除,会有提示无法删除,使用git rn -f filename 会同时删除两个文件。
  • 只想删除暂存区文件:git rn --cached filename可完成

重命名文件

  • git nv oldname newname操作

分支

  • git branch 分支名 创建分支
  • git checkout 分支名 切换分支
  • git checkout -b feature 创建并且换到分支feature
  • git log --decorate --oneline --graph --all 图像化显示所有分支
  • git merge 分支名 合并分支
  • git branch -d 分支名 删除分支

在这里插入图片描述

在这里插入图片描述

  • checkout指令的另一些操作

    • 匿名分支:git checkout HEAD~checkout 后面接的不是一个分支名时,git会自动常见一个匿名分支,这个分支操作都一样,但是要合并到主分支后就会自动消失,即你可以当作是一个无成本的实验。

    • 从历史快照(或者暂存区)中拷贝文件到工作目录:git checkout HEAD~ 文件名 命令会将上一个快照中的该文件复制到工作目录和暂存区;git checkout 文件名将会从暂存区恢复指定文件到工作目录。

      使用git checkout -- 文件名这样的写法是为了防止恢复文件出现和文件名重名的分支名让git无法分辨

    • 切换分支:上文所说,切换仓库中指针指向,并且将对应的内容覆盖暂存区和工作区。

  • resetchecout命令的区分

    • 对于恢复文件,两者都可以回复指定快照的指定文件,并且都不会改变HEAD指针的指向;区别是reset命令只能将文件恢复到暂存区域,checkout命令会同时覆盖暂存区和工作区,此时的reset命令使用--soft/--hard指令对文件无效,总的来,reset恢复文件要更安全点。
    • 对于回复快照,reset命令是用来回到过去的,根据选项的不同,reset命令将移动HEAD指针(–soft)-> 覆盖暂存区(默认)-> 覆盖工作区(–hard);checkout命令在分支上也会有类似的操作。区别在于checkout要更安全些,checkout在切换分支前都会检查当前工作状态,而reset --hard 会直接覆盖;另一个,reset命令移动HEAD指针时是在其所在分支上,而checkout会移动HEAD自身到另一个分支上。

后记:记录来自网易云课堂上的一篇git教程,附上网址有需要可移步