Git学习笔记/Git不完全个人使用指南
学习Git的笔记,做个记录
资料比我写的更好
git简介
git是什么
git是版本控制工具
git结构
远程库(代码托管平台)、本地库(历史版本)、暂存区(临时存储)、工作区(写代码)
工作区 --git add–> 暂存区 --git commit–> 本地库 --git push–>远程库
开始使用git
本地库初始化
git init
得到一个 .git
文件夹,存放的是本地库相关的子目录和文件,不要删除也不要乱修改
设置签名
形式
用户名:tom
email地址:goodMorning@qq.com
作用
区分不用的开发人员
注意
这里设置的签名和登录远程库(如github)的账号、密码没有任何关系,即用户名和email可以是虚假的
命令
项目级别/仓库级别
仅在当前本地库范围内有效
git config
例:
1 | git config user.name tom |
信息存放在 .git/config
文件下
1 | ~/Desktop/gitTest master cat .git/config |
系统用户级别(推荐)
电脑系统(当前登录的用户)的git签名:登录当前操作系统的用户范围
git config --global
例:
1 | git config --global user.name tom_glb |
信息存放在 ~/.gitconfig
文件下
1 | ~ cat .gitconfig |
优先级
项目 > 系统用户级别
注意
两种都没有会报错
查看状态
git status
功能
查看工作区、暂存区状态
1 | ~/Desktop/gitTest git status |
添加到暂存区
git add [fileName]
功能
将工作区的“新建/修改”添加到暂存区
解释
将fileName文件添加到暂存区,即将fileName给git监控/追踪起来,只要文件一发生改变,git就立刻知道
注意
git add .
将所有修改过文件添加到暂存区
1 | ~/Desktop/gitTest vim good.txt |
后悔怎么办
git rm --cached fileName
不会删除文件,将文件从暂存区移除
提交
git commit
会进入vim编辑器输入提交信息,不推荐
git commit -m "xxx"
直接填写信息提交,方便快捷,推荐
1 | ~/Desktop/gitTest git commit |
注意
修改了文件不想执行add命令再执行commit命令:
git commit -a -m "提交信息"
1 | ~/Desktop/gitTest git commit -a -m "第二次提交,修改了good.txt" |
查看历史记录
进入多屏显示状态
space向下翻页
b向上翻页
q退出
git log
1 | commit e86a1e0b49e2f4222c8d36b1c0a7f49b0ddcab68 (HEAD -> master) |
git log --pretty=oneline
仅显示长哈希值与提交信息(有HEAD指针)
1 | e86a1e0b49e2f4222c8d36b1c0a7f49b0ddcab68 (HEAD -> master) 第七次提交,good.txt添加了hhhhhh |
git log --oneline
仅显示短哈希值与提交记录(有HEAD指针)
1 | e86a1e0 (HEAD -> master) 第七次提交,good.txt添加了hhhhhh |
git reflog
仅显示短哈希值与 “HEAD@{后退次数}” 与提交信息
1 | e86a1e0 (HEAD -> master) HEAD@{0}: commit: 第七次提交,good.txt添加了hhhhhh |
注意
git log
是显示当前的HEAD
和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲,…,这样的原则。git reflog
根本不遍历HEAD
的祖先。它是HEAD
所指向的一个顺序的提交列表:它的undo
历史。reflog
并不是repo
(仓库)的一部分,它单独存储,而且不包含在pushes
,fetches
或者clones
里面,它纯属是本地的。reflog
可以很好地帮助你恢复你误操作的数据,例如你错误地reset
了一个旧的提交,或者rebase
,…,这个时候你可以使用reflog
去查看在误操作之前的信息,并且使用git reset --hard
去恢复之前的状态。
*“注意”*内容来自:https://blog.csdn.net/chaiyu2002/article/details/81773041
版本前进后退
本质
HEAD指针的移动
方式:三种
基于哈希索引值操作【推荐】
git reset --hard [短哈希值/局部索引值]
1 | ~/Desktop/gitTest master git reset --hard 8e49345 |
使用 ^
符号:只能后退
git reset --hard HEAD^
注
一个表示后退一步,n个表示后退n步
1 | ~/Desktop/gitTest master git reset --hard HEAD^^ |
使用 ~
符号:只能后悔
git reset --hard HEAD~n
注
n表示后退n步
1 | ~/Desktop/gitTest master git reset --hard HEAD~1 |
reset命令的三个参数对比
–sort
仅在本地库移动HEAD指针
–mixed
在本地库移动HEAD指针
重置暂存区
–hard
在本地库移动HEAD指针
重置暂存区、工作区
删除文件并找回
git reset --hard [未删除的短哈希值/指针位置]
前提
删除前,文件存在时的状态提交到了本地库
注意
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用HEAD
1 | ~/Desktop/gitTest git commit -m "new deleteTestOnet.txt" |
1 | ~/Desktop/gitTest vim deleteTestTwo.txt |
比较文件差异
git diff [fileName]
将工作区的文件和暂存区进行比较
git diff [本地库历史版本] [fileName]
将工作区中的文件和本地库历史记录比较
注意
不带文件名比较多个文件
分支管理
分支简介
多个版本并行开发,提高开发效率。
如果一个分支开发失败,不会影响其他分支。
创建分支
git branch [branchName]
查看分支
git branch -v
标 *
是目前分支,且标有短哈希值
切换分支
git checkout [branchName]
合并分支
git merge [branchName]
将当前分支合并到branchName(有新内容的分支)
可以理解为当前分支指针移动到branchName分支指针的相同位置上,这样,当前分支的内容就变成和branchName分支一样了
极限理解:我合并了branchName,也就是我容纳了branchName,branchName有的东西我也要有,所以把branchName分支上的新内容放到我这
注
先要切换到被合并(被修改)分支上再进行合并
解决冲突
冲突的产生
合并时候同一行的两个分支内容不同
解决
第一步:编辑文件,删除特殊符号,修改到我们想要的内容
第二步:git add xxx
第三步:git commit -m “xxx”
远程库
创建远程库地址别名
添加远程库地址别名
git remote add [别名] [远程地址]
别名一般为origin
查看所有远程库
git remote
查看xxx远程库
git remote xxx
查看所有远程库地址别名
git remote -v
推送到远程库
git push [别名] [分支名]
克隆到本地
git clone [远程地址]
等同操作/效果
一、把完整的远程库下载到本地
二、创建origin远程地址别名
三、初始化本地库
拉取远程库
git pull [远程库地址别名] [远程分支名]
等同操作/效果
pull = fetch + merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名] [远程分支名]
解决冲突
如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取。
拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
ssh登录
廖雪峰教程:https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416
gitee同理
Git 工作流
是什么?
一套规范,工作流程,用于规范分支、提交流程。
常见的有 gitflow 工作流,以下讲解 gitflow 工作流。
分支命名
分支 | 作用 |
---|---|
master | 生产主分支,发布到生产环境使用这个分支,由hotfix或者release分支合并过来,不直接提交代码。 |
develop | 主开发分支 , 基于master分支克隆,由feature分支合并过来,一般不直接提交代码。 |
feature | 功能开发分支 , 基于develop分支克隆 , 主要用于新需求新功能的开发,同时存在多个。如 feature/login 、 feature/list |
release | 预发布分支 , 基于feature分支合并到develop之后 , 从develop分支克隆,测试完成后合并到master并打上版本号,同时也合并到develop。如 release/v1.2 |
bugfix | 用于修复不紧急bug |
hotfix | 补丁分支 , 基于master分支克隆 , 主要用于对线上的版本进行BUG修复,完成后合并到master分支和develop分支。 |
流程图
参考链接:
参考
资料
- 廖雪峰的官方网站Git教程 https://www.liaoxuefeng.com/wiki/896043488029600
- GitHub上的高质量的 Git 中文教程 https://github.com/geeeeeeeeek/git-recipes/blob/master/README.md
- git指令在线练习平台 https://learngitbranching.js.org/?locale=zh_CN
附