学习Git的笔记,做个记录
资料比我写的更好
git简介
git是什么
git是版本控制工具
git结构
远程库(代码托管平台)、本地库(历史版本)、暂存区(临时存储)、工作区(写代码)
工作区 --git add–> 暂存区 --git commit–> 本地库 --git push–>远程库
开始使用git
本地库初始化
git init
得到一个 .git
文件夹,存放的是本地库相关的子目录和文件,不要删除也不要乱修改
设置签名
形式
用户名:tom
email地址:[email protected]
作用
区分不用的开发人员
注意
这里设置的签名和登录远程库(如github)的账号、密码没有任何关系,即用户名和email可以是虚假的
命令
项目级别/仓库级别
仅在当前本地库范围内有效
git config
例:
git config user.name tom
git config user.email [email protected]
信息存放在 .git/config
文件下
$ ~/Desktop/gitTest master cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
name = tom
email = [email protected]
系统用户级别(推荐)
电脑系统(当前登录的用户)的git签名:登录当前操作系统的用户范围
git config --global
例:
git config --global user.name tom_glb
git config --global user.email [email protected]
信息存放在 ~/.gitconfig
文件下
$ ~ cat .gitconfig
[user]
email = [email protected]
name = tom_glb
优先级
项目 > 系统用户级别
注意
两种都没有会报错
查看状态
git status
功能
查看工作区、暂存区状态
$ ~/Desktop/gitTest git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
添加到暂存区
git add [fileName]
功能
将工作区的“新建/修改”添加到暂存区
解释
将fileName文件添加到暂存区,即将fileName给git监控/追踪起来,只要文件一发生改变,git就立刻知道
注意
git add .
将所有修改过文件添加到暂存区
$ ~/Desktop/gitTest vim good.txt
$ ~/Desktop/gitTest git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
good.txt
nothing added to commit but untracked files present (use "git add" to track)
$ ~/Desktop/gitTest git add good.txt
$ ~/Desktop/gitTest git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: good.txt
后悔怎么办
git rm --cached fileName
不会删除文件,将文件从暂存区移除
提交
git commit
会进入vim编辑器输入提交信息,不推荐
git commit -m "xxx"
直接填写信息提交,方便快捷,推荐
$ ~/Desktop/gitTest git commit
[master (root-commit) 814509c] my first commit.new file good.txt
1 file changed, 1 insertion(+)
create mode 100644 good.txt
$ ~/Desktop/gitTest master git status
On branch master
nothing to commit, working tree clean
注意
修改了文件不想执行add命令再执行commit命令:
git commit -a -m "提交信息"
$ ~/Desktop/gitTest git commit -a -m "第二次提交,修改了good.txt"
[master 51c07db] 第二次提交,修改了good.txt
1 file changed, 3 insertions(+), 1 deletion(-)
rewrite good.txt (100%)
查看历史记录
进入多屏显示状态
space向下翻页
b向上翻页
q退出
git log
commit e86a1e0b49e2f4222c8d36b1c0a7f49b0ddcab68 (HEAD -> master)
Author: tom <[email protected]>
Date: Thu Jul 15 01:17:09 2021 +0800
第七次提交,good.txt添加了hhhhhh
commit 246d12660cf29f58977083fd9ea4ab310bd31e72
Author: tom <[email protected]>
Date: Thu Jul 15 01:16:45 2021 +0800
第六次提交,good.txt添加了gggggg
commit 8e4934539a7d6beb506eab659efb3b89f74b410c
Author: tom <[email protected]>
Date: Thu Jul 15 01:16:17 2021 +0800
第五次提交,good.txt添加了ffffff
commit 7afbd2f6234e3a1ed94e36ab5831c8e2cff00a36
Author: tom <[email protected]>
Date: Thu Jul 15 01:15:45 2021 +0800
第四次提交,good.txt添加了eeeeee
:
git log --pretty=oneline
仅显示长哈希值与提交信息(有HEAD指针)
e86a1e0b49e2f4222c8d36b1c0a7f49b0ddcab68 (HEAD -> master) 第七次提交,good.txt添加了hhhhhh
246d12660cf29f58977083fd9ea4ab310bd31e72 第六次提交,good.txt添加了gggggg
8e4934539a7d6beb506eab659efb3b89f74b410c 第五次提交,good.txt添加了ffffff
7afbd2f6234e3a1ed94e36ab5831c8e2cff00a36 第四次提交,good.txt添加了eeeeee
4815833a9e63f7fc07bb911d1af342774df903c0 第三次提交,good.txt添加了dddddd
51c07dbf21aac42241d63bbe30280f415d8ae173 第二次提交,修改了good.txt
814509ca05bb06983169bd81d96225b5465ef442 my first commit.new file good.txt
(END)
git log --oneline
仅显示短哈希值与提交记录(有HEAD指针)
e86a1e0 (HEAD -> master) 第七次提交,good.txt添加了hhhhhh
246d126 第六次提交,good.txt添加了gggggg
8e49345 第五次提交,good.txt添加了ffffff
7afbd2f 第四次提交,good.txt添加了eeeeee
4815833 第三次提交,good.txt添加了dddddd
51c07db 第二次提交,修改了good.txt
814509c my first commit.new file good.txt
(END)
git reflog
仅显示短哈希值与 “HEAD@{后退次数}” 与提交信息
e86a1e0 (HEAD -> master) HEAD@{
0}: commit: 第七次提交,good.txt添加了hhhhhh
246d126 HEAD@{
1}: commit: 第六次提交,good.txt添加了gggggg
8e49345 HEAD@{
2}: commit: 第五次提交,good.txt添加了ffffff
7afbd2f HEAD@{
3}: commit: 第四次提交,good.txt添加了eeeeee
4815833 HEAD@{
4}: commit: 第三次提交,good.txt添加了dddddd
51c07db HEAD@{
5}: commit: 第二次提交,修改了good.txt
814509c HEAD@{
6}: commit (initial): my first commit.new file good.txt
(END)
注意
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 [短哈希值/局部索引值]
$ ~/Desktop/gitTest master git reset --hard 8e49345
HEAD is now at 8e49345 第五次提交,good.txt添加了ffffff
$ ~/Desktop/gitTest master cat good.txt
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
ffffff
使用 ^
符号:只能后退
git reset --hard HEAD^
注
一个表示后退一步,n个表示后退n步
$ ~/Desktop/gitTest master git reset --hard HEAD^^
HEAD is now at 4815833 第三次提交,good.txt添加了dddddd
使用 ~
符号:只能后悔
git reset --hard HEAD~n
注
n表示后退n步
$ ~/Desktop/gitTest master git reset --hard HEAD~1
HEAD is now at 51c07db 第二次提交,修改了good.txt
reset命令的三个参数对比
–sort
仅在本地库移动HEAD指针
–mixed
在本地库移动HEAD指针
重置暂存区
–hard
在本地库移动HEAD指针
重置暂存区、工作区
删除文件并找回
git reset --hard [未删除的短哈希值/指针位置]
前提
删除前,文件存在时的状态提交到了本地库
注意
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用HEAD
$ ~/Desktop/gitTest git commit -m "new deleteTestOnet.txt"
[master e6e4a89] new deleteTestOnet.txt
1 file changed, 2 insertions(+)
create mode 100644 deleteTestOne.txt
$ ~/Desktop/gitTest git reflog
$ ~/Desktop/gitTest ls
deleteTestOne.txt good.txt
$ ~/Desktop/gitTest rm deleteTestOne.txt
$ ~/Desktop/gitTest ls
good.txt
$ ~/Desktop/gitTest git reset --hard e6e4a89
HEAD is now at e6e4a89 new deleteTestOnet.txt
$ ~/Desktop/gitTest ls
deleteTestOne.txt good.txt
$ ~/Desktop/gitTest vim deleteTestTwo.txt
$ ~/Desktop/gitTest git add .
$ ~/Desktop/gitTest git commit -m "new deleteTestTwo.txt"
[master a690049] new deleteTestTwo.txt
1 file changed, 2 insertions(+)
create mode 100644 deleteTestTwo.txt
$ ~/Desktop/gitTest ls
deleteTestTwo.txt good.txt
$ ~/Desktop/gitTest rm deleteTestTwo.txt
$ ~/Desktop/gitTest ls
good.txt
$ ~/Desktop/gitTest git reflog
$ ~/Desktop/gitTest git reset --hard a690049
HEAD is now at a690049 new deleteTestTwo.txt
$ ~/Desktop/gitTest ls
deleteTestTwo.txt good.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
附