您当前的位置: 首页 >  git

蔚1

暂无认证

  • 0浏览

    0关注

    4753博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

收藏!工作中 Git 使用实践和常用命令流程合集

蔚1 发布时间:2020-05-12 23:32:01 ,浏览量:0

工作中 Git 是一项必不可少的技能,在项目的开发进程中起着至关重要的作用。下面介绍一些 Git 在工作中的一些使用实践、常用流程、常用命令,供大家参考!

在这里插入图片描述

工作中 git 是一项必不可少的技能,在项目的开发进程中起着至关重要的作用

下面介绍一些 git 在工作中的一些使用实践、常用流程、常用命令,供大家参考!

一:前言

Git 的定义是:分布式版本控制系统,用于项目开发中的版本控制。

从本质上来讲 Git 是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。

Git 的核心部分是一个简单的键值对数据库(key-value data store)。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。

git 管理的项目工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。

  • 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。

  • 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。

  • 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。

在进行提交操作时,Git 会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。

二:git 存储

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 status 后出现下述情况,说明还有已经的 commit 到本地仓库的还未被 push 到远程仓库

Git 作为一个系统,是以它的一般操作来管理并操纵(HEAD、index、Working Directory)三棵树的

  • HEAD: 是当前分支引用的指针,它总是指向该分支上的最后一次提交。这表示 HEAD 将是下一次提交的父结点。通常,理解 HEAD 的最简方式,就是将它看做 你的上一次提交的快照。

  • index: index 索引是你的 预期的下一次提交。我们也会将这个概念引用为 Git 的 “暂存区域”,这就是当你运行 git commit 时 Git 看起来的样子。Git 将上一次检出到工作目录中的所有文件填充到索引区,它们看起来就像最初被检出时的样子。之后你会将其中一些文件替换为新版本,接着通过 git commit 将它们转换为树来用作新的提交。

  • WorkingDirectory:最后,你就有了自己的工作目录。另外两棵树以一种高效但并不直观的方式,将它们的内容存储在 .git 文件夹中。工作目录会将它们解包为实际的文件以便编辑。

如下图:

在这里插入图片描述

三:git 提交规则

首先,有个问题需要确认一下,提交信息是使用中文还是英文呢?

如果你的项目是开源项目并且面向国际的开源项目,类似于阿里的 Druid\PingCAP 的 TiDB 等,那么一定要是用英文提交信息的!如果你的项目是公司内部使用或者只会被公司内部开发修改,那么中文也是不错的,更加便于查看和管理。当然,开发组中的英文能力都不错的话,用英文也是可以的。

分支 Branch 管理: 如果没有一个好的 branch 管理的话,可能会有下述图的情况,刺不刺激~在这里插入图片描述

推荐的分支管理:

  • master 分支为主分支(保护分支),禁止直接在 master 上进行修改代码和提交,此分支的代码可以随时被发布到线上;

  • develop 分支为测试分支或者叫做合并分支,所有开发完成需要提交测试的功能合并到该分支,该分支包含最新的更改;

  • feature 分支为开发分支,大家根据不同需求创建独立的功能分支,开发完成后合并到 develop 分支;

  • fix 分支为 bug 修复分支,需要根据实际情况对已发布的版本进行漏洞修复;

标签 Tag 管理:Tag 采用三段式:v 版本.里程碑.序号(v2.3.1)

  • 架构升级或架构重大调整,修改第 1 位

  • 新功能上线或者模块大的调整,修改第 2 位

  • bug 修复上线,修改第 3 位

当然,可以根据实际情况来设计,比如项目特别大,可以使用四段表达 Tag,项目比较小也可以使用二段式 Tag,只要符合场景并有实际意义即可 !

提交信息格式:下面只是提供一种建议格式,大家可以根据自己的项目实际情况来定格式,只要能把当前提交表达清楚,格式统一,方便快速阅读和定位即可!

1.建议中文示例:

  • (urllAnalyz) 添加解析 url 功能 l

  • (TestServiceImpl) 修改某功能的某个实现为另一个实现

  • (TestUnti) 修复 url 特殊情况下解析失败问题 (issue#12)

  • (getData) 重构获取数据的方法

  • (getDataTest) 添加(修改、删除)获取数据的单元测试代码

  • (doc)修改(添加、删除)文档

2.建议的英文示例:

  • feat:新功能(feature)

  • style:格式

  • fix:修补 bug

  • refactor:重构

  • test:测试相关

  • docs:文档(documentation)

3.格式(type:scope:body:issue) :(影响模块)提交描述信息(#issue?)

4.优点:

  • 与 github 数据 issue 关联,便于通过 issue 获取更多信息

  • commit 提交时,格式统一,便于后续快速准确定位提交

  • 可以更好的将此次提交表述清楚

四:Git 操作过程

4.1 初始化项目,并上传到 git 服务器

基本过程:创建远程仓库、初始化本地 git 仓库、将本地仓库与远程仓库关联起来、添加本地仓库想要提交的代码到本地 git 缓冲区,将本地仓库的本地分支与远程仓库的远程分支关联起来、提交代码

  1. 在 git 服务器上创建同名 git 项目,并获取 http 地址

  2. 本地 git 初始化项目 git 仓库,在项目目录下 git init

  3. 将本地 git 仓库和远程仓库关联起来,并设置远程仓库名称 git remote add

其中 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 提交某一分支的修改

  1. 查看当前分支的修改 git status

  2. 查看想要查看的文件的修改 git diff

  3. 确认正确后,提交修改到暂存区 git add-A 或者 git add

  4. 提交到本地仓库 git commit-m'提交信息'

  5. 提交到远程仓库 git push

4.3 拉取远程分支修改到本地分支

当远程分支别人推了一版新的代码时,我们想要将代码拉下来,可以采用两种方式 pull 和 fetch+merge:(他们的不同点文章上面已经解释)

使用 pull:

  1. 将远程分支最新代码更新合并到本地仓库区和工作区 git pull

使用 fetch:

  1. 将远程所有分支最新的 commitid 更新到 FETCHHEAD,记录远程分支最新的 commit_id 和 本地仓库区 git fetch

  2. 将最新的代码合并到工作区 git merge

4.4 取消 track 某一文件

  1. git rm-r--cache

untrack 后,使用 commit -a 时,不会将其添加到暂存区中

  1. 之后会在.ignore 文件中将该 untrack 的文件添加进去,完成

4.5 保存账号密码,避免每次 push 都要输入(简单方法)

  1. 确保在 git 中手动输入过账号和密码

  2. 输入下面语句即可 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` 恢复暂存之后不删除暂存

从 Git 栈中读取最新一次保存的内容,恢复工作区的相关内容。

git stash pop 恢复暂存之后删除暂存

从 Git 栈中读取最新一次保存的内容,恢复工作区的相关内容。之后 pop 会删除最新的暂存。

4\. 删除“暂存” `git stash drop`

从 Git 栈删除最旧的一个暂存

结束

4.7 将文件修改回退到某一状态

一些已经提交的或者已经修改的部分,想要再修改一下,或者删除已经提交的

a. 删除某些 commit,将 head 重定位到某一 commit(回溯到以前的版本) git reset--hard

注意!!!上述命令会将 commit_id 前的所有 commit 修改删除git reset

上述命令不会将 commit_id 前的 commit 删除,而是会将修改回退到本地工作区

git push origin HEAD--force 此步骤将服务器方也设置为相应的 commit

b. 将文件修改恢复到当前已提交分支的原样(未 git add 情况下) 撤销修改就回到和版本库一模一样的状态,即用版本库里的版本替换工作区的版本

git checkout--

c. 将文件修改恢复到当前已提交分支的原样(已经 git add 情况下)

git reset HEAD 将 add 退回

git checkout--

d. 将文件修改恢复到已提交分支的原样(已经 git commit 情况下)

git reset 此处 commitid 可以是任意分支的 commitid

git checkout--

4.8 版本的回溯与前进

有时候需要回溯或前进到以前的版本 或 回溯前进到以前的 commit

只要记住 commit_id 就可以在版本之间来回的穿梭,注意是可以“来回”穿梭哦

  1. 获取需要回溯到版本的 commitid git log --> 复制所需的版本 commitid

  2. 回退到该版本 git reset--hard

  3. 如果想让服务器也回退到该版本的话 git push origin HEAD--force

五:Git 常用命令

初始化项目为 git 项目

git init

clone 服务器代码到本地

git clone

添加修改文件到暂存区

git add

git add-A 添加所有修改文件到暂存区

提交修改到本地仓库

git commit-m'提交信息'

git commit-a-m'提交信息' 相当于 git add -A + git commit -m 的整合

提交本地仓库的修改到远程仓库

git push

将远程库的远程分支作为当前分支的上游分支

git push--set-upstream为远程仓库的别名,一般为 origin

查看文件本次的修改

git diff 显示本次所有被修改文件的修改

git diff 显示该文件本次的修改

查看当前分支下当前状态

git status 显示出被修改的文件和提交的次数等

查看提交历史

git log

git log--graph 查看分支合并图

merge 其他分支到当前分支

git merge

在 merge 过程如果出现冲突,在解决冲突后会产生一个新的 commit,并且 HEAD 指向该 commit 如果没有冲突,HEAD 会在分支的最新 commit 上

切换到上一个分支

git checkout-

切换到其他分支

git checkout

在某一分支基础上创建新分支

git checkout 切换到基础分支

git checkout-b 在当前分支基础上 创建新分支

显示分支

git branch 所有本地分支

git branch-r 所有远程分支

git branch-a 所有分支,本地和远程

删除本地分支

git branch-D

删除远程分支

git push origin--delete

添加一个新的远程仓库

git remote add

在同一个项目的 git url 中可以添加多个远程仓库 每个仓库相互隔离有自己的分支管理

将本地分支与远程仓库中分支联系起来

git push--set-upstream

以后本地的该分支的 push,会默认提交到设置的远程仓库中远程分支中

删除远程仓库 git remote rm

删除本地 tag git tag-d

删除远程 tag git push origin:refs/tags/

查看 tag 信息 git show

暂存当前修改 git stash

查看暂存列表 git stash lsit

恢复暂存的修改

git stash apply (恢复后不删除暂存)

git stash pop (恢复后删除暂存)

删除暂存 git stash drop

撤回已经 add 到暂存区的文件到本地工作区

git reset HEAD

git reset HEAD 回退所有 add

add 会被标识为 Changes to be committed,取消 add 后标识为 Changes not staged for commit(不等于 untrack)

取消 track 某一文件 git rm-r--cache

untrack 后,使用 commit -a 时,不会将其添加到暂存区中

只 merge 某一个分支上的某一个 commit git cherry-pick

撤销在本地工作区的文件的修改

撤销修改就回到和版本库一模一样的状态,即用版本库里的版本替换工作区的版本 git checkout--

删除某些 commit,将 head 重定位到某一 commit(回溯到以前的版本)

git reset--hard

git push origin HEAD--force 此步骤将服务器方也设置为相应的 commit

删除本地在远程服务器上不存在的分支 git remote prune origin

拉取远程分支到本地 git fetch origin

新建一个 tag 到指定 commit

git tag git tag 当前 commit

取消当前合并,重建合并前状态 git merge--abort

总结

本文介绍了 Git 是什么、Git 的存储结构、Git 的提交规则和一些工作中常会用到的 git 操作的过程,最后总结了常用的命令。Git 在工作中的团队开发中起着至关重要的作用,希望本篇文章可以对大家有些许帮助~

阅读全文: http://gitbook.cn/gitchat/activity/5eba0c19f451ce0640ea64b2

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

关注
打赏
1560489824
查看更多评论
立即登录/注册

微信扫码登录

0.0532s