对Git的理解和思考

前言

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中的文件,不会出现在以上三个状态中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值