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

例:

git config user.name tom
git config user.email goodMorning@qq.com

信息存放在 .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 = goodMorning@qq.com
系统用户级别(推荐)

电脑系统(当前登录的用户)的git签名:登录当前操作系统的用户范围

git config --global

例:

git config --global user.name tom_glb
git config --global user.email goodMorning_glb@qq.com

信息存放在 ~/.gitconfig 文件下

$ ~ cat .gitconfig 
[user]
	email = goodMorning_glb@qq.com
	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 <goodMorning@qq.com>
Date:   Thu Jul 15 01:17:09 2021 +0800

    第七次提交,good.txt添加了hhhhhh

commit 246d12660cf29f58977083fd9ea4ab310bd31e72
Author: tom <goodMorning@qq.com>
Date:   Thu Jul 15 01:16:45 2021 +0800

    第六次提交,good.txt添加了gggggg

commit 8e4934539a7d6beb506eab659efb3b89f74b410c
Author: tom <goodMorning@qq.com>
Date:   Thu Jul 15 01:16:17 2021 +0800

    第五次提交,good.txt添加了ffffff

commit 7afbd2f6234e3a1ed94e36ab5831c8e2cff00a36
Author: tom <goodMorning@qq.com>
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(仓库)的一部分,它单独存储,而且不包含在pushesfetches或者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登录

GitHub官方教程:https://docs.github.com/cn/github/authenticating-to-github/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account

廖雪峰教程:https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416

gitee同理

Git 工作流

是什么?

一套规范,工作流程,用于规范分支、提交流程。

常见的有 gitflow 工作流,以下讲解 gitflow 工作流。

分支命名

分支作用
master生产主分支,发布到生产环境使用这个分支,由hotfix或者release分支合并过来,不直接提交代码。
develop主开发分支 , 基于master分支克隆,由feature分支合并过来,一般不直接提交代码。
feature功能开发分支 , 基于develop分支克隆 , 主要用于新需求新功能的开发,同时存在多个。如 feature/loginfeature/list
release预发布分支 , 基于feature分支合并到develop之后 , 从develop分支克隆,测试完成后合并到master并打上版本号,同时也合并到develop。如 release/v1.2
bugfix用于修复不紧急bug
hotfix补丁分支 , 基于master分支克隆 , 主要用于对线上的版本进行BUG修复,完成后合并到master分支和develop分支。

流程图

gitflow-schematicDiagram

参考链接:

  1. TOWER-git-flow 的工作流程
  2. jeffery_zou-Gitflow工作流程

参考

  1. 【尚硅谷】Git与GitHub基础全套完整版教程(快速上手,一套搞定)

  2. 廖雪峰的官方网站Git教程

资料

  1. 廖雪峰的官方网站Git教程 https://www.liaoxuefeng.com/wiki/896043488029600
  2. GitHub上的高质量的 Git 中文教程 https://github.com/geeeeeeeeek/git-recipes/blob/master/README.md
  3. git指令在线练习平台 https://learngitbranching.js.org/?locale=zh_CN

git-cheatsheet-cn

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值