Git是一种分布式版本控制系统,由Linux之父Linus开发。html
所谓分布式版本管理系统,就是在每一台机器上都有一个完整的仓库。前端
Git官网:gitvue
在官网上能够获取Git的安装软件。git
除此以外,还能够下载《progit》——这是最棒的Git学习资料,并且有中文版本。github
从 https://git-scm.com/downloads
官方下载地址下载对应的操做系统版本一步步安装便可。数据库
安装完成以后,在任意目录下,右键 Git Bash Here
vim
全局配置邮箱和用户名(–global
表示全局配置,也能够不配置,每一个仓库单独配置)segmentfault
$ git config --global user.name "test" $ git config --global user.email test@qq.com
Git有四个工做区域:bash
简单说工做区就是咱们项目的目录。app
工做区有一个.git
目录,其实这个不是工做区,是Git的版本库,存储了Git仓库的全部版本信息
暂存区域是一个文件,保存了下次将提交的文件列表信息,通常在 Git 仓库目录中。 有时候也被称做“索引”,
不过通常说法仍是叫暂存区域。
远程仓库
对于分布式版本管理系统,远程仓库不是必须存在的,可是一般项目都会有远程仓库。例如Github
就是咱们很是熟悉的远程仓库。
基本的Git工做流程以下:
以上几个区域的关系能够用下图表示:
分支是为了将修改记录的整个流程分开存储,让分开的分支不受其它分支的影响,因此在同一个数据库里能够同时进行多个不一样的修改。
Git 为咱们自动建立的第一个分支,也叫主分支,通常其它分支开发完成后都要合并到 master
在git中,文件主要有四种状态:
git add
状态变为Staged
.Modified
. 若是使用git rm
移出版本库, 则成为Untracked
文件git add
可进入暂存staged
状态, 使用git checkout
则丢弃修改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 覆盖当前修改git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify
状态. 执行git reset HEAD filename
取消暂存, 文件状态为Modified
看完上面的Git基础,你可能有一些迷惑,接下来,咱们以实际工做中开发的流程来加深对Git的理解吧。
能够经过在工做区使用git init
来初始化一个Git仓库,但一般开发中咱们不会这样作,由于实际的项目大部分已经进行了部分开发,并进行了版本管理,因此咱们首先作的是从远程仓库克隆项目。
这里我从Gitee(通常开发项目的远程仓库是部署在内网的GitLab) fork
了一个开源项目,将这个项目做为远程仓库的项目:
点击克隆下载
,能够看到项目的路径,
HTTPS
是凭据式的路径,使用此路径,向远程仓库推送代码的时候须要凭据(帐号密码);
这种方式向远程仓库提交,会要求帐号密码,输入完成以后,Win10操做系统能够选择记住凭据,这样就不用每一次都输入了,Win10操做系统管理凭据控制面板 → 用户账户 → 凭据管理器 → Windows凭据
SSH
是秘钥式的路径,向远程仓库推送代码的时候,须要本地的私钥和远程仓库的公钥对应。SSH配置能够参考 Windows配置Github、Gitee共存的Git环境,这里就不详细展开讲解。
我已经进行了公私钥的配置,因此这里选择SSH。
使用git clone
命令克隆项目
项目已经成功克隆,接下来要进行咱们的开发了。
一般开发不是在Master
分支上,而是在开发分支上,使用 git branch develop
建立一个新分支:
能够经过git branch
命令列出全部分支:
能够看到咱们新建的分支。
使用git checkout develop
命令切换到新建的develop分支:
接下来,咱们再develop分支上进行一些开发操做,我这里对 redeme 进行了一些修改,须要把修改添加到暂存区。
git status
命令查看工做区文件状态git add README.md
命令(可使用git add .
添加全部修改)将更改添加到暂存区能够看到文件已经添加。
接下来使用git commit -m "😀修改了redeme"
,将修改提交到仓库
这里值得一提的是,咱们的提交信息尽可能遵循某种规范,例如在提交信息中体现本次提交的类型:
- feat :新功能
- fix : bug修复
- docs :文档变动
- style :与样式相关的全部变更
- refactor :既不是bug修复也未添加功能的代码更改
- test :与测试有关全部变更
- chore :改变了构建任务,程序包管理器配置等
规范而精确的提交信息不只能帮助咱们的同事快速了解咱们的提交,也对咱们本身的开发和重构有很大的帮助。我喜欢用表情包标注提交类型,这样从远程仓库看提交记录比较好看😄
能够经过git log
命令查看提交历史:
可使用git push origin develop
命令将修改推送到远程仓库,在推送以前,一般经过git pull origin develop
(本实例远程仓库不存在develop分支,因此直接推送)命令来拉取远程仓库——这个是为了不本地版本落后的状况,固然若是冲突你也能够强制提交,只是你的同事会作出什么过激行为不敢保证。😂
在咱们的远程仓库就能够看到此次提交了:
最终咱们的提交都是要合并到master
分支的,首先切换到master
分支,接着经过命令,git merge develop
命令,将develop
分支合并到master
。
咱们这个分支是没有冲突的,可能在合并的过程当中会出现冲突的状况,能够经过 git status
查看冲突的文件,手动解决冲突。固然,能够借助一些开发工具来完成这个工做,下文再讲。
假如说,咱们发现此次提交不是咱们想要的,能够经过 git reset --hard HEAD^
回退到上一次提交
假如咱们要发布一个版本,咱们一般会给此次提交打一个标签 git tag publish/0.0.1
能够经过git tag
命令来查看咱们打的标签。
在上面有这样一张图片,基本上平常使用记住这6个命令就能够了,可是要想熟练使用,可能就须要记住更多命令了,这里整理了一些经常使用的命令。
# 在当前目录新建一个Git代码库 $ git init # 新建一个目录,将其初始化为Git代码库 $ git init [project-name] # 下载一个项目和它的整个代码历史 $ git clone [url]
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]"
这里的增长/删除文件指的是向暂存区增长/删除文件。
# 查看文件状态,查看当前工做区新增、更改或删除的文件 $ 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
# 提交暂存区到仓库区,若是不加-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] ...
# 列出全部本地分支 $ 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]
# 列出全部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]
# 显示有变动的文件 $ 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
# 克隆远程仓库 $ 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至关于如下两步 # 一、拉取远程分支 $ git fetch [remote] [branch] # 二、合并到当前分支 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]
# 恢复暂存区的指定文件到工做区 $ 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中一些操做例如解决冲突
、分支比较
等等使用图形化的操做可能会更加方便快捷。
TortoiseGit是一款不错的图形化Git工具,是一个不错的选择,下载地址:https://tortoisegit.org/downl...
固然,使用开发工具集成Git,也是一个不错的选择。
IDEA是当前最好用的Java开发IDE,IDEA默认集成了对Git的支持,只须要配置设置执行程序便可。
File
--> Settings
--> Version Control
--> Git
,修改Git执行路径为本身安装的Git路径。Idea中能够很是便捷的进行远程仓库相关的操做。
经过Idea能够直接拉取远程仓库的代码
File
--> New
---> Project From Version Controller
--> Git
Clone
这样远程仓库的代码就克隆到了本地。
上面咱们拉取的是远程仓库主干代码,咱们也能够拉取远程分支代码。右下角,点开分支。
能够看到 Remote Branchs
,下面就是远程仓库的分支。点击远程分支,Checkout As
,就能够把远程分支拉到本地了。
咱们在提交代码前最好先更新下远程仓库的代码到本地仓库,这样能够减小没必要要的冲突,更新update能够直接经过快捷键 Ctrl + T
,也能够经过工具栏上按键来实现:
在IDEA中开发好本身的代码以后如何提交到远程仓库呢?右键项目
-->Git
在IDEA中,咱们会看到文件被标识着不一样颜色:红色,绿色,蓝色。它们分别表明什么意思呢?
- 红色:未被版本控制的文件,即未添加到版本控制的文件,例如咱们添加到ignore中的文件。
- 绿色:新加入版本的文件,即咱们新建立的文件,还未提交到远程仓库。
- 蓝色:修改过的文件,即远程仓库中已有该文件,咱们此次对它进行了修改,可是还未提交。
这里再接着看看几个按键的做用:
2.Add:把本地文件从工做目录添加到本地仓库的stage区,对应Git的Add命令。
3.Compare with Branch…:与远程分支比较。咱们提交前能够经过此功能比较下咱们工做目录中代码和远程分支代码的异同。
4.Show History:查看历史修改版本记录。
5.Revert:回滚,会将你的本地修改回滚。
6.Repository:各类仓库命令。
点击New Branch能够新建分支
在Idea中这些功能的使用也常简单,点击分支,点击要操做的分支,就能够看到这些选项
再Version Controller
里log
能够查看提交历史
上面咱们提了分支合并,能够从本地分支合并,也能够从远程仓库合并,通常两个并行开发的分支合并都是会有冲突,Idea中合并冲突是很是方便的。
Merge
Version Controller
中处理VS Code是当前最流行的前端开发工具,VS Code对Git的支持不是那么强大,可是能够经过插件来加强Git功能。
个人VS Code配置了中文包。
点击左侧Git标识,能够看到不少的操做。
当对文件进行修改后,有三种状态
文件按钮的的意思。
(对应 git add 命令)
确认了文件以后,在输入框输入此次更新的内容,而后点击打勾就能够保存这一次更新了 (对应 git commit 命令)
若是当前全部的 Changes 都要 commit ,那能够直接输入上传的信息而且打勾就能够快速 commit 了。
完成提交之后,vscode 的左下角就会出现上箭头的数字为 1 (上箭头是 push 的更新,下箭头是能够 pull 的更新)
固然若是以前没有 push 过代码的话,这个可能会没有数字显示。
这个时候就能够将代码推送到 远程仓库上了 (对应 git push 命令)
OK,远程仓库就能够看到咱们的提交了。
也能够经过 vscode 左下角的下箭头看到仓库是否能够 拉取,而后点击菜单的 git pull 进行仓库更新 (对应 git pull
命令)
vscode 能够直接在左下角建立分支,也能够切换分支。
上面的功能知足了基本要求,若是还须要代码比对
,解决冲突
,能够选择插件,目前公认的最好用的插件是GitLens。
打开插件商店,搜索 GitLens
,安装便可。
安装完成以后侧边的工具栏会多出一个 git 分支图标,点击就能够查看更详细的信息了。
同时发现,每一行代码都会显示提交人和提交信息
修改文件后,Gitlens 侧边会有颜色块告诉你代码的更新状况:
在右上角点击查看更改
,能够查看当前文件的更改。
VScode 内置的 git 会告诉你有冲突的文件,而后经过 Gitlens 能够快速调整冲突。
<big>参考</big>
【1】:Git 从入门到放不下
【2】:经常使用Git命令整理
【3】:Git分支管理策略
【4】:vue-blog
【5】:《progit》