前言
Git是版本控制工具。
十分膜拜Git的开发者-Linus Torvalds(是Git和Linux的爸爸),发明了这么精彩的玩意。以下看起来比较束手无策的场景,只要用好git,都能轻松解决:
(1)修改了一半的文件,突然间不需要修改或者放弃修改了,怎么恢复未修改前的文件(没add:手动删除、revert changes、git checkout --文件名)
(2)代码需要回滚了?(git reset)
Git的安装
(1)安装命令行工具
(2)在Idea中集成Git
一、Git的结构
1. 工作区
workspace:就是你在电脑上能看到的目录
2. 暂存区
.git/index:英文叫stage或index。所以我们把暂存区也叫作索引(index)
4. 本地仓库
.git:在当前目录中生成一个.git目录(含有.git目录的目录即是git仓库)
5. 远程仓库
局域网:GitLab(不开源)
互联网:GitHub(外网)、Gitee码云(国内网站,目前公司就用这个)
二、Git常用命令
1.设置用户签名(注册git用户)
用户签名只用设置一次,就是入职当天只设置一次。如果不设置,提交代码就会报错。用于在团队合作开发中,代表代码作者。
git config --global user.name 用户名
git config --global user.email 邮箱
2.初始化本地库(创建git库)
生成.git 本地仓库
git init
3.查看状态
git status
4.添加暂存区
将工作区的文件添加到暂存区,将文件交由Git管理。
会把当前所有的untrack files和changes but not updated添加到stage状态
git add 文件名
5.提交本地库
将暂存区的 文件提交到本地库
git commit -m “日志信息” 文件名
6.查看历史版本(本地仓库)
git reflog:查看版本信息(精简版)
git log:查看版本详细信息
三、Git常用命令—代码回滚
- 工作区做了修改未add
删除工作区中的修改(一夜回到解放前)
(1)最笨的方式:手动删除
(2)快捷的方式—使用命令
git checkout --文件名
图形化界面中的:revert changes - 文件添加到了暂存区未commit
(1)删除
只删除暂存区的文件:git rm --cached 文件路径
删除暂存和物理文件:git rm --f 文件路径
(2)撤销
将暂存区里的文件或文件夹移到工作区
回滚至工作区的 文件未修改时的状态:git reset 文件名
回滚至工作区的 文件修改之后的状态:git reset HEAD - 文件添加到了版本库未push
使用git reflog 查看版本号
(1)删除
这个时候已经形成了历史版本,不能删除文件了哟。除非删库跑路,牢底坐穿,哈哈哈
显示分支:git branch
找到目录下隐藏的.git:ls -a
删除.git:rm -rf .git
(2)撤销
git reset --soft | --mixed | --hard <commit_id>
- -soft
回退时保留源码,仅仅回退commit,修改的文件仍然在暂存区,再次提交时只需要git commit
–mixed(默认)
回退时保留源码,回退commit同时修改的文件会置于工作区,再次提交时需要git add
–hard
回退时清除提交的源码(危险操作),源码和commit都会回滚到某个版本
git reset --hard <commit_id> 的实操:
first:通过git reflog查看提交信息,以便获取需要回退至的版本号(哈希值)
second:通过git reset --hard <commit_id>重置至指定版本的提交,达到撤销提交的目的
last:通过git reflog确认是否成功撤销
通过git push master --force强制提交当前版本号到远程端,以达到撤销版本号的目的。
也有人在push代码以后,也使用git reset --hard <commit_id>回退代码到某个版本之前
但是这样会遇到一个问题:你远程的代码没有改变,远程的commit,index都没有改变,当你把本地代码修改完提交的时候你会发现全是冲突,容易弄丢别人的代码。。。
这时候换另一种方法:
- push代码已经更新到远程库
git revert <commit_id>
revert之后你的代码会回滚到指定的历史版本,这时你再git push即可以把远程的代码更新。
四、结尾
(1)commit后三区就一致了,pull下来后三区也会一致
(2)reset是在正常的commit历史版本中,删除了指定的commit,这时HEAD是向后移动了,
而revert是在正常的commit历史版本中再commit一次,只不过是反向提交,他的HEAD是一直向前的。
(3)push:实际上就是将本地分支合并到远程库分支
pull:实际上就是将远程库分支合并到本地库分支
(4)未被git跟踪的状态为unstage状态
已被git跟踪的状态为stage状态:包括staging状态和staged状态
unstage状态包括:untrack files && changed but not updated
untrack files:是指尚未被git所管理的文件
changed but not updated:是指文件被git管理,并且发生了改变,但改
动还没被git管理;这两种状态,都可以看成是改动还没被git管理的状态
staging状态:是已管理和commit之间的一个状态,也有别名叫index状态,也就是git已经管
理了这些改动,但是还没完成提交。
staged:已经提交,changes to be commited 是指进入staged状态的文件
.gitignore中的文件,不会出现在以上三个状态中