type
status
date
slug
summary
tags
category
icon
password
Git概念汇总🔥
概念名称 | 描述 |
工作区(Workspace) | 就是在电脑里能看到的代码库目录,是我们搬砖的地方,新增、修改的文件会提交到暂存区 |
暂存区(stage 或 index) | 用于临时存放文件的修改,实际上上它只是一个文件( .git/index ),保存待提交的文件列表信息。 |
版本库/仓库(Repository) | Git的管理仓库,管理版本的数据库,记录文件/目录状态的地方,所有内容的修改记录(版本)都在这里。 |
服务端/远程仓库(origin 或 remote) | 服务端的版本库,专用的Git服务器,为多人共享提供服务,承担中心服务器的角色。本地版本库通过push指令把代码推送到服务端版本库。 |
本地仓库 | 用户机器上直接使用的的的版本库 |
分支(Branch) | 分支是从主线分离出去的“副本”,可以独立操作而互不干扰,仓库初始化就有一个默认主分支 master 。 |
头(HEAD) | HEAD类似一个“指针”,指向当前活动 分支 的 最新版本。 |
提交(Commit) | 把暂存区的所有变更的内容提交到当前仓库的活动分支。 |
推送(Push) | 将本地仓库的版本推送到服务端(远程)仓库,与他人共享。 |
拉取(Pull) | 从服务端(远程)仓库获取更新到本地仓库,获取他人共享的更新。 |
获取(Fetch) | 从服务端(远程)仓库更新,作用同拉取(Pull),区别是不会自动合并。 |
冲突(Conflict) | 多人对同一文件的工作副本进行更改,并将这些更改合并到仓库时就会面临冲突,需要人工合并处理。 |
合并(Merge) | 对有冲突的文件进行合并操作,Git会自动合并变更内容,无法自动处理的冲突内容会提示人工处理。 |
标签(Tags) | 标签指的是某个分支某个特定时间点的状态,可以理解为提交记录的别名,常用来标记版本。 |
master(或main) | 仓库的“ master ”分支,默认的主分支,初始化仓库就有了。Github上创建的仓库默认名字为“main ” |
origin/master | 表示远程仓库( origin )的“master ”分支 |
origin/HEAD | 表示远程仓库( origin )的最新提交的位置,一般情况等于“origin/master ” |
🔸工作区(Workspace)就是在电脑里能看到的代码库目录,是我们搬砖的地方,新增、修改的文件会提交到暂存区。
- 在这里新增文件、修改文件内容,或删除文件。
🔸暂存区(stage或index) 用于临时存放文件的修改,实际上上它只是一个文件(.git/index),保存待提交的文件列表信息。
- 用
git add
命令将工作区的修改保存到暂存区。
🔸版本库/仓库(Repository /rɪˈpɑːzətɔːri/ 仓库)Git的管理仓库,管理版本的数据库,记录文件/目录状态的地方,所有内容的修改记录(版本)都在这里。就是工作区目录下的隐藏文件夹
.git
,包含暂存区、分支、历史记录等信息。- 用
git commit
命令将暂存区的内容正式提交到版本库。
master
为仓库的默认分支master
,HEAD是一个“指针”指向当前分支的最新提交,默认指向最新的master
。
如上图,为对应本地仓库目录的结构关系。
KWebNote
为项目目录,也就是Git工作区。
- 项目根目录下隐藏的
.git
目录就是Git仓库目录了,存放了所有Git管理的信息。
.git/config
为该仓库的配置文件,可通过指令修改或直接修改。
index
文件就是存放的暂存区内容。
Git基本流程(图)
Git的工作流程核心就下面几个步骤,掌握了就可以开始写Bug了。
- 0、准备仓库:创建或从服务端克隆一个仓库。
- 1、搬砖:在工作目录中添加、修改代码。
- 2、暂存(git add):将需要进行版本管理的文件放入暂存区域。
- 3、提交(git commit):将暂存区域的文件提交到Git仓库。
- 4、推送(git push):将本地仓库推送到远程仓库,同步版本库。
- 5、获取更新(fetch/pull):从服务端更新到本地,获取他人推送的更新,与他人协作、共享。
git commit -a
指令省略了add
到暂存区的步骤,直接提交工作区的修改内容到版本库,不包括新增的文件。
git fetch
、git pull
都是从远程服务端获取最新记录,区别是git pull
多了一个步骤,就是自动合并更新工作区。
git checkout .
、git checkout [file]
会清除工作区中未添加到暂存区的修改,用暂存区内容替换工作区。
git checkout HEAD .
、git checkout HEAD [file]
会清除工作区、暂存区的修改,用HEAD指向的当前分支最新版本替换暂存区、工作区。
git diff
用来对比不同部分之间的区别,如暂存区、工作区,最新版本与未提交内容,不同版本之间等。
git reset
是专门用来撤销修改、回退版本的指令,替代上面checkout
的撤销功能。
Git状态(图)
Git在执行提交的时候,不是直接将工作区的修改保存到仓库,而是将暂存区域的修改保存到仓库。要提交文件,首先需要把文件加入到暂存区域中。因此,Git管理的文件有三(+2)种状态:
- 未跟踪(untracked):新添加的文件,或被移除跟踪的文件,未建立跟踪,通过
git add
添加暂存并建立跟踪。
- 未修改:从仓库签出的文件默认状态,修改后就是“已修改”状态了。
- 已修改(modified):文件被修改后的状态。
- 已暂存(staged):修改、新增的文件添加到暂存区后的状态。
- 已提交(committed):从暂存区提交到版本库。
Git的配置文件
Git有三个主要的配置文件:三个配置文件的优先级是① < ② < ③
- ① 系统全局配置(--system):包含了适用于系统所有用户和所有仓库(项目)的配置信息,存放在Git安装目录下
C:\Program Files\Git\etc\gitconfig
。
- ② 用户全局配置(--global):当前系统用户的全局配置,存放用户目录:
C:\Users\[系统用户名]\.gitconfig
。
- ③ 仓库/项目配置(--local):仓库(项目)的特定配置,存放在项目目录下
.git/config
配置-初始化用户
当安装Git后首先要做的事情是配置你的用户信息—— 告诉Git你是谁?配置 用户名、邮箱地址,每次提交文件时都会带上这个用户信息,查看历史记录时就知道是谁干的了。
配置用户信息:
user.name
为用户名,user.email
为邮箱。
-global
:config
的参数,表示用户全局配置。如果要给特定仓库配置用户信息,则用参数-local
配置即可,或直接在仓库配置文件.git/config
里修改。
配置-忽略.gitignore
工作目录中的文件并不是全都需要纳入版本管理,如日志、临时文件、私有配置文件等不需要也不能纳入版本管理,那该怎么办呢?
在工作区根目录下创建“
.gitignore
”文件,文件中配置不需要进行版本管理的文件、文件夹。“.gitignore
”文件本身是被纳入版本管理的,可以共享。有如下规则:#
符号开头为注释。
- 可以使用Linux通配符。
- 星号(*)代表任意多个字符,
- 问号(?)代表一个字符,
- 方括号([abc])代表可选字符范围,
- 大括号({string1,string2,...})代表可选的字符串等。
- 感叹号(
!
)开头:表示例外规则,将不被忽略。
- 路径分隔符(/f)开头:,表示要忽略根目录下的文件
f
。
- 路径分隔符(f/)结尾:,表示要忽略文件夹
f
下面的所有文件。
📢 各种语言项目的常用.gitignore文件配置:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fgithub%2Fgitignore
Git的GUI工具们
如果不想用命令行工具,完全可以安装一个Git的GUI工具,用的更简单、更舒服。不用记那么多命令了,极易上手,不过Git基础还是需要学习了解一下的。
❓对于Git,建议用命令行,这样你才能真的理解Git的思想? ✔️其实都只是工具而已,适合自己的就是最好的,没必要纠结,多写点Bug更重要!
- TortoiseGit:小乌龟,SVN时代就很流行的代码管理GUI利器。
- 🚫只有Windows版本,支持中文,需要单独下载安装中文语言包。
- ✔️开源,免费,与文件管理器的良好集成。
- ✔️内置冲突对比解决工具。
- Sourcetree:SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。
- ✔️适用于 Windows 和 Mac 系统,内置中文版,自动识别语言。
- ✔️免费、功能强大,使用简单。
- ✔️功能丰富,基本操作和高级操作都设计得非常流畅,适合初学者上手,支持Git Flow。
- 🚫无冲突对比工具,支持配置第三方组件。
- GitHub Desktop:Github官方出品的Git管理工具。
- GitKraken:GitKraken是一个跨平台GUI Git客户端,有免费版,专业版和企业版,这些版本启用了不同的功能。
SourceTree
SourceTree的官网 下载安装包,支持Window、Mac系统,按照提示完成安装。
- SourceTree支持管理多个仓库,通过+按钮,可选择多种方式添加仓库。
- 然后就是可视化的仓库管理了,不用记住繁琐的指令(参数)了,可视化操作。
TortoiseGit
TortoiseGit 官网下载安装包,及中文语言包,按照提示完成安装。小乌龟的Git是集成到操作系统里的,直接右键文件夹就可以进行Git操作了。
- 先进入设置:右键文件夹菜单 --> TortoiseGit --> Settings 进入设置,设置中文语言。
- 小乌龟的各种Git操作都在右键菜单了,深度集成到了操作系统的资源管理器中了,文件图标也是有Git状态的,比较容易分辨。
VSCode中的Git
VSCode自带的Git工具基本已经可以满足日常使用了,既有可视化功能,也能敲命令,习惯了不就不用安装其他GUI工具了。不过还是可以再安装一些VSCode插件,来增强Git功能。
- GitLens :在团队项目开发中非常实用,必备!!!用于快速查看代码提交历史记录,在代码上会显示最近的修改信息,包括提交者,只就这一点就值得推荐了。
- Git History:可以轻松快速浏览Git文件操作历史记录的工具,可视化展示,操作简单。
远程仓库
Git作为分布式的版本管理系统,每个终端都有自己的Git仓库。但团队协作还需一个中间仓库,作为中心,同步各个仓库。于是服务端(远程)仓库就来承担这个职责,服务端不仅有仓库,还配套相关管理功能。
可以用公共的Git服务器,也可以自己搭建一套Git服务器。
- 搭建私有Git服务器,如开源的Gitlab、Gitea、等。
远程用户登录
Git服务器一般提供两种登录验证方式:
- HTTS:基于HTTPS连接,使用用户名、密码身份验证。
- 每次都要输入用户名、密码,当然可以记住。
- 地址形式:
https://github.com/kwonganding/KWebNote.git
- SSL:采用SSL通信协议,基于公私钥进行身份验证,所以需要额外配置公私秘钥。
- 不用每次输入用户名、密码,比较推荐的方法。
- 地址形式:
git@github.com:kwonganding/KWebNote.git
🔑远程用户登录:HTTS
基于HTTPS的地址连接远程仓库,Github的共有仓库克隆、拉取(pull)是不需要验证的。
推送(push)代码的时候就会提示输入用户名、密码了,否则无法提交。记住用户密码的方式有两种:
- 🔸URL地址配置:在原本URL地址上加上用户名、密码,
https://
后加用户名:密码@
- 🔸本地缓存:会创建一个缓存文件
.git-credentials
,存储输入的用户名、密码。
🔑远程用户登录:SSH
SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务,多用来进行远程登录、数据传输。SSH通过公钥、私钥非对称加密数据,所以SSH需要生成一个公私钥对,公钥放服务器上,私有自己留着进行认证。
① 生成公私钥:通过Git指令
ssh-keygen -t rsa
生成公私钥,一路回车即可完成。生成在“C:\Users\用户名\.ssh
”目录下,文件id_rsa.pub
的内容就是公钥。② 配置公钥:打开
id_rsa.pub
文件,复制内容。Github上,打开Setting
➤ SSH and GPG keys
➤ SSH keys
➤ 按钮New SSH key
,标题(Title)随意,秘钥内容粘贴进去即可。SSH配置完后,可用
ssh -T git@github.com
来检测是否连接成功。远程仓库指令🔥
指令 | 描述 |
git clone [git地址] | 从远程仓库克隆到本地(当前目录) |
git remote -v | 查看所有远程仓库,不带参数 -v 只显示名称 |
git remote show [remote] | 显示某个远程仓库的信息 |
git remote add [name] [url] | 增加一个新的远程仓库,并命名 |
git remote rename [old] [new] | 修改远程仓库名称 |
git pull [remote] [branch] | 取回远程仓库的变化,并与本地版本合并 |
git pull | 同上,针对当前分支 |
git fetch [remote] | 获取远程仓库的所有变动到本地仓库,不会自动合并!需要手动合并 |
git push | 推送当前分支到远程仓库 |
git push [remote] [branch] | 推送本地当前分支到远程仓库的指定分支 |
git push [remote] --force/-f | 强行推送当前分支到远程仓库,即使有冲突,⚠️很危险! |
git push [remote] --all | 推送所有分支到远程仓库 |
git push –u | 参数 –u 表示与远程分支建立关联,第一次执行的时候用,后面就不需要了 |
git remote rm [remote-name] | 删除远程仓库 |
git pull --rebase | 使用rebase的模式进行合并 |
推送push/拉取pull
git push
、git pull
是团队协作中最常用的指令,用于同步本地、服务端的更新,与他人协作。🔸推送(push):推送本地仓库到远程仓库。
- 如果推送的更新与服务端存在冲突,则会被拒绝,
push
失败。一般是有其他人推送了代码,导致文件冲突,可以先pull
代码,在本地进行合并,然后再push
。
🔸拉取(pull):从服务端(远程)仓库更新到本地仓库。
git pull
:拉取服务端的最新提交到本地,并与本地合并,合并过程同分支的合并。
git fetch
:拉取服务端的最新提交到本地,不会自动合并,也不会更新工作区。
fetch与pull有什么不同?
两者都是从服务端获取更新,主要区别是
fetch
不会自动合并,不会影响当前工作区内容。git pull = git fetch + git merge
- 如下面图中,
git fetch
只获取了更新,并未影响master
、HEAD
的位置。
- 要更新
master
、HEAD
的位置需要手动执行git merge
合并。
后悔药-怎么撤销变更?
发现写错了要回退怎么办?看看下面几种后悔指令吧!
- ❓还没提交的怎么撤销? ——
checkout
、reset
- 还未提交的修改(工作区、暂存区)不想要了,用签出指令(checkout)进行撤销清除。
- 或者用
checkout
的新版回滚指令reset
。
- ❓已提交但么有push的提交如何撤销?——
reset
、revert
- ❓已push的提交如何撤销?—— 同上,先本地撤销,然后强制推送
git push origin -f
,⚠️注意慎用! 记得先pull
获取更新。
后悔指令🔥
指令 | 描述 |
git checkout . | 撤销工作区的(未暂存)修改,把暂存区恢复到工作区。不影响暂存区,如果没暂存,则撤销所有工作区修改 |
git checkout [file] | 同上, file 指定文件 |
git checkout HEAD . | 撤销工作区、暂存区的修改,用 HEAD 指向的当前分支最新版本替换工作区、暂存区 |
git checkout HEAD [file] | 同上, file 指定文件 |
ㅤ | ㅤ |
git reset | 撤销暂存区状态,同 git reset HEAD ,不影响工作区 |
git reset HEAD [file] | 同上,指定文件 file ,HEAD 可省略 |
git reset [commit] | 回退到指定版本,清空暂存区,不影响工作区。工作区需要手动 git checkout 签出 |
git reset --soft [commit] | 移动分支 master 、HEAD 到指定的版本,不影响暂存区、工作区,需手动git checkout 签出更新 |
git reset --hard HEAD | 撤销工作区、暂存区的修改,用当前最新版 |
git reset --hard HEAD~ | 回退到上一个版本,并重置工作区、暂存区内容。 |
git reset --hard [commit] | 回退到指定版本,并重置工作区、暂存区内容。 |
ㅤ | ㅤ |
git revert[commit] | 撤销一个提交,会用一个新的提交(原提交的逆向操作)来完成撤销操作,如果已 push 则重新push 即可 |
git checkout .
、git checkout [file]
会清除工作区中未添加到暂存区的修改,用暂存区内容替换工作区。
git checkout HEAD .
、git checkout HEAD [file]
会清除工作区、暂存区的修改,用HEAD指向的当前分支最新版本替换暂存区、工作区。
回退版本reset
reset
是专门用来撤销修改、回退版本的指令,支持的场景比较多,多种撤销姿势,所以参数组合也比较多。简单理解就是移动master
分支、HEAD
的“指针”地址,理解这一点就基本掌握reset
了。如下图:
- 回退版本
git reset --hard v4
或git reset --hard HEAD~2
,master
、HEAD
会指向v4
提交,v5
、v6
就被废弃了。
- 也可以重新恢复到
v6
版本:git reset --hard v6
,就是移动master
、HEAD
的“指针”地址。
reset
有三种模式,对应三种参数:mixed
(默认模式)、soft
、hard
。三种参数的主要区别就是对工作区、暂存区的操作不同。mixed
为默认模式,参数可以省略。
- 只有
hard
模式会重置工作区、暂存区,一般用这个模式会多一点。
模式名称\ | 描述 | HEAD的位置 | 暂存区 | 工作区 |
soft | 回退到某一个版本,工作区不变,需手动 git checkout | 修改 | 不修改 | 不修改 |
mixed(默认) | 撤销暂存区状态,不影响工作区,需手动 git checkout | 修改 | 修改 | 不修改 |
hard | 重置未提交修改(工作区、暂存区) | 修改 | 修改 | 修改 |
穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。撤销提交revert
安全的撤销某一个提交记录,基本原理就是生产一个新的提交,用原提交的逆向操作来完成撤销操作。注意,这不同于
reset
,reset
是回退版本,revert只是用于撤销某一次历史提交,操作是比较安全的。如上图:
- 想撤销
v4
的修改,执行git revert v4
,会产生一个新的提交v-4
,是v4
的逆向操作。
- 同时更新
maser
、HEAD
“指针”位置,以及工作区内容。
- 如果已
push
则重新push
即可。
checkout/reset/revert总结
标题 \ 指令 | checkout | reset | revert |
主要作用(撤销) | 撤销工作区、暂存区未提交修改 | 回退版本,重置工作区、暂存区 | 撤销某一次提交 |
撤销工作区 | git checkout [file] | git reset HEAD [file] | ㅤ |
撤销工作区、暂存区 | git checkout HEAD [file] | git reset --hard HEAD [file] | ㅤ |
回退版本 | ㅤ | git reset --hard [commit] | ㅤ |
安全性 | 只针对未提交修改,安全 | 如回退了已 push 提交,不安全 | 安全 |
可看出
reset
完全可以替代checkout
来执行撤销、回退操作,reset
本来也是专门用来干这个事情的,可以抛弃checkout
了(撤销的时候)。工作中的Git实践
Git flow
Git flow(Git工作流程)是指软件项目中的一种Git分支管理模型,经过了大量的实践和优化,被认为是现代敏捷软件开发和DevOps(开发、技术运营和质量保障三者的交集)的最佳实践。Git flow主要流程及关键分支:原图地址-processon
✅主分支:master,稳定版本代码分支,对外可以随时编译发布的分支,不允许直接Push代码,只能请求合并(pull request),且只接受
hotfix
、release
分支的代码合并。✅热修复分支:hotfix,针对线上紧急问题、bug修复的代码分支,修复完后合并到主分支、开发分支。
- ① 切换到
hotfix
分支,从master
更新代码;
- ② 修复bug;
- ③ 合并代码到
dev
分支,在本地Git中操作即可;
- ④ 合并代码到
master
分支。
✅发版分支:release,版本发布分支,用于迭代版本发布。迭代开发完成后,合并
dev
代码到release
,在release
分支上编译发布版本,以及修改bug(定时同步bug修改到dev
分支)。测试完成后此版本可以作为发版使用,然后把稳定的代码push到master
分支,并打上版本标签。✅开发分支:dev,开发版本分支,针对迭代任务开发的分支,日常开发原则上都在此分支上面,迭代完成后合并到release分支,开发、发版两不误。
✅其他开发分支:dev-xxx,开发人员可以针对模块自己创建本地分支,开发完成后合并到dev开发分支,然后删除本地分支。
金屋藏娇stash
当你正在
dev
分支开发一个功能时,代码写了一半,突然有一个线上的bug急需要马上修改。dev
分支Bug没写完,不方便提交,就不能切换到主分支去修复线上bug。Git提供一个stash
功能,可以把当前工作区、暂存区 未提交的内容“隐藏”起来,就像什么都没发生一样。在上面示例中,有未提交修改,切换分支时报错。错误提示信息很明确了,
commit
提交或stash
隐藏:Please commit your changes or stash them before you switch branches.
📢 如果切换分支时,未提交修改的内容没有冲突,是可以成功切换的,未提交修改会被带过去。
指令 | 描述 |
git stash | 把未提交内容隐藏起来,包括未暂存、已暂存。 等以后恢复现场后继续工作 |
git stash list | 查看所有被隐藏的内容列表 |
git stash pop | 恢复被隐藏的内容,同时删除隐藏记录 |
git stash save "message" | 同 git stash ,可以备注说明message |
git stash apply | 恢复被隐藏的文件,但是隐藏记录不删除 |
git stash drop | 删除隐藏记录 |
🪧当然这里先提交到本地也是可以的,只是提交不是一个完整的功能代码,而是残缺的一部分,影响也不大。
拣选提交cherry-pick
当有一个紧急bug,在
dev
上修复完,我们需要把dev
上的这个bug修复所做的修改“复制”到master
分支,但不想把整个dev合并过去。为了方便操作,Git专门提供了一个cherry-pick
命令,让我们能复制一个特定的提交到当前分支,而不管这个提交在哪个分支。如上图,操作过程相当于将该提交导出为补丁文件,然后在当前
HEAD
上重放,形成无论内容还是提交说明都一致的提交。- 希望把
dev
分支上的v7
提交的内容合并到master
,但不需要其他的内容。
- 在
master
分支上执行指令git cherry-pick v7
,会产生一个新的v7'
提交,内容和v7
相同。
- 同时更新
master
、HEAD
,以及工作区。
引用作品
作者:安木夕链接:https://juejin.cn/post/7195030726096453690来源:稀土掘金
打赏
如果您觉得我的内容对你有所帮助,不要吝啬你的一键三连!如果你有能力的话也可以通过下面请我喝杯咖啡~金额您随意~如果对文章内容有任何疑问,欢迎加入群组联系我~
- 作者:Don Mark
- 链接:null/article/213a0f88-5dd1-4849-97ef-48673fec485a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。