文章目录

  • 一 Git概述
    • 1 Git简介
    • 2 GIt的职责
    • 3 Git的架构
      • (1)集中式版本控制系统
      • (2)分布式版本控制系统
    • 4 下载安装
  • 二 Git使用
    • 1 创建版本库
    • 2 配置签名
      • (1)方法一
      • (2)方法二
    • 3 提交项目
    • 4 修改版本
    • 5 撤销修改内容
    • 6 删除
  • 三 工作区、暂存区、版本库

一 Git概述

1 Git简介

Git是目前世界上最先进的分布式版本控制系统。

Git创始人 – 林纳斯·托瓦兹。

破解:国外一般称为逆向工程,有产品,没有其需要的技术与设计图纸,可以通过观察产品、运行状态等,将我们所需要的东西倒退出来,做一份自己的产品。

在Linus Torvalds开发出了Git分布式版本控制系统11年后,BitKeeper宣布在Apache 2.0许可证下开源。Linus 是在BitKeeper停止向开源社区提供免费版本后开发了Git,今天Git和其它自由软件版本控制系统已经统治了编程社区,BitKeeper变得无关紧要了。

BitKeeper由BitMover公司开发,该公司CEO Larry McVoy与Linus曾是好友, Larry说服Linus在内核开发中使用BitKeeper。而BitKeeper在免费使用的许可证中加入很多限制条件,惹恼了内核开发者,最终促使Linus开发出了毁灭BitMover的Git。

Git致力于开源组织的使用,用户比较分散,相对于其他的版本管理系统,其优点为分布式和审查机制。

2 GIt的职责

协同开发:类似于目前的共享文档。

冲突解决:一份文件多人修改,可以防止一人的代码被另一人覆盖,或者合并的过程中出现问题。

版本记录:想恢复之前写的代码,类似于虚拟机中的快照功能。

历史追查:每一次代码的更新,都被记录下来,由谁更新,出现问题可以追查到具体的人。

代码申请:自己手里保存一份,服务器上保存一份,甚至云上也有一份。

版本还原:基于版本记录,如果程序上线以后不理想,可以恢复到之前的版本,之后在有问题的版本上进行修改,测试等。

权限管理:谁可以看,谁可以写等问题。

代码审查:如果是背靠背式的开发,此功能可以不要。加入某人发现Spark中的源码写的不好,想要修改,修改后想要贡献给其他适用Spark的用户,这时需要审查提交的代码,审查通过后可以发布。用于互相不信任的人或者团队之间代码的提交。

3 Git的架构

(1)集中式版本控制系统

优点

  • SVN是集中式版本控制系统(CVS,SVN,VSS),版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。

缺点

  • 必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就非常麻烦了。

存在的问题

  • 版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?

    一般写一个脚本,从中央服务器每日全量备份,但全量备份量比较大,一般是在晚上备份,但如果在备份前丢失,就十分麻烦。

  • 程序员上传到服务器的代码要求是完整版本,但是程序员开发过程中想做小版本的管理,怎么解决?

    客户端不提供版本管理,自己手里想有一个小版本管理,需要在本地安装一个服务器端(Server),一个Server只对应一个客户端,所以需要准备两个客户端,一个上传到中央服务器,一个上传到自己的服务器,两台客户端之间的同步还需要自己管理。

  • 系统正在上线运行,时不时还要修改bug,要增加好几个功能要几个月,如何管理几个版本?

    分支管理,加入一个游戏内部的金币可以无限复制,不能等下一版本发布,需要立刻发布一个紧急版本,修复这个bug,这里的修复也不是真的去修改,修改完之后打成jar包,上线。

    这就带来一个问题,修改完成后的功能是否完备,所以需要分支管理,修bug走修bug的路线,开发新功能走新功能的路线。

  • 如何管理一个分布在世界各地、互不相识的大型开发团队?

    平台审查机制和分享机制。

Git解决了以上问题,代价就是,学习成本的上升,Git结构也更复杂一些。

(2)分布式版本控制系统

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

即使GitHub等网站因为某些原因不能登录了,代码也不会丢失,将自己本地的库向另一个网站上传一份,换一个网站即可,国内有Gitee,也有的公司在自己内部搭建一个Gitlab,与GitHub十分相似。对于中心服务器,对其依赖是非常弱的。

优点

  • 容灾能力强
  • 本地版本管理
  • 异地协作
  • 灵活分支

4 下载安装

下载地址:Git-2.23.0-64-bit.exe

下载地址:Git-2.23.0-64-bit.exe

安装时需要注意以下配置

选择Git命令的执行环境:推荐选择第一个,就是单独用户Git自己的命令行窗口。不推荐和windows的命令行窗口混用。

在”Configuring the line ending conversions”选项中,

  • 第一个选项:如果是跨平台项目,在windows系统安装
  • 第二个选项:如果是跨平台项目,在Unix系统安装
  • 第三个选项:非跨平台项目

苹果系统选择后面两个。

在“terminal emulator”选项中,

  • 第一个选项:使用专用的Git窗口(推荐)
  • 第二个选项:使用windows的cmd命令行窗口。

在”Configuring extra”选项中,默认开启文件缓存即可(推荐)

以上没有截图的选项,全部默认配置即可。

安装完之后,在桌面点击右键就会出现【Git Bash Here】

二 Git使用

1 创建版本库

创建如下目录结构

在git – java_pro 下右键 Git Bash Here

此时的命令全部都是linux中的命令

vim src/java_test.java
# 随便添加一些内容
# 初始化,生成一个空库,表现为隐藏文件.git,这个文件就是整个项目的库,存放如历史记录等
git init
# 查看状态
git status
# 显示如下内容
On branch master
No commits yet
Untracked files:(use "git add <file>..." to include in what will be committed)src/
nothing added to commit but untracked files present (use "git add" to track)
# 其中会发现src/标红,表示src目录下的所有文件都处于Untracked状态,说明下面的所有代码都没有进入库中

2 配置签名

(1)方法一

以后向库中提交代码,使用的就是接下来配置的签名

git config user.name "hzy"
git config user.email "hzy@hike.com"

代码未来会上传到一个平台,如github,gitee,gitlab,邮箱可以和这几个平台进行关联

以上配置的信息,可以在.git隐藏文件中的config中查看,后续想要修改也可以在这个文件中修改

(2)方法二

git config --global user.email "hzy@hike.com"
# --global 表示全局属性,所有的git项目都会共用属性

添加global的作用:一台电脑一般一个windows账户,会将设置的那个邮箱挂在windows账户上,也就是说,一般情况下,windows里面的账号,不管是参加到哪个公司的项目,还是自己创建的项目,都会用一个公用的签名,不用每个项目都单独注册

设置完成之后可以在 C盘 – 用户 – windows账户 – .gitconfig 文件中查看

如果项目的本地签名配置了,全局的签名也配置了,针对这个项目会使用本地的签名,就近原则

3 提交项目

建议一个一个文件的提交,防止提交上去一些无用的文件

git add src/java_test.javagit status

此时代码并没有入库,查看状态会发现,原来标红的位置变绿了,进入到一个名为“暂存区”的位置,可以理解为一个缓冲区。如kafka的producer,message交给producer,producer不会直接交给broker,积累到一定程度,会一次性提交。暂存区相当于producer的缓冲区。

git commit

正式提交,提交所有暂存区的内容,执行完成之后会弹出一个页面,为这次变更做一个说明,这时所有提交都需要做的事情。窗口为vim窗口,想要编辑先点击一下“i”键,输入“create 01”

git status
# 输出内容
On branch master
nothing to commit, working tree clean
# 查看提交的日志
git log
# 在文件中追加一些内容vim src/java_test.java
# 新建一个文件
vim pom.xmlgit status

此时会发现两个标红的文件,一个文件的状态为“modified:”,另一个文件的转态为“ pom.xml”

# 提交文件
git add src/java_test.java
git add pom.xml
git status
# 不进入界面,直接加注释
git commit -m "create/update02"
git log
# 再修改一次
vim src/java_test.java
git add src/java_test.java
git commit -m "update03"
# 查看简略日志信息
git log --pretty=oneline
# 显示信息
38f4c39cbf0eef05f300fc0e9d8c31303b2ea568 (HEAD -> master) update03
d2ec266c3ea20a5876e580ee704b2e6fa6583418 create/update02
dd4d823aa2bcde9c8e69e14b55ec3f263568bc5e create 01

前面的数字字母表示版本的唯一标识,master是一条分支,一般作为所有分支最核心、最重要的主分支,HEAD是一个指针,(HEAD -> master) update03表示目前最新的代码指向update03,如果别人下载此段代码,会下载03

4 修改版本

假如最新代码不稳定,需要提供上一个版本的代码,这时就需要将HEAD指针撤回一级

一次回退一个版本,一个^代表一个版本数量

git reset --hard HEAD^

回退n次操作 :git reset --hard HEAD~n

git reset --hard HEAD~1

恢复到最新版本

# 查看历史操作
git reflog
# 可以看到各个版本的唯一标识,通过唯一标识可以回到特定的版本
git reset --hard 38f4c39

留痕,所有的文件不会被删除,文件全部放在.git隐藏文件夹中

5 撤销修改内容

如果对原代码进行修改,出现了错误,可以进行撤销操作

git checkout src/java_test.java

6 删除

将不必要的文件上传到了仓库中,可以进行删除操作,此处的删除并不是物理删除,只是在这一版本之上新建一个不含有这个文件的变更的版本,也是可以恢复的,处处留痕

vim src/java_test.java.bak
git add src
git commit -m "update04"rm src/java_test.java.bak
git status
git add src/java_test.java.bak
git commit -m "bug fix"

三 工作区、暂存区、版本库

工作区(Working Directory):就是电脑本地硬盘目录

版本库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库

暂存区(stage) :一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

暂存区会保留最后一次上传的版本。

checkout针对某一个文件进行还原,reset针对整个版本进行还原

我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用“git add”把文件纳入Git管理,实际是把本地文件修改添加到暂存区;

第二步是用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支 。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以commit就是往master分支上提交更改。

可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。一旦提交完后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。即:nothing to commit (working directory clean)。

用“git diff HEAD – filename”命令可以查看工作区和暂存区里面最新版本的区别。

新建过撤销未add: git checkout – 文件名

撤销已add未commit:先git reset HEAD 文件名 再 git checkout – 文件名

撤销已add已commit:git reset --hard HEAD^

【Git】Git概述、Git安装和使用、工作区,暂存区和版本库相关推荐

  1. Git使用汇总之工作区、暂存区、版本库

    前言 初次接触git的时候最让人迷惑的无非是这三者的概念和他们之间的关系,搞懂这三个概念和他们之间的关系,可以说你对git了解已经三分熟了. 下面这个图展示了工作区.版本库中的暂存区和版本库之间的关系 ...

  2. Git 工作区、暂存区和版本库

    基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录 暂存区:英文叫stage, 或index.一般存放在 ".git目录下" 下的ind ...

  3. Git 的工作区、暂存区、版本库—— Git 学习笔记 15

    Git 的工作区.暂存区.版本库 大家都知道,在 Git 系统中有 "三棵树" 的概念. 注意:"树" 在这里的意思是 "文件集合",而不是 ...

  4. git中的工作区,暂存区,版本库

    git status  用于查看哪些文件被暂存了 红色:工作区与版本库之间对比 ,说明没有被暂存 git add .  (工作区的内容添加到暂存区) 黄绿色:暂存区和版本库,说明被暂存

  5. git 理解 节点、工作区、暂存区、版本库

    git树结构: git树结构每个节点都是一个commit的快照,它包含了三个重要概念:节点,HEAD指针,Branch指针 1.节点:git使用commit之后就会生成一个节点,之前的节点成为这个节点 ...

  6. Git学习笔记之三:Git 工作区、暂存区和版本库

    基本概念我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在 ".git目录下" 下的ind ...

  7. Git的学习之路02 Git的工作流程、工作区、暂存区、版本库及创建版本库

    Git的一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修改. 提交修改. 在修改完成后,如果发现错误,可以撤回提 ...

  8. 2.Git的工作区、暂存区和版本库(慕课网)

    先来理解下Git工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在".git目录下" 下的index文件(.gi ...

  9. 【原创】Git删除暂存区或版本库中的文件

    0 基础     我们知道Git有三大区(工作区.暂存区.版本库)以及几个状态(untracked.unstaged.uncommited),下面只是简述下Git的大概工作流程,详细的可以参见本博客的 ...

最新文章

  1. DEV开发之控件NavBarControl
  2. 用结构体实现一个电话本
  3. 自定义对话框控件bate2----20050516
  4. 计算机技术在农业上应用论文,浅谈计算机在农业中的应用论文(2)
  5. 十、 RDD编程和Spark SQL
  6. 485通信自动收发电路,历史上最详细的解释
  7. C++ Primer章课后编程问题
  8. jvm 加载class文件过程
  9. UI标签库专题一:JEECG智能开发平台 BaseTag(样式表和JS引入标签)
  10. 机器学习模型导出为PMML的方法
  11. fastjson JSONObject.toJSONString 出现 $ref: $.的解决办法(重复引用)
  12. 【numpy】生成一串0/1(True/False)mask序列
  13. linux命令音乐视频合并,Linux下基于命令行的音乐播放器 (1)
  14. loadrunner性能测试——第一步 录制脚本(中文版)
  15. 生产环境 Bug No1
  16. QoS令牌桶技术详解
  17. 使用命令强制关闭端口进程
  18. graphpad做单因素方差分析_手把手教你用Graphpad做单因素方差分析
  19. 朗文3000词汇表带音标_SBS朗文国际英语教程第二册单词表(带音标)
  20. 网盘背后的秘密(稍作修改)

热门文章

  1. RPC服务测试新思路
  2. Spring5学习(二):Spring 配置、依赖注入
  3. Centos挂载磁盘到旧目录
  4. 服务器文件怎么备份,何为文件备份服务器,文件备份服务器的使用方法及注意事项?...
  5. 租房有哪些安全注意事项
  6. geant4构造粒子_Geant4基础知识
  7. 《筱静观察》| 监管沙盒为金融科技带来发展空间
  8. 毕业设计 stm32智能语音识别系统设计与实现 - 单片机 嵌入式 物联网
  9. embed autopaly=false失效
  10. java 滚动小球_Java语言编写一个程序:在面板中多个小球浮动,碰到边缘则反弹,小球和小球想撞得话,其中一个就消失...