一、Git 根底
1、Git 简介
Git 是一种分布式版本控制系统,由 Linux 之父 Linus 开发。
所谓分布式版本管理系统,就是在每一台机器上都有一个残缺的仓库。
2、Git 官网
Git 官网:git
在官网上能够获取 Git 的装置软件。
除此之外,还能够下载《progit》——这是最棒的 Git 学习材料,而且有中文版本。
3、Git 装置
从 https://git-scm.com/downloads
官网下载地址下载对应的操作系统版本一步步装置即可。
4、Git 根本配置
装置实现之后,在任意目录下,右键 Git Bash Here
全局配置邮箱和用户名(–global
示意全局配置,也能够不配置,每个仓库独自配置)
$ git config --global user.name "test"
$ git config --global user.email test@qq.com
5、Git 基本概念
5.1、Git 工作区域
Git 有四个工作区域:
- 工作区
简略说工作区就是咱们我的项目的目录。
- 仓库区 / 本地仓库
工作区有一个
.git
目录,其实这个不是工作区,是 Git 的版本库,存储了 Git 仓库的所有版本信息 - 暂存区
暂存区域是一个文件,保留了下次将提交的文件列表信息,个别在 Git 仓库目录中。有时候也被称作“索引”,
不过个别说法还是叫暂存区域。
-
近程仓库
对于分布式版本管理系统,近程仓库不是必须存在的,然而通常我的项目都会有近程仓库。例如
Github
就是咱们十分相熟的近程仓库。根本的 Git 工作流程如下:
- 在工作目录批改文件
- 暂存文件,将文件快照放入暂存区
- 提交更新,找到暂存区的文件,将快照永久性存储到到 Git 仓库区(本地)
- 将本地仓库的变更推送到近程仓库
以上几个区域的关系能够用下图示意:
5.2、Git 分支
分支是为了将批改记录的整个流程离开存储,让离开的分支不受其它分支的影响,所以在同一个数据库里能够同时进行多个不同的批改。
Git 为咱们主动创立的第一个分支,也叫主分支,个别其它分支开发实现后都要合并到 master
5.3、Git 文件状态
在 git 中,文件次要有四种状态:
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有退出到 git 库, 不参加版本控制. 通过
git add
状态变为Staged
. - Unmodify(Committed): 文件曾经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被批改, 而变为
Modified
. 如果应用git rm
移出版本库, 则成为Untracked
文件 - Modified: 文件已批改, 仅仅是批改, 并没有进行其余的操作. 这个文件也有两个去处, 通过
git add
可进入暂存staged
状态, 应用git checkout
则抛弃批改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 笼罩以后批改 - Staged: 暂存状态. 执行
git commit
则将批改同步到库中, 这时库中的文件和本地文件又变为统一, 文件为Unmodify
状态. 执行git reset HEAD filename
勾销暂存, 文件状态为Modified
二、Git 利用实际
看完下面的 Git 根底,你可能有一些蛊惑,接下来,咱们以理论工作中开发的流程来加深对 Git 的了解吧。
1、克隆我的项目
能够通过在工作区应用 git init
来初始化一个 Git 仓库,但通常开发中咱们不会这样做,因为理论的我的项目大部分曾经进行了局部开发,并进行了版本治理,所以咱们首先做的是从近程仓库克隆我的项目。
这里我从 Gitee(个别开发我的项目的近程仓库是部署在内网的 GitLab)fork
了一个开源我的项目,将这个我的项目作为近程仓库的我的项目:
点击 克隆下载
,能够看到我的项目的门路,
-
HTTPS
是凭据式的门路,应用此门路,向近程仓库推送代码的时候须要凭据(账号密码);这种形式向近程仓库提交,会要求账号密码,输出实现之后,Win10 操作系统能够抉择记住凭据,这样就不必每一次都输出了,Win10 操作系统治理凭据
控制面板 → 用户帐户 → 凭据管理器 → Windows 凭据
SSH
是秘钥式的门路,向近程仓库推送代码的时候,须要本地的私钥和近程仓库的公钥对应。SSH 配置能够参考 Windows 配置 Github、Gitee 共存的 Git 环境,这里就不具体开展解说。
我曾经进行了公私钥的配置,所以这里抉择 SSH。
应用 git clone
命令克隆我的项目
2、代码治理
我的项目曾经胜利克隆,接下来要进行咱们的开发了。
2.1、创立分支
通常开发不是在 Master
分支上,而是在开发分支上,应用 git branch develop
创立一个新分支:
能够通过 git branch
命令列出所有分支:
能够看到咱们新建的分支。
2.2、切换分支
应用 git checkout develop
命令切换到新建的 develop 分支:
2.3、增加文件到暂存区
接下来,咱们再 develop 分支上进行一些开发操作,我这里对 redeme 进行了一些批改,须要把批改增加到暂存区。
- 首先通过
git status
命令查看工作区文件状态 - 接下来应用
git add README.md
命令(能够应用git add .
增加所有批改)将更改增加到暂存区
能够看到文件曾经增加。
2.4、提交批改到仓库
接下来应用git commit -m "???? 批改了 redeme"
,将批改提交到仓库
这里值得一提的是,咱们的提交信息尽量遵循某种标准,例如在提交信息中体现本次提交的类型:
- feat:新性能
- fix : bug 修复
- docs : 文档变更
- style : 与款式相干的所有变动
- refactor : 既不是 bug 修复也未增加性能的代码更改
- test : 与测试无关所有变动
- chore : 扭转了构建工作,程序包管理器配置等
标准而准确的提交信息不仅能帮忙咱们的共事疾速理解咱们的提交,也对咱们本人的开发和重构有很大的帮忙。我喜爱用表情包标注提交类型,这样从近程仓库看提交记录比拟难看????
能够通过 git log
命令查看提交历史:
2.5、推送批改到近程仓库
能够应用 git push origin develop
命令将批改推送到近程仓库,在推送之前,通常通过git pull origin develop
(本实例近程仓库不存在 develop 分支,所以间接推送)命令来拉取近程仓库——这个是为了防止本地版本落后的状况,当然如果抵触你也能够强制提交,只是你的共事会做出什么过激行为不敢保障。????
在咱们的近程仓库就能够看到这次提交了:
2.6、合并分支
最终咱们的提交都是要合并到 master
分支的,首先切换到 master
分支,接着通过命令,git merge develop
命令,将 develop
分支合并到master
。
咱们这个分支是没有抵触的,可能在合并的过程中会呈现抵触的状况,能够通过 git status
查看抵触的文件,手动解决抵触。当然,能够借助一些开发工具来实现这个工作,下文再讲。
2.7、版本回退
如果说,咱们发现这次提交不是咱们想要的,能够通过 git reset --hard HEAD^
回退到上一次提交
2.8、打标签
如果咱们要公布一个版本,咱们通常会给这次提交打一个标签 git tag publish/0.0.1
能够通过 git tag
命令来查看咱们打的标签。
三、Git 常用命令
在下面有这样一张图片,基本上日常应用记住这 6 个命令就能够了,然而要想纯熟应用,可能就须要记住更多命令了,这里整顿了一些罕用的命令。
1、初始化仓库
# 在当前目录新建一个 Git 代码库
$ git init
# 新建一个目录,将其初始化为 Git 代码库
$ git init [project-name]
# 下载一个我的项目和它的整个代码历史
$ git clone [url]
2、配置
Git 的设置文件为.gitconfig,它能够在用户主目录下(全局配置),也能够在我的项目目录下(我的项目配置)。
# 显示以后的 Git 配置
$ git config --list
# 显示 Git 的某一项配置
$ git config <key>
# 编辑 Git 配置文件
$ git config -e [--global]
# 设置提交代码时的用户信息,抉择 global 即全局配置
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
3、减少 / 删除文件
这里的减少 / 删除文件指的是向暂存区减少 / 删除文件。
# 查看文件状态,查看当前工作区新增、更改或删除的文件
$ git status
# 增加指定文件到暂存区,能够增加多个文件,两头以空格隔开
$ git add [file1] [file2] ...
# 增加指定目录到暂存区,包含子目录
$ git add [dir]
# 增加当前目录的所有文件到暂存区
$ git add .
# 增加每个变动前,都会要求确认
# 对于同一个文件的多处变动,能够实现分次提交
$ git add -p
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 进行追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
# 长期保留批改,可跨分支
# save 为可选项
$ git stash [save message]
# 所有保留的记录列表
$ git stash list
# 复原工作进度到工作区,此命令的 stash@{num}是可选项,在多个工作进度中能够抉择复原,不带此项则默认复原最近的一次进度相当于 git stash pop stash@{0}
$ git stash pop [stash@{num}]
# 复原工作进度到工作区且该工作进度可反复复原,此命令的 stash@{num}是可选项,在多个工作进度中能够抉择复原,不带此项则默认复原最近的一次进度相当于 git stash apply stash@{0}
$ git stash apply [stash@{num}]
# 删除一条保留的工作进度,此命令的 stash@{num}是可选项,在多个工作进度中能够抉择删除,不带此项则默认删除最近的一次进度相当于 git stash drop stash@{0}
$ git stash drop stash@{num}
# 删除所有保留
$ git stash clear
4、代码提交
# 提交暂存区到仓库区,如果不加 -m,会进入 vim 编辑器
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次 commit 之后的变动,间接到仓库区
$ git commit -a
# 提交时显示所有 diff 信息
$ git commit -v
# 应用一次新的 commit,代替上一次提交
# 如果代码没有任何新变动,则用来改写上一次 commit 的提交信息
$ git commit --amend -m [message]
# 重做上一次 commit,并包含指定文件的新变动
$ git commit --amend [file1] [file2] ...
5、分支
# 列出所有本地分支
$ git branch
# 列出所有近程分支
$ git branch -r
# 列出所有本地分支和近程分支
$ git branch -a
# 新建一个分支,但仍然停留在以后分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定 commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的近程分支建设追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建设追踪关系,在现有分支与指定的近程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到以后分支
$ git merge [branch]
# 查看分支合并状态
$ git rerere status
# 显示合并抵触解决方案的以后状态——开始解决前与解决后的样子
$ git rerere diff
# 抉择一个 commit,合并进以后分支
$ git cherry-pick [commit]
#分支重命名
$ git git branch -m [oldName] [newName]
# 删除分支
$ git branch -d [branch-name]
# 删除近程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
6、标签
# 列出所有 tag
$ git tag
# 新建一个 tag 在以后 commit
$ git tag [tag]
# 新建一个 tag 在指定 commit
$ git tag [tag] [commit]
# 删除本地 tag
$ git tag -d [tag]
# 删除近程 tag
$ git push origin :refs/tags/[tagName]
# 查看 tag 信息
$ git show [tag]
# 提交指定 tag
$ git push [remote] [tag]
# 提交所有 tag
$ git push [remote] --tags
# 新建一个分支,指向某个 tag
$ git checkout -b [branch] [tag]
7、查看信息
# 显示有变更的文件
$ git status
# 显示以后分支的版本历史
$ git log
# 显示 commit 历史,以及每次 commit 产生变更的文件
$ git log --stat
# 搜寻提交历史,依据关键词
$ git log -S [keyword]
# 显示某个 commit 之后的所有变动,每个 commit 占据一行
$ git log [tag] HEAD --pretty=format:%s
# 显示某个 commit 之后的所有变动,其 "提交阐明" 必须合乎搜寻条件
$ git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包含文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 显示指定文件相干的每一次 diff
$ git log -p [file]
# 显示过来 5 次提交
$ git log -5 --pretty --oneline
# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn
# 显示指定文件是什么人在什么工夫批改过
$ git blame [file]
# 显示暂存区和工作区的差别
$ git diff
# 显示暂存区和上一个 commit 的差别
$ git diff --cached [file]
# 显示工作区与以后分支最新 commit 之间的差别
$ git diff HEAD
# 显示两次提交之间的差别
$ git diff [first-branch]...[second-branch]
# 显示明天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
# 显示某次提交的元数据和内容变动
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
# 显示以后分支的最近几次提交
$ git reflog
8、近程同步
# 克隆近程仓库
$ git clone [url]
# 下载近程仓库的所有变动
$ git fetch [remote]
# 显示所有近程仓库
$ git remote -v
# 显示某个近程仓库的信息
$ git remote show [remote]
# 减少一个新的近程仓库,并命名
$ git remote add [shortname] [url]
# 取回近程仓库的变动,并与本地分支合并
$ git pull [remote] [branch]
# 拉取近程分支,同时创立本地分支
$ git fetch [remote] 近程分支名 x: 本地分支名 x
# 拉取近程分支,同时创立本地分支,且切换到该分支
$ git checkout -b [branch] [origin/ 近程分支名]
# git pull 相当于以下两步
# 1、拉取近程分支
$ git fetch [remote] [branch]
# 2、合并到以后分支
git merge [remote/branch]
# 上传本地指定分支到近程仓库
$ git push [remote] [branch]
# 强行推送以后分支到近程仓库,即便有抵触
$ git push [remote] --force
# 推送所有分支到近程仓库
$ git push [remote] --all
# 更新近程分支列表
$ git remote update [remote] --prune
$ git remote update [remote] -p
# 删除和近程仓库的关联
$ git remote rm [remote]
9、撤销
# 复原暂存区的指定文件到工作区
$ git checkout [file]
# 复原某个 commit 的指定文件到暂存区和工作区
$ git checkout [commit] [file]
# 复原暂存区的所有文件到工作区
$ git checkout .
# 重置暂存区的指定文件,与上一次 commit 保持一致,但工作区不变
$ git reset [file]
# 重置暂存区与工作区,与上一次 commit 保持一致
$ git reset --hard
# 重置以后分支的指针为指定 commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 回退到上一次提交
$ git reset --hard HEAD^
# 重置以后分支的 HEAD 为指定 commit,同时重置暂存区和工作区,与指定 commit 统一
$ git reset --hard [commit]
# 重置以后 HEAD 为指定 commit,但放弃暂存区和工作区不变
$ git reset --keep [commit]
# 新建一个 commit,用来撤销指定 commit
# 后者的所有变动都将被前者对消,并且利用到以后分支
$ git revert [commit]
# 临时将未提交的变动移除,稍后再移入
$ git stash
$ git stash pop
四、在开发工具中应用 Git
在 Git 中一些操作例如 解决抵触
、 分支比拟
等等应用图形化的操作可能会更加方便快捷。
TortoiseGit 是一款不错的图形化 Git 工具,是一个不错的抉择,下载地址:https://tortoisegit.org/downl…
当然,应用开发工具集成 Git,也是一个不错的抉择。
1、在 IDEA 中应用 Git
IDEA 是以后最好用的 Java 开发 IDE,IDEA 默认集成了对 Git 的反对,只须要配置设置执行程序即可。
1.1、配置 Git
File
–>Settings
–>Version Control
–>Git
, 批改 Git 执行门路为本人装置的 Git 门路。
- 点击 Test,配置胜利会提醒 Git 版本信息
1.2、近程操作
Idea 中能够十分便捷的进行近程仓库相干的操作。
1.2.1、拉取代码
通过 Idea 能够间接拉取近程仓库的代码
File
–>New
—>Project From Version Controller
–>Git
- 填入近程仓库地址,抉择
Clone
这样近程仓库的代码就克隆到了本地。
1.2.2、拉取近程分支
下面咱们拉取的是近程仓库骨干代码,咱们也能够拉取近程分支代码。右下角,点开分支。
能够看到 Remote Branchs
, 上面就是近程仓库的分支。点击近程分支,Checkout As
, 就能够把近程分支拉到本地了。
1.2.3、更新代码
咱们在提交代码前最好先更新下近程仓库的代码到本地仓库,这样能够缩小不必要的抵触,更新 update 能够间接通过快捷键 Ctrl + T
,也能够通过工具栏上按键来实现:
1.2.4、提交 / 推送代码
在 IDEA 中开发好本人的代码之后如何提交到近程仓库呢?右键我的项目
–>Git
- 1.Commit Directory:commit 代码(将 stage 区的暂存文件提交到以后分支的本地仓库,并清空 stage 区),也能够 push 代码(把本地仓库的文件同步到近程仓库)。
-
- Commit 对应 Git 的 Commit 命令,commit 到本地仓库
-
- Commit and Push 也就是 Commit 和 push,咱们能够间接在这里 commit 到本地仓库之后,再 push 到近程仓库。
在 IDEA 中,咱们会看到文件被标识着不同色彩:红色,绿色,蓝色。它们别离代表什么意思呢?
- 红色:未被版本控制的文件,即未增加到版本控制的文件,例如咱们增加到 ignore 中的文件。
- 绿色:新退出版本的文件,即咱们新创建的文件,还未提交到近程仓库。
- 蓝色:批改过的文件,即近程仓库中已有该文件,咱们这次对它进行了批改,然而还未提交。
这里再接着看看几个按键的作用:
2.Add:把本地文件从工作目录增加到本地仓库的 stage 区,对应 Git 的 Add 命令。
3.Compare with Branch…:与近程分支比拟。咱们提交前能够通过此性能比拟下咱们工作目录中代码和近程分支代码的异同。
4.Show History:查看历史批改版本记录。
5.Revert:回滚,会将你的本地批改回滚。
6.Repository:各种仓库命令。
1.3、分支治理
1.3.1、新建分支
点击 New Branch 能够新建分支
1.3.2、分支切换 / 比拟 / 合并 / 重命名 / 删除
在 Idea 中这些性能的应用也常简略,点击分支,点击要操作的分支,就能够看到这些选项
1.4、查看提交历史
再 Version Controller
里log
能够查看提交历史
1.5、合并(解决抵触)
下面咱们提了分支合并,能够从本地分支合并,也能够从近程仓库合并,个别两个并行开发的分支合并都是会有抵触,Idea 中合并抵触是十分不便的。
- 在合并过程中产生了抵触,Idea 会提醒抵触,抉择
Merge
- Idea 提供了三个分栏,咱们能够点击箭头,很不便地解决抵触
- 如果合并时没有解决,也能够在
Version Controller
中解决
2、在 VS Code 中应用 Git
VS Code 是以后最风行的前端开发工具,VS Code 对 Git 的反对不是那么弱小,然而能够通过插件来加强 Git 性能。
2.1、根本应用
2.1.1、根本界面
我的 VS Code 配置了中文包。
点击左侧 Git 标识,能够看到很多的操作。
2.1.2、文件状态
当对文件进行批改后,有三种状态
- M 是 modify 的缩写即该文件存在批改
- D 是 delete 的缩写即该文件被删除了
- U 是 Update 的缩写即该文件是新增加
2.1.3、提交代码
文件按钮的的意思。
- 如果是新增加的文件,放弃批改就会提醒彻底删除文件。
- 如果是删除的文件,抉择放弃批改就会从仓库中复原文件 (再也不必放心误删的文件找不到了)
- 点击 + 号确认文件的批改就会提到 stash Changes 上
(对应 git add 命令)
确认了文件之后,在输入框输出这次更新的内容,而后点击打勾就能够保留这一次更新了 (对应 git commit 命令)
如果以后所有的 Changes 都要 commit,那能够间接输出上传的信息并且打勾就能够疾速 commit 了。
2.1.4、推送代码
实现提交当前,vscode 的左下角就会呈现上箭头的数字为 1 (上箭头是 push 的更新,下箭头是能够 pull 的更新)
当然如果之前没有 push 过代码的话,这个可能会没有数字显示。
这个时候就能够将代码推送到 近程仓库上了 (对应 git push 命令)
OK,近程仓库就能够看到咱们的提交了。
2.1.5、拉取代码
也能够通过 vscode 左下角的下箭头看到仓库是否能够 拉取,而后点击菜单的 git pull 进行仓库更新 (对应 git pull
命令)
2.1.5、分支切换
vscode 能够间接在左下角创立分支,也能够切换分支。
下面的性能满足了根本要求,如果还须要
代码比对
,解决抵触
,能够抉择插件,目前公认的最好用的插件是 GitLens。
2.2、应用 Git 插件
2.2.1、装置 GitLens
关上插件商店,搜寻 GitLens
, 装置即可。
2.2.2、GitLens 根本应用
装置实现之后侧边的工具栏会多出一个 git 分支图标,点击就能够查看更具体的信息了。
- 第一个折叠面板查看所有提交
- 第二个折叠面板查看以后关上文件的历史
- 第三个折叠面板查看分支
- 第四个折叠面板查看近程
- 第五个折叠面板查看 stash 的文件
- 第六个折叠面板查看标签
- 第七个折叠面板能够比拟不同的分支标签的文件区别
同时发现,每一行代码都会显示提交人和提交信息
2.2.3、查看更改
批改文件后,Gitlens 侧边会有色彩块通知你代码的更新状况:
- 红色箭头示意删除
- 蓝色块示意批改
- 绿色块示意削减
在右上角点击 查看更改
, 能够查看以后文件的更改。
2.2.4、解决抵触
VScode 内置的 git 会通知你有抵触的文件,而后通过 Gitlens 能够疾速调整抵触。
<big> 参考 </big>
【1】:Git 从入门到放不下
【2】:罕用 Git 命令整顿
【3】:Git 分支管理策略
【4】:vue-blog
【5】:《progit》
【6】:Windows 配置 Github、Gitee 共存的 Git 环境
【7】:VScode 联合 git 的全面应用流程(上)
【8】:VScode 联合 git 的全面应用流程(下)