工做中git是一项必不可少的技能,在项目的开发进程中起着相当重要的做用git
下面介绍一些git在工做中的一些使用实践、经常使用流程、经常使用命令,供你们参考!github
Git的定义是:分布式版本控制系统,用于项目开发中的版本控制。数据库
从本质上来说 Git 是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。服务器
Git 的核心部分是一个简单的键值对数据库(key-value data store)。你能够向该数据库插入任意类型的内容,它会返回一个键值,经过该键值能够在任意时刻再次检索(retrieve)该内容。架构
git管理的项目工做目录下的每个文件都不外乎这两种状态:已跟踪或未跟踪。app
已跟踪的文件是指那些被归入了版本控制的文件,在上一次快照中有它们的记录,在工做一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。分布式
工做目录中除已跟踪文件之外的全部其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。ide
Git 保存的不是文件的变化或者差别,而是一系列不一样时刻的文件快照。单元测试
在进行提交操做时,Git 会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。但不只仅是这样,该提交对象还包含了做者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。测试
git将项目的存储分为4部分,每部分有本身做用,见下图:(图片来自:博客)
Workspace
:工做区(当前用户操做修改的区域)
Index/Stage
:暂存区 (add后的区域)
Repository
:仓库区或本地仓库(commit后的区域)
Remote
:远程仓库(push后的区域)总体过程能够简述为:
工做区--> add
-->暂存区--> commit
-->本地仓库区--> push
-->远程仓库区
远程仓库区--> fetch
-->使用refs\remotes下对应分支文件记录远程分支末端commit_id 和 本地仓库区 --> merge
-->工做区
pull
-->使用refs\remotes下对应分支文件记录远程分支末端commit_id and 本地仓库区 and 工做区git pull和git fetch有什么不一样呢?下面简单说一下
想要知道他们得不一样,咱们须要先了解两个概念
FETCH_HEAD
:能够看作是一个版本连接,记录在本地的refs\remotes下对应分支文件中,指向着目前已经从远程仓库取下来的分支的最新版本的commit_id。
commit-id
:在每次本地commit来保存当前工做到本地仓库区后, 会产生一个commit-id,这是一个能惟一标识一个版本的序列号。在使用git push后,这个序列号还会同步到远程仓库。因此他们之间的不一样在于:
git pull
直接将远程分支的修改更新到本地仓库区和本地工做区,咱们就能够在本地工做区中看到最新代码
git fetch
只将远程分支的修改拉取到本地仓库,并更新到FETCHHEAD,记录远程分支最新的commitid,不会更新本地工做区代码,只有使用了 git merge
才会将提交更新到本地仓库区和工做区其余想要了解更多git内部消息请移步个人另外一篇博文:git内部存储实现机制
在 git status中
的体现,见下图:
Changesto be committed
::表明被add的文件,被加载到了暂存区
Changesnotstagedforcommit
:表明在当前分支中被修改的文件,尚未被add,存储在工做区
Untrackedfiles
:表明不被git追踪的文件,能够理解为不被git管理的文件
若是没有Changes to be committed和Changes not staged for commit说明现阶段全部的修改已经被commit到本地仓库
Git 做为一个系统,是以它的通常操做来管理并操纵(HEAD、index、Working Directory)三棵树的
HEAD:
是当前分支引用的指针,它老是指向该分支上的最后一次提交。这表示 HEAD 将是下一次提交的父结点。一般,理解 HEAD 的最简方式,就是将它看作 你的上一次提交的快照。
index:
index索引是你的 预期的下一次提交。咱们也会将这个概念引用为 Git 的 “暂存区域”,这就是当你运行 git commit 时 Git 看起来的样子。Git 将上一次检出到工做目录中的全部文件填充到索引区,它们看起来就像最初被检出时的样子。以后你会将其中一些文件替换为新版本,接着经过 git commit 将它们转换为树来用做新的提交。
WorkingDirectory:
最后,你就有了本身的工做目录。另外两棵树以一种高效但并不直观的方式,将它们的内容存储在 .git 文件夹中。工做目录会将它们解包为实际的文件以便编辑。以下图:
首先,有个问题须要确认一下,提交信息是使用中文仍是英文呢?
若是你的项目是开源项目而且面向国际的开源项目,相似于阿里的Druid\PingCAP的TiDB等,那么必定要是用英文提交信息的!若是你的项目是公司内部使用或者只会被公司内部开发修改,那么中文也是不错的,更加便于查看和管理。固然,开发组中的英文能力都不错的话,用英文也是能够的。
分支Branch管理:若是没有一个好的branch管理的话,可能会有下述图的状况,刺不刺激~
推荐的分支管理:
master
分支为主分支(保护分支),禁止直接在master上进行修改代码和提交,此分支的代码能够随时被发布到线上;
develop
分支为测试分支或者叫作合并分支,全部开发完成须要提交测试的功能合并到该分支,该分支包含最新的更改;
feature
分支为开发分支,你们根据不一样需求建立独立的功能分支,开发完成后合并到develop分支;
fix
分支为bug修复分支,须要根据实际状况对已发布的版本进行漏洞修复;标签Tag管理:Tag采用三段式:v版本.里程碑.序号(v2.3.1)
架构升级或架构重大调整,修改第1位
新功能上线或者模块大的调整,修改第2位
固然,能够根据实际状况来设计,好比项目特别大,可使用四段表达Tag,项目比较小也可使用二段式Tag,只要符合场景并有实际意义便可 !
提交信息格式:下面只是提供一种建议格式,你们能够根据本身的项目实际状况来定格式,只要能把当前提交表达清楚,格式统一,方便快速阅读和定位便可!
1.建议中文示例:
<新功能>(urllAnalyz) 添加解析url功能l
<修改>(TestServiceImpl) 修改某功能的某个实现为另外一个实现
<重构>(getData) 重构获取数据的方法
<测试>(getDataTest) 添加(修改、删除)获取数据的单元测试代码
2.建议的英文示例:
feat:新功能(feature)
style:格式
fix:修补bug
refactor:重构
test:测试相关
3.格式(type:scope:body:issue) :<|新功能|修改|Bug修复|重构|测试>(影响模块)提交描述信息(#issue?)
4.优势:
与github数据issue关联,便于经过issue获取更多信息
commit 提交时,格式统一,便于后续快速准肯定位提交
4.1 初始化项目,并上传到git服务器
基本过程:建立远程仓库、初始化本地git仓库、将本地仓库与远程仓库关联起来、添加本地仓库想要提交的代码到本地git缓冲区,将本地仓库的本地分支与远程仓库的远程分支关联起来、提交代码
在git服务器上建立同名git项目,并获取http地址
本地git初始化项目git仓库,在项目目录下 git init
git remote add<name><http地址>
其中http地址为上述第一步获取的远程仓库的地址,name通常为origin,固然也能够设置其余的名字 例如:git remote add origin http://igit.corp.com/my/test.git
4. 添加项目文件到本地git缓冲区 git add-A
git commit-m
'初始化项目' 或者 git commit-a-m
'初始化项目'
5. 将本地分支关联远程分支并提交,git默认在远程分支上建立于本地分支同名的分支 git push--set-upstream origin master
这就是将本地的master分支 与 origin远程仓库关联起来并在远程仓库建立同名master分支,之后本地master都提交到远程仓库中的origin/master分支上。
upstream:上游的意思
至此,应该就能够了,咱们能够在git服务器上刷新看看是否提交上去了
4.2 提交某一分支的修改
查看当前分支的修改 git status
查看想要查看的文件的修改 git diff<file_name>
确认正确后,提交修改到暂存区 git add-A或者git add<file_name><file_name>
提交到本地仓库 git commit-m'提交信息'
git push
4.3 拉取远程分支修改到本地分支
当远程分支别人推了一版新的代码时,咱们想要将代码拉下来,能够采用两种方式pull 和 fetch+merge:(他们的不一样点文章上面已经解释)
使用pull:
git pull
使用fetch:
将远程全部分支最新的commitid更新到FETCHHEAD,记录远程分支最新的commit_id 和 本地仓库区 git fetch
git merge
4.4 取消track某一文件
git rm-r--cache<file_name>
untrack后,使用commit -a 时,不会将其添加到暂存区中
4.5 保存帐号密码,避免每次push都要输入(简单方法)
确保在git中手动输入过帐号和密码
git config--globalcredential.helper store
4.6 暂存本身的修改,便于接着工做(特别有用)
试想一个场景:若是你正在一个分支上工做修改,leader让你改另外的分支的BUG或者对其余的分支作一些操做。
咱们知道若是一个分支上有尚未commit的修改的话,不能够切换分支,可是又由于本身的工做还未完成,不想commit,此时 git stash
就起做用了。
你要把如今正在工做的分支保存下来,等处理完其余的再回来接着当前分支的修改工做。
1. 将当前分支的修改暂存起来(此处不等于add+commit) git stash
备份当前的工做区的内容,从最新的一次提交中读取相关内容,让工做区保证和上次提交的内容一致。同时,将当前的工做区修改的内容保存到Git栈中暂存起来。
2. 切换到别的分支工做,完成后切换回原来的工做分支,查看暂存列表 git stash list
显示Git栈内的全部备份,能够利用这个列表来决定从那个地方恢复
3. 恢复暂存的修改到工做区 git stash apply<stash_name>
恢复暂存以后不删除暂存
从Git栈中读取最新一次保存的内容,恢复工做区的相关内容。
git stash pop
恢复暂存以后删除暂存
从Git栈中读取最新一次保存的内容,恢复工做区的相关内容。以后pop会删除最新的暂存。
4. 删除“暂存” git stash drop<stash_name>
从Git栈删除最旧的一个暂存
结束
4.7 将文件修改回退到某一状态
一些已经提交的或者已经修改的部分,想要再修改一下,或者删除已经提交的
a. 删除某些commit,将head重定位到某一commit(回溯到之前的版本) git reset--hard<commit_id>
注意!!!上述命令会将commit_id前的全部commit修改删除git reset<commit_id>
上述命令不会将commit_id前的commit删除,而是会将修改回退到本地工做区
git push origin HEAD--force
此步骤将服务器方也设置为相应的commit
b. 将文件修改恢复到当前已提交分支的原样(未 git add 状况下) 撤销修改就回到和版本库如出一辙的状态,即用版本库里的版本替换工做区的版本
git checkout--<file_name>
c. 将文件修改恢复到当前已提交分支的原样(已经 git add 状况下)
git reset HEAD
将add退回
git checkout--<file_name>
d. 将文件修改恢复到已提交分支的原样(已经 git commit 状况下)
git reset<commit_id>
此处commit_id能够是任意分支的commit_id
git checkout--<file_name>
4.8 版本的回溯与前进
有时候须要回溯或前进到之前的版本 或 回溯前进到之前的commit
只要记住commit_id就能够在版本之间来回的穿梭,注意是能够“来回”穿梭哦
获取须要回溯到版本的commitid git log
--> 复制所需的版本commitid
回退到该版本 git reset--hard<commit_id>
git push origin HEAD--force
初始化项目为git项目
git init
clone服务器代码到本地
git clone<http_url>
添加修改文件到暂存区
git add<file_name>
git add-A
添加全部修改文件到暂存区
提交修改到本地仓库
git commit-m'提交信息'
git commit-a-m'提交信息'
至关于git add -A + git commit -m 的整合
提交本地仓库的修改到远程仓库
git push
将远程库<remote_name style="margin: 0px; padding: 0px; box-sizing: border-box;">的远程分支<branch_name style="margin: 0px; padding: 0px; box-sizing: border-box;">做为当前分支的上游分支</branch_name></remote_name>
git push--set-upstream<remote_name><branch_name>
<remote_name style="margin: 0px; padding: 0px; box-sizing: border-box;">为远程仓库的别名,通常为origin</remote_name>
查看文件本次的修改
git diff
显示本次全部被修改文件的修改
git diff<file_name>
显示该文件本次的修改
查看当前分支下当前状态
git status
显示出被修改的文件和提交的次数等
查看提交历史
git log
git log--graph
查看分支合并图
merge其余分支到当前分支
git merge<branch_name>
在merge过程若是出现冲突,在解决冲突后会产生一个新的commit,而且HEAD指向该commit 若是没有冲突,HEAD会在分支的最新commit上
切换到上一个分支
git checkout-
切换到其余分支
git checkout<branch_name>
在某一分支基础上建立新分支
git checkout<branch_name>
切换到基础分支
git checkout-b<new_branch_name>
在当前分支基础上 建立新分支
显示分支
git branch
全部本地分支
git branch-r
全部远程分支
git branch-a
全部分支,本地和远程
删除本地分支
git branch-D<branch-name>
删除远程分支
git push origin--delete<branch-name>
添加一个新的远程仓库
git remote add<shortname><url>
在同一个项目的git url中能够添加多个远程仓库 每一个仓库相互隔离有本身的分支管理
将本地分支与远程仓库中分支联系起来
git push--set-upstream<远程仓库名称><远程仓库中分支名称>
之后本地的该分支的push,会默认提交到设置的远程仓库中远程分支中
删除远程仓库 git remote rm<远程仓库name>
删除本地tag git tag-d<tag_name>
删除远程tag git push origin:refs/tags/<tag_name>
查看tag信息 git show<tag_name>
暂存当前修改 git stash
查看暂存列表 git stash lsit
恢复暂存的修改
git stash apply
(恢复后不删除暂存)
git stash pop
(恢复后删除暂存)
删除暂存 git stash drop
撤回已经add到暂存区的文件到本地工做区
git reset HEAD<file_name>
git reset HEAD
回退全部add
add会被标识为Changes to be committed,取消add后标识为Changes not staged for commit(不等于untrack)
取消track某一文件 git rm-r--cache<file_name>
untrack后,使用commit -a 时,不会将其添加到暂存区中
只merge某一个分支上的某一个commit git cherry-pick<被merge分支中的某一个commit的commit-id>
撤销在本地工做区的文件的修改
撤销修改就回到和版本库如出一辙的状态,即用版本库里的版本替换工做区的版本 git checkout--<file_name>
删除某些commit,将head重定位到某一commit(回溯到之前的版本)
git reset--hard<commit_id>
git push origin HEAD--force
此步骤将服务器方也设置为相应的commit
删除本地在远程服务器上不存在的分支 git remote prune origin
拉取远程分支到本地 git fetch origin<branch_name>
新建一个tag到指定commit
git tag<tag_name><commit_id>
git tag<tag_name>
当前commit
取消当前合并,重建合并前状态 git merge--abort
本文介绍了Git是什么、Git的存储结构、Git的提交规则和一些工做中常会用到的git操做的过程,最后总结了经常使用的命令。Git在工做中的团队开发中起着相当重要的做用,但愿本篇文章能够对你们有些许帮助~
更多技术文章,欢迎关注博主!