Git分布式版本控制工具

1、目标

了解Git基本概念

能够概述git工作流程

能够使用Git常用命令

熟悉Git代码托管服务

能够使用idea操作git

2、概述

2.1、开发中的实际场景

场景一:备份

        小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月 来的努力付之东流

场景二:代码还原

        这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的 代码已经回不到从前了。什么地方能买到哆啦A梦的时光机啊?

场景三:协同开发

        小刚和小强先后从文件服务器上下载了同一个文件:Analysis.java。小刚在Analysis.java 文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;小强在Analysis.java文件中的 第50行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记 忆中了

场景四:追溯问题代码的编写人和编写时间!

        老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这 次来说吧,有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘 流和正经牛都不承认是自己干的!

2.2、版本控制器的方式

a、集中式版本控制工具

        集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代 码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。

         举例:SVN和CVS

b、分布式版本控制工具

        分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无 需要联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的 修改了。

        举例:Git

2.3、SVN

2.4、Git

Git是分布式的,Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个 中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以 把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不 过“交换”修改不方便而已。

git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众 多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002 年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代 码。

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订 了若干目标:

速度

简单的设计

对非线性开发模式的强力支持(允许成千上万个并行开发的分支)

完全分布式

有能力高效管理类似 Linux内核一样的超大规模项目(速度和数据量)

2.5、Git工作流程图

命令如下:

1. clone(克隆): 从远程仓库中克隆代码到本地仓库

2. checkout (检出):从本地仓库中检出一个仓库分支然后进行修订

3. add(添加): 在提交前先将代码提交到暂存区

4. commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本

5. fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。

6. pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于 fetch+merge 7. push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库

3、Git安装与常用命令

本教程里的git命令例子都是在Git Bash中演示的,会用到一些基本的linux命令,在此为大家提前列举:

ls/ll 查看当前目录

cat 查看文件内容

touch 创建文件

vi vi编辑器(使用vi编辑器是为了方便展示效果,学员可以记事本、editPlus、notPad++等其它编 辑器)

3.1、 Git环境配置

3.1.1 下载与安装

下载地址: https://git-scm.com/download

下载完成后可以得到如下安装文件:

双击下载的安装文件来安装Git。安装完成后在电脑桌面(也可以是其他目录)点击右键,如果能够看 到如下两个菜单则说明Git安装成功。

备注:

Git GUI:Git提供的图形界面工具

Git Bash:Git提供的命令行工具

当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用 该用户信息

3.1.2基本配置

1. 打开Git Bash

2. 设置用户信息

git config --global user.name “itcast”

git config --global user.email “hello@itcast.cn”

查看配置信息

git config --global user.name

git config --global user.email

3.1.3 为常用指令配置别名(可选)

有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。

1. 打开用户目录,创建 .bashrc 文件 部分windows系统不允许用户创建点号开头的文件,可以打开gitBash,执行 touch ~/.bashrc

2. 在 .bashrc 文件中输入如下内容:

#用于输出git提交日志

alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'

#用于输出当前目录所有文件及基本信息

alias ll='ls -al'

3. 打开gitBash,执行 source ~/.bashrc

3.1.4 解决GitBash乱码问题

1. 打开GitBash执行下面命令

git config --global core.quotepath false

2. ${git_home}/etc/bash.bashrc 文件最后加入下面两行

export LANG="zh_CN.UTF-8"

export LC_ALL="zh_CN.UTF-8"

3.2、获取本地仓库

要使用Git对我们的代码进行版本控制,首先需要获得本地仓库

1)在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库

2)进入这个目录中,点击右键打开Git bash窗口

3)执行命令git init

4)如果创建成功后可在文件夹下看到隐藏的.git目录。

3.3、基础操作指令

Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git 的命令而发生变化。

本章节主要讲解如何使用命令来控制这些状态之间的转换:

1. git add (工作区 --> 暂存区)

2. git commit (暂存区 --> 本地仓库)

3.3.1、*查看修改的状态(status)

作用:查看的修改的状态(暂存区、工作区)

命令形式:git status

3.3.2、*添加工作区到暂存区(add)

作用:添加工作区一个或多个文件的修改到暂存区

命令形式:git add 单个文件名|通配符

        将所有修改加入暂存区:git add .

3.3.3、*提交暂存区到本地仓库(commit)

作用:提交暂存区内容到本地仓库的当前分支

命令形式:git commit -m '注释内容'

3.3.4、*查看提交日志(log)

在3.1.3中配置的别名 git-log 就包含了这些参数,所以后续可以直接使用指令 git-log

作用:查看提交记录

命令形式:git log [option]

options

        --all 显示所有分支

        --pretty=oneline 将提交信息显示为一行

        --abbrev-commit 使得输出的commitId更简短

        --graph 以图的形式显示

3.3.5、版本回退

作用:版本切换

命令形式:git reset --hard

        commitID commitID 可以使用 git-log 或 git log 指令查看

 如何查看已经删除的记录?

        git reflog

        这个指令可以看到已经删除的提交记录

3.3.6、添加文件至忽略列表

一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动 生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录 中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:

# no .a files

*.a

# but do track lib.a, even though you're ignoring .a files above !

lib.a

# only ignore the TODO file in the current directory, not subdir/TODO

/TODO

# ignore all files in the build/ directory

build/

# ignore doc/notes.txt, but not doc/server/arch.txt

doc/*.txt

# ignore all .pdf files in the doc/ directory

doc/**/*.pdf

练习:基础操作

#####################仓库初始化######################

# 创建目录(git_test01)并在目录下打开gitbash

# 初始化git仓库

git init

#####################创建文件并提交#####################

# 目录下创建文件 file01.txt

# 将修改加入暂存区

git add .

# 将修改提交到本地仓库,提交记录内容为:commit 001

git commit -m 'commit 001'

# 查看日志

git log

####################修改文件并提交######################

# 修改file01的内容为:count=1

# 将修改加入暂存区

git add .

# # 将修改提交到本地仓库,提交记录内容为:update file01

git commit --m 'update file01'

# 查看日志

git log

# 以精简的方式显示提交记录

git-log

####################将最后一次修改还原##################

# 查看提交记录

git-log

# 找到倒数第2次提交的commitID

# 版本回退

git reset commitID --hard

3.4、分支

        几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能,以免影响开发主线。

3.4.1、查看本地分支

        命令:git branch

3.4.2、创建本地分支

        命令:git branch 分支名

3.4.4、*切换分支(checkout)

        命令:git checkout 分支名

我们还可以直接切换到一个不存在的分支(创建并切换)

        命令:git checkout -b 分支名

3.4.6、*合并分支(merge)

一个分支上的提交可以合并到另一个分支

        命令:git merge 分支名称

3.4.7、删除分支

不能删除当前分支,只能删除其他分支

git branch -d b1 删除分支时,需要做各种检查

git branch -D b1 不做任何检查,强制删除

3.4.8、解决冲突

当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解 决冲突,解决冲突步骤如下

1. 处理文件中冲突的地方

2. 将解决完冲突的文件加入暂存区(add)

3. 提交到仓库(commit) 冲突部分的内容处理如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354689.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法基础课-数据结构

单链表 题目链接:826. 单链表 - AcWing题库 思路:AcWing 826. 单链表---图解 - AcWing 需要注意的点在于理解ne[idx] head,idx表示当前的点,意思是将当前的点链到头结点的后面,再将头结点链在当前idx的前面。 #inc…

2024-01-24-redis4

秒杀活动 需求:库存中有10件商品 商品的信息自定义 同时有100个人去抢购(这里100个人的抢购由jmeter来模拟) jmeter的使用 在idea中将后台代码实现 package org.aaa.controller;import org.apache.commons.lang3.StringUtils; import org.sp…

goland课程管理(6)

项目目录结构如下图所示: core包下面: class.go package coreimport "github.com/gin-gonic/gin"func Class1(ctx *gin.Context) {}course.go package coreimport (. "cookie/database". "cookie/model""fmt"…

服务端开发小记02——Maven

这里写目录标题 Maven简介Maven在Linux下的安装Maven常用命令 Maven简介 Apache Maven Project是一个apache的开源项目,是用于构建和管理Java项目的工具包。 用Maven可以方便地创建项目,基于archetype可以创建多种类型的java项目;Maven仓库…

华为三层交换机与防火墙对接配置上网示例

三层交换机与防火墙对接上网配置示例 组网图形 图1 三层交换机与防火墙对接上网组网图 三层交换机简介配置注意事项组网需求配置思路操作步骤配置文件 三层交换机简介 三层交换机是具有路由功能的交换机,由于路由属于OSI模型中第三层网络层的功能,所以…

VMware 虚拟机环境下的ubuntu 上安装mysql,并能远程访问数据库

需求:为了实现在linux上模拟服务器跑代码,并存储在mysql上,通过远程可视化mysql数据库软件查看linux上mysql数据库数据的实时动态。 1. 虚拟机和ubuntu的安装 这里我选择的是VMware workstation-v14, ubuntu-18.04.1。至于体流程网上很多&a…

基于Java的高校运动会管理系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的 系统功能测试 系统测试结论 代码参考 数据库参考 源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、…

Django ORM 框架中的表关系,你真的弄懂了吗?

Django ORM 框架中的表关系 前言 Django ORM 框架中的表关系 为了说清楚问题,我们设计一个 crm 系统,包含五张表: 1.tb_student 学生表 2.tb_student_detail 学生详情表 3.tb_salesman 课程顾问表 4.tb_course 课程表 5.tb_entry 报名表…

Vue2.0+Element实现日历组件

(壹)博主介绍 🌠个人博客: 尔滨三皮⌛程序寄语:木秀于林,风必摧之;行高于人,众必非之。 (贰)文章内容 1、安装依赖 npm install moment2.29.4 --savenpm install lunar0.0.3 --savenpm install lunar-java…

C语言数据结构——链表

(图像由AI生成) 0.前言 在计算机科学中,数据结构是存储和组织数据的一种方式,它不仅影响数据的存储,也影响数据的检索和更新效率。C语言,作为一种经典的编程语言,提供了灵活的方式来处理数据…

OkHttp完全解读

一,概述 OkHttp作为android非常流行的网络框架,笔者认为有必要剖析此框架实现原理,抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用,如桥接、缓存、连接复用等,本文笔者将从使用出发,解读源码&am…

iOS 文件分割保存加密

demo只是验证想法,没有做很多异常处理 默认文件是大于1KB的,对于小于1KB的没有做异常处理demo中文件只能分割成2个,可以做成可配置的N个文件分割拼接还可以使用固定的二进制数据,拼接文件开头或结尾 不论哪种拼法,目的…

牛客周赛30

思路:先把x, y除以最大公约数变成最小值,然后同时乘以倍数cnt,只记录两个数都在[l,r]间的倍数。 代码: int gcd(int a,int b){return b ? gcd(b, a % b) : a; }void solve(){int x, y, l, r;cin >> x >> y >>…

两两交换链表中的结点---链表OJ

https://leetcode.cn/problems/swap-nodes-in-pairs/description/?envType=study-plan-v2&envId=top-100-liked 1、递归 创建newhead = head->next,然后将head->next->next作为递归参数,返回值用head->next接收;递归结束条件是:没有结点或者只有一…

Python代码耗时统计

time模块 在代码执行前后各记录一个时间点,两个时间戳相减即程序运行耗时。这种方式虽然简单,但使用起来比较麻烦。 time.time() 函数返回的时间是相对于1970年1月1日的秒数 import timestart time.time() time.sleep(1) end time.time() print(f&…

洛谷 P2150 [NOI2015] 寿司晚宴

P2150 [NOI2015] 寿司晚宴 约定: n ≤ 500 n \leq 500 n≤500 题意 给定 2 → n 2 \rightarrow n 2→n 共 n − 1 n-1 n−1 个数字,现在两个人想分别取一些数字(不一定全取完),如果他们两人取的数字中存在&#xf…

05. java线程基础

05. java线程基础 01. 线程相关概念 1. 程序 ​ 是为完成特定任务、用某种语言编写的一组指令的集合。简单来说:就是我们写的代码 2. 进程 进程是指运行中的程序,比如我们使用微信,就启动了一个进程,操作系统会为该进程分配内…

【代码随想录】LC 242. 有效的字母异位词

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。 一、题目 1、原题链接 242. 有效的字母异位词 2、题目描述 二、解题…

一文理清楚-Docker 容器如何工作

Docker 容器如何工作 集装箱什么是虚拟机?虚拟化如何运作?什么是容器?什么是 Docker?总结 五星上将麦克阿瑟曾经说过:在docker面前,虚拟机就是个弟弟 集装箱 《盒子:集装箱如何让世界变得更小&…

剑指offer——删除链表的节点

题目描述&#xff1a;给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。 数据范围&#xff1a; 0 <链表节点值 < 10000 0 <链表长度 < 10000 示例1&#xff1a; 输入&#xff1a;{2,5,1,9}&#xff…