Git快速入门
[toc]
阅前提示:本文来自小甲鱼的 极客Python之Git实用教程 总结,完全是我自己记得笔记,在这里分享给大家,如有不足和错误,请在评论区告诉我
Git 记录的是什么?
Git 是将每个版本独立保存
工作区域、暂存区域和 Git 仓库
工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作;
暂存区(STAGIN AREA):数据(快照)暂时存放的地方;
**版本库(GIT DIRECTORT(RESPOSITORY)):**存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库了。
Git 工作流程
Git的工作流程一般是酱紫:
在工作目录中添加、修改文件
将需要进行版本管理的文件放入暂存区域
将暂存区域的文件提交到Git仓库
Git管理的文件有三种状态:
- 已修改(modified)
- 已暂存(staged)
- 已提交(committed)
实战
将工作目录的文件放到Git仓库只需要两步:
- git add 文件名 //添加文件
- git commit -m “你干了啥” //提交并注释
其它命令
- git status //查看状态
- git log //查看历史提交的最终版本,即 commit实体
- reset //撤回提交,即将最后一次存放到Git仓库里的文件撤回到暂存区
- checkout //从历史快照(或者暂存区域)中拷贝文件到工作目录
几个命令的功能
- 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 命令回滚快照三部曲
- 移动 HEAD 的指向(–soft)
- 将快照回滚到暂存区域([–mixed],默认)
- 将暂存区域还原到工作目录(–hard)
回滚个别文件
- git reset 版本快照 文件名/路径
- HEAD 指针不会移动,回滚
- git reset 版本快照的 ID 号
- 前滚
比较
比较暂存区域与工作目录
git diff //比较差异
第二行
比较暂存区域和工作目录下的 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
终极奥义图
修改最后一次提交
在实际开发中,你可能会遇到以下两种情景:
- 情景一:版本刚一提交(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 分支
创建分支
git branch 分支名
切换分支前
切换分支
git checkout 分支名
切换到feature分支后
向 feature 分支添加内容后
向 master 添加新内容后
- git log –oneline –graph –all
- 以图形化显示所有分支
合并和删除分支
实际开发中的分支
合并分支
- git merge 分支名
删除分支
- git branch -d 分支名
- git branch –delete 分支名
匿名分支
checkout 命令
功能
- 从历史快照(或者暂存区域)中拷贝文件到工作目录 git checkout – README.md 加(–)是预防你恰好有一个 README.md 的分支,产生矛盾
- 切换分支
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 自身来指向另一个分支。