Git快速入门

[toc]

阅前提示:本文来自小甲鱼的 极客Python之Git实用教程 总结,完全是我自己记得笔记,在这里分享给大家,如有不足和错误,请在评论区告诉我

Git 记录的是什么?

Git 是将每个版本独立保存

image-20220111133553859

工作区域、暂存区域和 Git 仓库

工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作;

  暂存区(STAGIN AREA):数据(快照)暂时存放的地方;

  **版本库(GIT DIRECTORT(RESPOSITORY)):**存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库了。

image-20220111133716264

Git 工作流程

  • Git的工作流程一般是酱紫:

    1. 在工作目录中添加、修改文件

    2. 需要进行版本管理的文件放入暂存区域

    3. 将暂存区域的文件提交到Git仓库

  • Git管理的文件有三种状态:

    • 已修改(modified)
    • 已暂存(staged)
    • 已提交(committed)

实战

  • 将工作目录的文件放到Git仓库只需要两步:

    • git add 文件名 //添加文件
    • git commit -m “你干了啥” //提交并注释
  • 其它命令

    • git status //查看状态
    • git log //查看历史提交的最终版本,即 commit实体
    • reset //撤回提交,即将最后一次存放到Git仓库里的文件撤回到暂存区
    • checkout //从历史快照(或者暂存区域)中拷贝文件到工作目录

image-20220111143815229

image-20220111144429661

几个命令的功能

  • add
    • 用于把工作目录的文件放入暂存区域
  • commit
    • 用于把暂存区域的文件提交到 Git 仓库
  • reset
    • 用于把 Git 仓库的文件还原到暂存区域
  • checkout
    • 用于把暂存区域的文件还原到工作目录

reset 命令选项(危险)

  • git reset –mixed HEAD~

    • 移动 HEAD 的指向,将其指向上一个快照
    • 将 HEAD 移动后指向的快照回滚到暂存区域
  • git reset –soft HEAD~

    • 移动 HEAD 的指向,将其指向上一个快照
  • git reset –hard HEAD~

    • 移动 HEAD 的指向,将其指向上一个快照
    • 将 HEAD 移动后指向的快照回滚到暂存区域
    • 将暂存区域的文件还原到工作目录

reset 命令回滚快照三部曲

  1. 移动 HEAD 的指向(–soft)
  2. 将快照回滚到暂存区域([–mixed],默认)
  3. 将暂存区域还原到工作目录(–hard)

回滚个别文件

  • git reset 版本快照 文件名/路径
    • HEAD 指针不会移动,回滚
  • git reset 版本快照的 ID 号
    • 前滚

比较

比较暂存区域与工作目录

  • git diff //比较差异

    image-20220111162726582

  • 第二行

    比较暂存区域和工作目录下的 README.md a 代表暂存区域下的文件夹 b 代表工作区域下的文件夹

  • 第三行

    1a5af1f..20f3146 表示文件ID, 100644 指定文件类型和权限

  • 第四行

    — 三个减号,表示是旧文件存放在暂存区域

  • 第五行 +++ 三个加号,表示是新文件存放在工作目录

  • 第六行

    中间的减号(-)代表旧文件,后面紧接着的数字代表开始行号,逗号后面的数字代表持续的行数

  • 第七行 减号后面,代表删减的内容

  • 第八行 加号后面,代表增加的内容

  • 第九行 两个版本共有的内容

  • 如果后面有冒号(:)代表文件内容未完全显示,需要输入命令查看或退出

    • 常用命令
      • j 向下移动一行
      • f 向下移动一页
      • b 向上移动一页
      • d 向下移动半页
      • u 向上移动半页
      • g 跳到第一行
      • G 跳到最后一行
      • 3g 跳到第3行
      • / 从上往下搜索
      • ? 从下往上搜索
      • /+搜索内容 按内容查找
      • h 显示帮助文档
      • q 退出

比较当前工作目录和 Git 仓库中的快照

  • git diff 快照ID

比较暂存区与 Git 仓库中的快照

  • git diff –cached 快照ID

终极奥义图

image-20220111171122255

修改最后一次提交

  • 在实际开发中,你可能会遇到以下两种情景:

    • 情景一:版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加( add ) 。
    • 情景二:版本刚一提交( commit)到仓库,突然想起版本说明写得不够全面,无法彰显你本次修改的重大意义…
  • 执行带 – amend 选项的 commit 提交命令, Git 就会 “更正” 最近的一次提交 git commit –amend

删除文件后恢复

  • git checkout –文件名 恢复已删除的文件

删除文件

  • git rm 文件名
    • 删除工作区域和暂存区域的文件,也就是取消跟踪,不纳入下一个版本管理,但不能删除已经提交在 git 仓库里的文件
    • git rm -f 文件名
      • 强制删除工作区域和暂存区域所有【文件名】文件,在工作目录和暂存区的同一个文件不同内容时使用
    • git rm –cached 文件名
      • 只删除暂存区的文件
  • git reset –soft HEAD~
    • soft 修改指针

重命名文件

  • git mv 旧文件名 新文件名
    • ren/mv 旧文件名 新文件名
    • git rm 旧文件名
    • git add 新文件名

Git 分支

image-20220111190210804

创建分支

  • git branch 分支名

  • 切换分支前

    image-20220111191533654

切换分支

  • git checkout 分支名

    切换到feature分支后 image-20220111191550366

向 feature 分支添加内容后

image-20220111193039175

向 master 添加新内容后

image-20220111193407423

  • git log –oneline –graph –all
    • 以图形化显示所有分支

合并和删除分支

实际开发中的分支

image-20220111194027008

合并分支

  • git merge 分支名

删除分支

  • git branch -d 分支名
    • git branch –delete 分支名

匿名分支

checkout 命令

功能

  1. 从历史快照(或者暂存区域)中拷贝文件到工作目录 git checkout – README.md 加(–)是预防你恰好有一个 README.md 的分支,产生矛盾
  2. 切换分支 image-20220111201613854

checkout 命令与 reset 命令区别

恢复文件

checkout 命令和 reset 命令都可以用于恢复指定快照的指定文件,并且它们都不会改变 HEAD 指针的指向。

下面开始划重点∶

它们的区别是 reset 命令只将指定文件恢复到暂存区域(–mixed ),而 checkout 命令是同时覆盖暂存区域和工作目录。

注意∶也许你试图使用 git reset --hard HEAD~README.md 命令让 reset 同时覆盖工作目录,但 Git 会告诉你这是徒劳(此时 reset 不允许使用 –soft 或 –hard 选项)。

这样看来,在恢复文件方面,reset 命令要比 checkout 命令更安全一些。

恢复快照

reset 命令是用来 “ 回到过去 ” 的,根据选项的不同,reset命令将移动 HEAD 指针 ( –soft ) -> 覆盖暂存区域 ( –mixed,默认 ) -> 覆盖工作目录 ( –hard )。

checkout 命令虽说是用于切换分支,但前面你也看到了,它事实上也是通过移动 HEAD 指针和覆盖暂存区域、工作目录来实现的。

那问题来了:它们有什么区别呢?

下面开始划重点∶

第一个区别是,对于 reset --hard 命令来说,checkout 命令更安全。因为 checkout 命令在切换分支前会先检查一下当前的工作状态,如果不是 “clean” 的话,Git 不会允许你这样做;而 reset –hard 命令则是直接覆盖所有数据。

另一个区别是如何更新 HEAD 指向,reset 命令会移动 HEAD 所在分支的指向,而 checkout 命令只会移动 HEAD 自身来指向另一个分支。