cvs和svn都是集中式版本控制系统,而git是分布式版本控制系统。
1、集中式版本控制系统必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,呵呵。分布式版本控制系统可以不连网工作, 因为版本库就在你自己的电脑上。
2、集中式版本控制系统如果中央服务器挂了,就完蛋了。分布式版本控制系统可以没有中央服务器,每个人的电脑上都是一个完整的版本库,可靠性高。分布式版本控制系统也可以有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

git

git的安装

官网: https://git-scm.com/

[root@vm1 ~]# yum install git -y
[root@vm1 ~]# git --version
git version 1.8.3.1
[root@vm1 ~]# git --help    查看参数帮助
git的操作可以说只需要git一条命令加参数即可

git应用

git身份设置

因为git是分布式版本控制系统,不同的人提交代码需要区分,所以每个人都要设置一个身份标识。如果不设置的话谁会知道你这个开发者是张三,李四,还是王五呢?

[root@vm1 ~]# git config --global user.name "daniel"
[root@vm1 ~]# git config --global user.email "daniel@itcast.cn"
[root@vm1 ~]# git config --global color.ui true[root@vm1 ~]# git config --list
user.name=daniel
user.email=daniel@itcast.cn
color.ui=true
创建本地仓库

工作目录(working directory): 也可叫工作区,是存放项目代码文件的一个目录。
仓库(repository) : 也可叫版本库,在git init命令初始化工作目录后会产生一个隐藏的子目录.git, 可以将其理解为git的仓库或版本库。
仓库分为本地仓库与远程仓库。
在这里插入图片描述
在这里插入图片描述
创建本地仓库的步骤:

1. 创建工作目录[root@vm1 ~]# mkdir GitTest
2. 在对应的工作目录中创建本地仓库[root@vm1 ~]# cd GitTest/[root@vm1 GitTest]# git initInitialized empty Git repository in /root/GitTest/.git/会产生一个.git子目录,所有除代码数据外的相关数据都在此目录,不要修改它(它就是仓库或叫版本库)[root@vm1 GitTest]# ls .git/branches  config  description  HEAD  hooks  info  objects  refs

mkdir创建一个工作目录, 然后cd进去, 使用git init就创建好了本地仓库。开发者就可以在工作目录里开发项目代码文件了。

暂存区

暂存区(stage或index): 也有叫缓存区,暂存区就看作是一个缓区区域,临时保存你的改动。
如果在工作目录创建了一个新文件,需要将新文件添加到暂存区。
添加文件到暂存区:

1, 准备一个文件[root@vm1 GitTest]# cat 1.py print("hello world")
2, 使用git add命令提交到暂存区(git rm --cached 1.py从暂存区移除但保留在工作目录中)[root@vm1 GitTest]# git add 1.py
3, 提交第一个文件后,版本库.git子目录里就多了一个index[root@vm1 GitTest]# ls .git/branches  config  description  HEAD  hooks  index  info  objects  refs
4, 使用strings命令查看可以看到git add的文件列表[root@vm2 GitTest]# strings .git/index DIRC1.py				这里可以看到1.py文件添加到了index文件里了
git版本控制

提交文件(第1个版本)
代码文件需要commit提交后才能纳入版本控制。

1, 可以使用git status查看工作目录里有哪些文件需要提交[root@vm1 GitTest]# git status# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##	new file:   1.py#
2, 使用git commit提交; -m 后接提交的说明信息[root@vm1 GitTest]# git commit -m "提交1.py"[master (root-commit) 4e67190] 提交1.py1 file changed, 1 insertion(+)create mode 100644 1.py
3, 再次git status查看状态,没有需要提交的文件了[root@vm1 GitTest]# git status# On branch masternothing to commit, working directory clean

在这里插入图片描述
修改再提交(第2个版本)

1, 修改1.py文件,我这里加了一句print("hello python")[root@vm1 GitTest]# cat 1.pyprint("hello world")print("hello python")
2, 使用git status查看,信息告诉我们1.py被修改了[root@vm1 GitTest]# git status# On branch master# Changes not staged for commit:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##	modified:   1.py#no changes added to commit (use "git add" and/or "git commit -a")
3, 使用git diff查看修改了什么[root@vm1 GitTest]# git diff 1.pydiff --git a/1.py b/1.pyindex 8cde782..5da7641 100644--- a/1.py+++ b/1.py@@ -1 +1,2 @@print("hello world")+print("hello python")
4, 提交修改(add+commit)[root@vm1 GitTest]# git add 1.py[root@vm1 GitTest]# git commit -m "添加了一行代码打印hello python"[master 0e9371b] 添加了一行代码打印hello python1 file changed, 1 insertion(+)

在这里插入图片描述
再修改再提交(第3个版本)

再增加一句代码print("hello linux")
[root@vm1 GitTest]# cat 1.py
print("hello world")
print("hello python")
print("hello linux")[root@vm1 GitTest]# git add 1.py[root@vm1 GitTest]# git commit -m "添加了一行代码打印hello linux"
[master b679b01] 添加了一行代码打印hello linux1 file changed, 1 insertion(+)
  • 工作目录中写好的代码文件需要先git add 文件名添加到暂存区,再git commit 文件名提交。以后每次修改都要重复前两步。
  • git status查看工作目录中的状态
  • git diff 文件名查看文件修改了什么
查看提交历史
1, 使用git log查看提交的历史版本信息[root@vm1 GitTest]# git logcommit b679b01f2ee42c1c4a7e14ed5d37e02da131a98eAuthor: daniel <daniel@itcast.cn>Date:   Wed Jan 16 14:00:44 2019 +0800添加了一行代码打印hello linuxcommit 0e9371bfdbc27049c31017773248ae8333b5bf3fAuthor: daniel <daniel@itcast.cn>Date:   Tue Jan 15 23:43:58 2019 +0800添加了一行代码打印hello pythoncommit 4e67190ec3c57f1708702c9eca5aebe88017bdd2Author: daniel <daniel@itcast.cn>Date:   Tue Jan 15 23:23:26 2019 +0800提交1.py2, 使用git log --pretty=oneline查看提交的历史版本信息, 查看的显示信息更简洁。前面字符串你可以看作就是一个版本号(commit id)[root@vm1 GitTest]# git log --pretty=onelineb679b01f2ee42c1c4a7e14ed5d37e02da131a98e 添加了一行代码打印hello linux0e9371bfdbc27049c31017773248ae8333b5bf3f 添加了一行代码打印hello python4e67190ec3c57f1708702c9eca5aebe88017bdd2 提交1.py
版本回退与还原
1, 使用git reset --hard HEAD^回退到上一个版本(也就是第2个版本)[root@vm1 GitTest]# git reset --hard HEAD^HEAD is now at 0e9371b 添加了一行代码打印hello python[root@vm1 GitTest]# cat 1.py print("hello world")print("hello python")2, 使用git reset --hard 第3个版本号还原到第3个版本。但如果我忘了第3个版本号是什么了,使用git reflog查看所有的操作历史。[root@vm1 GitTest]# git reflog0e9371b HEAD@{0}: reset: moving to HEAD^b679b01 HEAD@{1}: commit: 添加了一行代码打印hello linux0e9371b HEAD@{2}: commit: 添加了一行代码打印hello python4e67190 HEAD@{3}: commit (initial): 提交1.py3, 还原到第3个版本[root@vm1 GitTest]# git reset --hard b679b01HEAD is now at b679b01 添加了一行代码打印hello linux[root@vm1 GitTest]# cat 1.py print("hello world")print("hello python")print("hello linux")4, 回退到上上一个版本, 也就是回退两个版本,使用git reset --hard HEAD^^回退三个版本,使用git reset --hard HEAD^^^, 以此类推。如果回退100个版本,那用100个^符号不方便,可以换成git reset  --hard HEAD~100[root@vm1 GitTest]# git reset --hard HEAD^^HEAD is now at 4e67190 提交1.py[root@vm1 GitTest]# cat 1.py print("hello world")
  • 提交后的代码文件,使用git log查看当前版本及以前的历史版本。
  • 使用git reset --hard HEAD^或者git reset --hard HEAD~100实现版本回退。
  • 使用git reflog查看提交的所有操作及版本号。
  • 使用git reset --hard 版本号,你可以自由的在不同版本之间来回切换。
    git工作流再次理解与应用拓展:
  • 工作目录里任何修改或增加的文件,都要git add到暂存区,让暂存区和工作目录的状态一致,这样才能提交一个版本。
  • git commit提交的是在暂存区里的所有文件状态。也就是说是整个工作目录里的状态保存为一个版本,而不是某一个文件。
  • git版本控制不仅仅是用于项目开发,你也可以用于一个软件包仓库的版本控制。
撤销修改
准备一行或一段写错的代码
[root@vm1 GitTest]# cat 1.py 
print("hello world")
print("hello python")
print("hello linux")
print("hey,xxx is a gay")		这是写错的代码,需要反悔

想要撤销修改有以下方法:

  • 直接把写错的代码删除就好, 但如果改变的代码很多,开发者自己都忘了具体改了哪些代码,这种做法就不方便了
  • 使用git checkout – 文件名就可以直接撤销修改了
  • 如果写乱了代码,添加暂存区但还没有commit提交。使用git reset HEAD 文件名取消暂存区添加,再git checkout – 文件名来撤销修改
  • 如果写乱了代码,添加暂存区并提交了。则使用版本回退。
误删恢复
1, 只要文件git add到了暂存区, 无论有没有git commit提交。误删除后都可以使用 git checkout -- 文件名来恢复。[root@vm1 GitTest]# touch 2.py[root@vm1 GitTest]# git add 2.py[root@vm1 GitTest]# rm  -rf 2.py[root@vm1 GitTest]# ls1.py[root@vm1 GitTest]# git checkout -- 2.py[root@vm1 GitTest]# ls1.py  2.py2, 如果文件没有git add到暂存区, 误删除了就没了。[root@vm1 GitTest]# touch 3.py[root@vm1 GitTest]# rm -rf 3.py下面命令恢复报错[root@vm1 GitTest]# git checkout -- 3.pyerror: pathspec '2.py' did not match any file(s) known to git.
文件删除
1, 没有git add到暂存区的文件直接rm删除就ok2, git add添加到暂存区,但没有git commit提交的文件。需要rm删除本地,还要git rm 文件名删除[root@vm1 GitTest]# touch 3.py[root@vm1 GitTest]# git add 3.py[root@vm1 GitTest]# rm -rf 3.py[root@vm1 GitTest]# git rm 3.pyrm '3.py'3,  git add添加到暂存区,并且已经git commit提交的文件。需要rm删除本地,再git rm 文件名删除,最后再提交删除[root@vm1 GitTest]# touch 3.py[root@vm1 GitTest]# git add 3.py[root@vm1 GitTest]# git commit -m "提交了3.py"[master 0236aef] 提交了3.py1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 3.py[root@vm1 GitTest]# rm -rf 3.py[root@vm1 GitTest]# git rm 3.pyrm '3.py'[root@vm1 GitTest]# git commit -m "删除了3.py"[master dc4ee5e] 删除了3.py1 file changed, 0 insertions(+), 0 deletions(-)delete mode 100644 3.py

在这里插入图片描述

git分支管理

先来考虑一个问题: 开发者A开发软件的某一个功能模块, 还没有开发完成,但害怕进度丢失就提交。假设另一位开发者B并不知道A没有完成, 而直接使用了A开发的文件,这造成了问题。
解决方法: 开发者A创建一个属于自己的分支,这个分支只属于A,不会影响其他人。开发完成后,合并到项目主分支即可。
查看分支

默认只有一个master分支, 前面有*号的代表为当前分支。[root@vm1 GitTest]# git branch* master

创建分支

使用git branch 分支名来创建分支[root@vm1 GitTest]# git branch dev[root@vm1 GitTest]# git branch dev* master

切换分支

使用git checkout 分支名来切换分支[root@vm1 GitTest]# git checkout devSwitched to branch 'dev'[root@vm1 GitTest]# git branch * devmaster

合并分支

1, 在dev分支上新开发了一个代码文件,添加并提交[root@vm1 GitTest]# git branch * dev						确认为dev分支master[root@vm1 GitTest]# echo "new feature" > 5.py[root@vm1 GitTest]# git add 5.py[root@vm1 GitTest]# git commit -m "增加了新特性"[dev 4a0c78e] 增加了新特性1 file changed, 1 insertion(+)create mode 100644 5.py2, 切换到master上分支后,却发现根本没有这个文件[root@vm1 GitTest]# git checkout masterSwitched to branch 'master'[root@vm1 GitTest]# cat 5.py cat: 5.py: No such file or directory3, 合并分支,再查看能在master分支上查看到了[root@vm1 GitTest]# git merge devUpdating dc4ee5e..4a0c78eFast-forward5.py | 1 +1 file changed, 1 insertion(+)create mode 100644 5.py[root@vm1 GitTest]# cat 5.py new feature

分支冲突
有些复杂的情况会造成冲突,这个时候git就不能帮我们自动的合并分支。我们就要手动处理冲突。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90782.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90782.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90782.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

138-EMD-KPCA-CPO-CNN-BiGRU-Attention模型!

138-EMD-KPCA-CPO-CNN-BiGRU-Attention基于经验模态分解和核主成分分析的长短期记忆网络改进多维时间序列预测MATLAB代码&#xff01;其中&#xff08;含CPO-CNN-BiGRU-attention、EMD-CPO-CNN-BiGRU-Attention、EMD-KPCA-CPO-CNN-BiGRU-Attention三个模型的对比&#xff09; 可…

系统思考:多元胜过能力

系统思考&#xff1a;从整体出发&#xff0c;打破瓶颈&#xff0c;拥抱多元 我们是否曾经陷入过这样的困境&#xff1f; 1、专注能力提升&#xff0c;却无法突破瓶颈&#xff1a;我和团队日复一日地努力提升个人能力&#xff0c;投入无数时间和精力&#xff0c;但始终无法打破现…

qt样式整合持续更新中(实测有效的)

// 仅显示上边框 一般可以作为直线使用 border-top: 2px solid black; //画虚线 border-bottom: 2px dashed white; //单个圆角 border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; //透明背景 background:rgba(0,0,0,0); //设置字体 font:15pt; //给button设置…

[java][springboot]@PostConstruct的介绍和用法

在 Spring Boot&#xff08;以及整个 Spring Framework&#xff09;中&#xff0c;PostConstruct 是一个非常常用的注解&#xff0c;用于在 依赖注入完成后 执行一些初始化操作。import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Component;Co…

Leaflet面试题及答案(41-60)

查看本专栏目录 文章目录 🟢 面试问题及答案(41-60)41. 如何判断某个点是否在地图可视区域内?42. 如何动态更新 Marker 位置?43. 如何清除地图上的所有图层?44. 如何保存地图截图?45. 如何检测浏览器是否支持触摸?46. Leaflet 是否支持 TypeScript?47. 如何修改默认图…

Redis事件机制

Redis 采用事件驱动机制来处理大量的网络IO。它并没有使用 libevent 或者 libev 这样的成熟开源方案&#xff0c;而是自己实现一个非常简洁的事件驱动库 ae_event。事件机制Redis中的事件驱动库只关注网络IO&#xff0c;以及定时器。该事件库处理下面两类事件&#xff1a;文件事…

Linux基础开发工具

目录 1.写在前面 2.权限 3.file命令 4.基础开发工具 1.软件包管理器 5.编辑器vim 1.写在前面 我们在上一讲解中讲解了权限是人事物属性&#xff0c;还知道了拥有者所属组其他人这三个概念&#xff0c;知道了33一组&#xff0c;rwx分别代表什么。那么下面我们继续进行权限…

ICCV2025 特征点检测 图像匹配 RIPE

目测对刚性物体效果比较好代码&#xff1a;https://github.com/fraunhoferhhi/RIPE 论文&#xff1a;https://arxiv.org/abs/2507.04839import cv2 import kornia.feature as KF import kornia.geometry as KG import matplotlib.pyplot as plt import numpy as np import torc…

Ubuntu22.0.4安装PaddleNLP

Ubuntu22.0.4安装PaddleNLP环境说明安装底层框架Paddle安装PddleNLP1. pip安装2. 验证安装3. 最后问题集锦环境说明 1. miniconda 25.5.1 2. python 3.12.11 3. pip 25.1 4. nvidia 570.144 5. cuda 12.8**注意&#xff1a;**安装过程可能遇到的一些问题&#xff0c;参考末尾的…

【HTTP服务端】Cookie?Session?Token?

文章目录cookie与sessiontoken什么是JWT&#xff1f;JWT的组成结构1. Header&#xff08;头部&#xff09;2. Payload&#xff08;负载&#xff09;3. Signature&#xff08;签名&#xff09;JWT工作原理JWT的特点安全注意事项cookie与session cookie有哪些属性 键值对&#xf…

安装Git

Git安装避坑指南技术 操作系统选择与准备 Windows用户需注意系统版本兼容性&#xff0c;建议使用Windows 10及以上版本 Mac用户需检查是否安装Xcode Command Line Tools Linux用户需区分apt/yum等包管理器命令差异 安装包下载注意事项 从官方渠道&#xff08;git-scm.com&a…

UDP服务器的优缺点都包含哪些?

UDP协议不需要像TCP协议那样进行复杂的连接建立与拆除过程&#xff0c;在进行传输数据信息的过程中&#xff0c;应用层将数据交给UDP层&#xff0c;UDP层直接加上首部就发往网络层&#xff0c;极大地减少了处理时间和资源消耗。例如在一些简单的网络监控程序中&#xff0c;只是…

sqli-labs靶场通关笔记:第7-8关 布尔盲注

第七关1.审题这里判断出是))闭合&#xff0c;但是页面只有正确和错误的回显状态&#xff0c;报错的回显也是固定的&#xff0c;没有显示报错具体信息。这关使用的方法是布尔盲注。为什么叫布尔盲注&#xff1f;因为它返回的结果只有true和false 两个值&#xff0c;攻击者需要通…

理解支持向量机(SVM):理论、数学和实现的综合指南

支持向量机&#xff08;SVMs&#xff09;是强大的监督学习算法&#xff0c;用于分类和回归任务&#xff0c;尽管它们主要用于分类。由Vladimir Vapnik及其同事在1990年代引入&#xff0c;SVMs基于统计学习理论&#xff0c;特别适用于需要将数据点稳健分离到不同类别的任务。本博…

使用Navicat对PostgreSQL数据表添加列,自动记录当前行的添加日期

点开表设计&#xff0c;向如下这样一个字段&#xff1a; 字段名称可以自定义&#xff0c;博主这里叫做&#xff1a;add_date_time类型选择&#xff1a;timestamp长度写成&#xff1a;6默认值输入&#xff1a;CURRENT_TIMESTAMP 添加行&#xff1a;默认值&#xff1a;

VR协作海外云:跨国企业沉浸式办公解决方案

随着全球化进程加速&#xff0c;VR协作海外云正成为跨国企业数字化转型的核心解决方案。本文将深入解析这项技术如何突破地理限制&#xff0c;实现沉浸式远程协作&#xff0c;并探讨其在跨文化团队管理、实时3D数据交互等场景中的独特优势。 VR协作海外云&#xff1a;跨国企业沉…

[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)

ps:这是你为了点灯最繁琐的一次 1.软件下载 vscode下载地址&#xff1a;Documentation for Visual Studio Codeesp_idf下载地址&#xff1a;https://dl.espressif.cn/dl/esp-idf/?idf4.4 (从上往下第三&#xff09; 2.软件安装 可以均默认安装&#xff0c;但建议不要放在C盘&…

tailwindcss详解

Tailwind CSS 详解&#xff1a;实用主义的现代 CSS 框架 Tailwind CSS 是一个功能优先&#xff08;utility-first&#xff09;的 CSS 框架&#xff0c;它通过提供低级别的实用类来快速构建自定义设计&#xff0c;而无需离开 HTML 文件。以下是全面解析&#xff1a; 一、核心概念…

[spring6: TypeFilter MetadataReader MetadataReaderFactory]-源码解析

源码 MetadataReaderFactory MetadataReaderFactory 是用于创建 MetadataReader 实例的工厂接口&#xff0c;支持通过类名或资源读取类的元数据并可实现缓存优化。类型类/接口名功能描述是否需要加载类访问方式抽象接口AnnotatedTypeMetadata访问某类型&#xff08;类或方法&am…

基于redis的分布式session共享管理之销毁事件不生效问题

一、前言首先介绍下分布式session共享管理在Springboot项目中&#xff0c;经常提到分布式的概念&#xff0c;当实际部署应用后&#xff0c;多台服务器各自存储用户登录会话无法共享&#xff0c;导致操作A按钮还是正常&#xff0c;操作B按钮就提示登录过期需要重新登录。这是因为…