git初始化
- git安装:https://git-scm.com/
下载后一路“下一步”
- 初始化
打开指定文件夹,初始化git
C:\Users\Bat>E: E:>cd MyProject E:\MyProject>git init
输出:
Initialized empty Git repository in E:/MyProject/.git/
NotePad++编码选用UTF-8 无BOM编码
设置用户信息:
邮箱
git config --global user.name "nanshoui163"
设置git用户名
git config --global user.name "nanshoui163"
基本操作
文件加入暂存:
git add 文件名
文件从暂存加入仓库:
git commit -m"你干了啥”
-m “注释信息”
将暂存区文件覆盖到工作区:
git checkout --文件名
查看状态:
git status
文件操作下,三棵树的大致关系:
如果暂存区和工作区文件不一致,git提示不建议提交
将仓库最近一次文件拉取到暂存:(文件没有soft hard,只是默认mixed)
git reset HEAD -- <file>
HEAD ~ 有几个 ~ 就回到几次之前。~10 head之前的第10个版本
git reset HEAD~(默认原型是:git rest --mixed HEAD~)
git reset +快照 有三种模式:
-- mixed(默认) soft hard
移动HEAD的指向,将其指向上一个快照:
git reset --soft HEAD~ // 只会影响仓库一棵树 // 相当于撤销上一次错误commit
回滚到仓库指定的快照id:
git reset <版本快照的ID号> // 既可以回到过去也可以回到未来
回滚指定快照指定文件:
git reset <版本快照ID> <文件>
查看仓库log信息
git log
比较操作
关键字:diff
比较暂存区文件和工作区:
git diff
比较示例
说明:
---:表示旧文件
+++:表示新文件
:表示暂时显示不全
控制键操作:
jk上下移动一行 f往下翻页,b往上翻页 d往下翻半页,u往上翻半页 g第一行,G最后一行 数字+g 跳转指定行 输入h 进入帮助文档 / 往下搜索。? 往上搜索 高亮为搜索结果 输入q退出。
比较仓库任意俩个版本快照:
git diff 快照id1 快照id2
比较暂存区和仓库区快照
git diff --cached 快照id
总结:
**git diff // 默认比较工作区和暂存 **
–cached // 暂存
HEAD 或者 快照ID // 仓库指定版本快照
diff指令图解
修改提交说明
在实际开发中,你可能会遇到以下两种情景:一情景一:版本刚一提交(commit)到仓库,突然
想起漏掉两个文件还没有添加(add)。
情景二:版本刚一提交(commit)到仓库,突然
想起版本说明写得不够全面,无法彰显你本次修改的重大意义…
Git就会“更正”最近的一次提交:
它有两个操作:
1.如果暂存和最近一次提交不同,就会覆盖最近一次提交。如果一致,则略过。
2.更新提交说明。
git commit --amend
使用演示:
修改黄色的提交说明:
按i进行插入修改
退出操作:
按下ecs+shift+两下z,保存退出
其他推出操作:
1首先要按键盘左上角的"ESC",左下角的插入状态不见了。 2然后在按了ESC后再输入冒号,在输入命令时,直接输入"q",就可以退出了。 3不保存退出的方法:先按ESC,再输入冒号,在输入命令时,直接输入"q!"。
直接修改commit注释
git commit --amend -m "新的注释信息"
删除文件
删除的只是工作目录和暂存区域的文件操作:
git rm文件名 // 该命令删除的只是工作目录和暂存区域的文件,也 // 就是取消跟踪,在下次提交时不纳入版本管理。
如果工作目录和暂存区域文件不一致,
则不会执行删除。
强制删除:
git rm -f 文件名
如果只删除暂存区域的文件(保留工作目录的那么你可以执行)
git rm --cached 文件名
重新命名
改文件名,git不能直接追踪。建议用git改文件名:
git mv 旧文件名 新文件名
GIT分支
分支是神器
图解
新建分支:
git branch 分支名
操作图
切换分支:
git checkout 分支名
分支图解
git log 使用–decorate可以加一些别的修饰词
显示log在一行:
git log --decorate --oneline
修改READEME.md,加入字符"you are handsome"
Add 然后commit
Git log如下图
储存逻辑图:
显示图形化log
git log --decorate --oneline --graph --all
实际开发中的分支情况:
合并分支:
git merge 分支名
发生冲突,合并失败
原因:两个分支中存在同名的README但内容却不同的文件。
查看状态
Git 会修改不一致的文件,如下图。
修改你需要的最终效果,删除分隔即可。
提交修改,然后log就先合并了
创建并切换到新分支:
git checkout -b feature2
新建f2文件,add然后commit
打印图形分支如下图
合并
删除分支:
git branch -d 分支名
或者写
git branch --delete 分支名
匿名分支
初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCDRkgN4-1625015299890)(E:\StudyNotes\nanshoui163@163.com\38fb5bda068d4ab2bea1cdd57c6ab38e\clipboard.png)]
你使用checkout命令却没有指定分支名字,git会给你创建一个匿名分支。
当你切换到其他分支时,这个匿名分支你所有的提交都不会被保存。
如:
git checkout HEAD~
可以用匿名分支做实验
新建4.txt
切换回主分支:
在匿名分支随便修改提交,都不会影响master分支。
再论checkout
从历史快照(或者暂存区域)中拷贝文件到工作目录
当给定某个文件名时,Git 会从指定的提交中拷贝文件到暂存区域和工作目录。
比如执行 git checkout HEAD~ README.md 命令会将上一个快照中的 README.md 文件复制到工作目录和暂存区域中:
如果没有指定具体快照ID,将从暂存区恢复文件到工作目录。(git checkout README.md)
注意:写成 git checkout – README.md 的形式,约定两个横杆(–)后边跟的是文件名。(确保后面的文件名和分支名不重复)
1.恢复文件:
checkout命令和reset 命令都可以用于恢复指定快照的指定文件,并且它们都不会改变HEAD 指针的指向。
下面开始划重点:
它们的区别是reset命令只将指定文件恢复到暂存区域( --mixed ) ,
而checkout 命令是同时覆盖暂存区域和工作目录。
注意∶也许你试图使用git reset --hard HEAD~~ README.md 命令让reset 同时覆盖工作目录,但Git 会告诉你这是徒劳(此时reset不允许使用–soft或–hard选项)。
这样看来,在恢复文件方面,reset命令要比 checkout命令更安全一些。
2.恢复快照:**
reset 命令用来“回到过去(未来)”可以有三种模式:
// 只移动HEAD指针,只会影响仓库这一棵树
–soft
// 默认mixed,移动HEAD指针更改仓储指向,并覆盖暂存区
–mixed
// hard ,移动HEAD指针更改仓储指向,并覆盖暂存区和工作区
–hard
checkout 命令虽说是用于切换分支,但前面你也看到了,它事实上也是通过移动HEAD指针和覆盖暂存区域、工作目录来实现的。
重点:
(1)checkout比reset hard 更加安全。
因为checkout会检查当前工作状态是否为clean,如果不是clean,git将会不执行;reset --hard强制直接覆盖所有数据。
(2)移动HEAD指向不同。
reset 命令会移动HEAD所在分支的指向,(丢弃原来的指向)
而checkout 命令只会移动HEAD自身来指向另一个分支。