引言:
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
- 将工作目录文件刚入git仓库:
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)add
和commit
,即上中,最后修改完成LICENSE(v2)add
和commit
,即上右,最新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
创建并且换到分支featuregit log --decorate --oneline --graph --all
图像化显示所有分支git merge 分支名
合并分支git branch -d 分支名
删除分支
checkout
指令的另一些操作匿名分支:
git checkout HEAD~
当checkout
后面接的不是一个分支名时,git会自动常见一个匿名分支,这个分支操作都一样,但是要合并到主分支后就会自动消失,即你可以当作是一个无成本的实验。从历史快照(或者暂存区)中拷贝文件到工作目录:
git checkout HEAD~ 文件名
命令会将上一个快照中的该文件复制到工作目录和暂存区;git checkout 文件名
将会从暂存区恢复指定文件到工作目录。使用
git checkout -- 文件名
这样的写法是为了防止恢复文件出现和文件名重名的分支名让git无法分辨切换分支:上文所说,切换仓库中指针指向,并且将对应的内容覆盖暂存区和工作区。
reset
和checout
命令的区分- 对于恢复文件,两者都可以回复指定快照的指定文件,并且都不会改变HEAD指针的指向;区别是
reset
命令只能将文件恢复到暂存区域,checkout
命令会同时覆盖暂存区和工作区,此时的reset
命令使用--soft/--hard
指令对文件无效,总的来,reset
恢复文件要更安全点。 - 对于回复快照,
reset
命令是用来回到过去的,根据选项的不同,reset
命令将移动HEAD指针(–soft)-> 覆盖暂存区(默认)-> 覆盖工作区(–hard);checkout
命令在分支上也会有类似的操作。区别在于checkout
要更安全些,checkout
在切换分支前都会检查当前工作状态,而reset --hard
会直接覆盖;另一个,reset
命令移动HEAD指针时是在其所在分支上,而checkout
会移动HEAD自身到另一个分支上。
- 对于恢复文件,两者都可以回复指定快照的指定文件,并且都不会改变HEAD指针的指向;区别是
后记:记录来自网易云课堂上的一篇git教程,附上网址有需要可移步