Git 分布式版本控制系统基本概念和操作命令

news2024/9/21 16:35:44

目录

Git

基本概念

功能特点

工作流程

操作命令

新建代码库

配置

增删文件

代码提交

分支

标签

查看信息

远程同步

撤销

其他

小结


Git

Git 是一个开源的分布式版本控制系统,用于跟踪文件的变更历史。它最初由 Linux Torvalds 设计,用于 Linux 内核的开发,但由于其强大的功能和灵活性,现在已被广泛应用于各种项目,无论是开源还是商业的。

Git 的“分布式”特性意味着每个开发者的本地仓库都是完整的,包含整个项目的历史记录。这意味着开发者可以在没有网络连接的情况下进行提交、分支和合并等操作。当网络连接恢复时,开发者可以与其他仓库同步更改。

基本概念

  1. 仓库(Repository):是Git用来存储项目文件和版本历史的地方。仓库可以是本地仓库(Local Repository)或远程仓库(Remote Repository)。

  2. 提交(Commit):是指将文件的变化保存到Git仓库中的操作。每个提交都有一个唯一的标识符(哈希值),可以方便地查看和追溯历史记录。

  3. 分支(Branch):是指项目的不同版本,每个分支都有自己的提交历史。通过创建和合并分支,可以方便地在不同版本之间切换和合并代码。

  4. 合并(Merge):是指将一个分支的改动合并到另一个分支的操作。合并可以保留两个分支的改动,解决冲突,并生成一个新的提交。

  5. 远程仓库(Remote Repository):是指存放在远程服务器上的Git仓库。多人协作开发时,可以将代码推送(push)到远程仓库,并从远程仓库拉取(pull)最新的代码。

功能特点

  1. 分布式:每个Git工作目录实际上是一个完全的版本库,其中包含了所有历史提交信息,这意味着每个开发者都可以在本地进行提交、分支管理和合并等操作,无需时刻连接到中央服务器。

  2. 高性能:Git采用快照方式存储数据,相较于记录差异的传统方式,在处理大型项目和大量文件时效率更高。

  3. 分支便捷:Git鼓励频繁使用分支,创建新分支和合并分支的操作都非常迅速,有利于并行开发和敏捷工作流。

  4. 数据完整性:Git通过SHA-1算法对数据进行校验,确保每一次提交都有独一无二的指纹,从而保证了数据的安全性和一致性。

  5. 离线工作:开发者可以在无网络的情况下继续进行版本控制的所有基本操作,并在连通网络后将本地变更推送到远程仓库。

  6. 强大的合并追踪能力:Git能够智能地识别和解决冲突,尤其是在多人协作和分支合并时表现卓越。

工作流程

  1. 初始化仓库:在项目根目录执行git init命令,创建一个新的本地仓库。

  2. 添加文件:使用git add命令将文件添加到Git仓库的暂存区。

  3. 提交文件:使用git commit命令将暂存区的改动提交到本地仓库。

  4. 创建分支:使用git branch命令创建一个新的分支。

  5. 切换分支:使用git checkout命令切换到一个已存在的分支。

  6. 合并分支:使用git merge命令将一个分支的改动合并到当前分支。

  7. 推送到远程仓库:使用git push命令将本地仓库的改动推送到远程仓库。

  8. 拉取远程仓库:使用git pull命令从远程仓库拉取最新的改动。

操作命令

新建代码库

# 在当前目录新建一个Git代码库
$ git init

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

# 下载一个项目和它的整个代码历史
$ git clone [url]

配置

Git的设置文件为.gitconfig,可以是全局配置(用户主目录),也可以是项目配置(项目目录)。

# 显示当前的Git配置
$ git config --list

# 编辑Git配置文件
$ git config -e [--global]

# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

增删文件

# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

代码提交

# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

分支

# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

标签

# 列出所有tag
$ git tag

# 新建一个tag在当前commit
$ git tag [tag]

# 新建一个tag在指定commit
$ git tag [tag] [commit]

# 删除本地tag
$ git tag -d [tag]

# 删除远程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

查看信息

# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

# 显示当前分支的最近几次提交
$ git reflog

远程同步

# 下载远程仓库的所有变动
$ git fetch [remote]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [remote]

# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库
$ git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

# 推送所有分支到远程仓库
$ git push [remote] --all

撤销

# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

其他

# 生成一个可供发布的压缩包
$ git archive

小结

使用 Git 进行版本控制可以大大提高团队协作的效率和代码质量。通过分支和合并功能,开发者可以并行工作,减少冲突,并快速集成新的功能或修复。同时,提交历史和冲突解决机制有助于保持代码的清晰和可维护性。总的来说,Git的出现极大地改变了软件开发者协作编写代码的方式,它的分布式特性和高效性能使其成为当今最流行的版本控制系统之一。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDK,Nginx,Redis安装

创建develop目录 mkdir /usr/local/develop/ cd /usr/local/develop 下载 wget http://nginx.org/download/nginx-1.17.4.tar.gz yum install git git clone https://github.com/arut/nginx-rtmp-module.git 解压文件 tar zxmf nginx-1.17.4.tar.gz 进入解压目录 cd ng…

STL和泛型编程

STL和泛型编程 一.STL六大部件"前开后闭"区间 二.容器(1)顺序容器1.array源码剖析 2.vector源码剖析vector的迭代器 3.list源码剖析迭代器的设计规则关于重载操作符关于重载->和*操作符 4.forward_list源码剖析 5.deque源码剖析底层数据结构操作实现deque的设计de…

力扣面试150 Pow(x, n) 快速幂 负指数

Problem: 50. Pow(x, n) 解题方法 👨‍🏫 参考题解 复杂度 时间复杂度: O ( l o g 2 n ) O(log_{2}n) O(log2​n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public double myPow(double x, int n){if (x 0.0f)return 0.0d;long b…

centos7 装 docker-ce

安装必要的系统工具: sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 命令会以超级用户的身份安装三个软件包:yum-utils,device-mapper-persistent-…

2024.3.2-玄子Share-Mybatis 八股文面试题(共计:48 道 9000 字)

2024.3.2-玄子Share-Mybatis 八股文面试题(共计:48 道 9000 字) 前言: 本文部分面试题来源于网络仅供学习使用,请支持原作部分面试题有修改润色,部分面试题由我(玄子)自写面试题根据…

牛客NC12 重建二叉树【中等 dfs Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 思路 先序遍历第一个值就是根节点,根据这个值可以在中序中划分左右子树, 我们这里已经将一个数划分成两颗子树,那么在递归的使用刚刚的分析…

大模型时代的向量数据库:原理解析和应用案例

大家好,在人工智能领域,数据处理和加工的需求愈发增加。随着人们深入探索AI高级的应用,如图像识别、语音搜索和推荐引擎等,数据的复杂性也在不断地增加。此时传统的数据库存储方式已不能完全满足需求,向量数据库应运而…

大模型知识点汇总——分布式训练

PS:本篇只在宏观上介绍相关概念和技术,不做数学推导和过于细节介绍,旨在快速有一个宏观认知,不拘泥在细节上,导致很混乱。 涉及技术名词 分布式框架等涉及的技术名词很多,很容易让人眼花缭乱,…

vdat文件分段了怎么合并成MP4?批量导入一键合并!

一些监控摄像头、视频录像软件或其他专用设备可能会生成vdat文件作为其录制的视频数据文件。一些浏览器比如夸克下载的视频也会出现vdat格式,因为流媒体播放采用的是分段加载,在网络不好的时候,重新加载对文件整体性损坏比较小,所…

springboot 中Aop注解切面实现收集日志与统计耗时2

一 Aop注解实现切面 1.1 工程结构 Before:前置通知, 在方法执行之前执行 Aroud:环绕通知, 围绕着方法执行 After:后置通知, 在方法执行之后执行 AfterReturning:返回通知, 在方法返回结果之后执行 AfterThrowing:异…

su怎么做展厅模型---模大狮模型网

要在SketchUp中创建展厅模型,你可以按照以下基本步骤进行: 绘制基本结构: 使用SketchUp的绘图工具(线条、矩形、圆形等)来创建展厅的基本结构,包括墙壁、地板和天花板等。确保按照实际尺寸和比例进行绘制。 添加家具和展品&…

vue学习日记18:data是一个函数组件通信

一、data是一个函数 1.概念 2.代码 相互独立互不影响 二、组件通信 1.概念 (1)什么是组件通信 (2)不同组件关系和组件通信方案分类 (3)组件通信解决方案 (4)父子通信流程图 -…

CrossOver虚拟机软件2024中文版最新功能介绍

CrossOver是一款由CodeWeavers公司开发的,运行在Mac和Linux操作系统下,能够模拟Windows系统应用运行环境的软件。它不需要用户单独安装Windows操作系统,就能让Windows平台上的应用程序在Mac和Linux上顺畅运行。CrossOver在技术上使用了Wine&a…

鸿蒙开发之了解ArkTS

鸿蒙开发者官网 : https://developer.huawei.com/consumer/cn/ 开发鸿蒙要用的软件是 DevEco Studio ArkTS建立在JS和TS的基础之上,扩展了声明式UI开发范式和状态管理,提供更简洁和自然的开发方式。 ArkTS引入了渲染引擎的增强&#xff0c…

第 1 章.提示词:开启AI智慧之门的钥匙

什么是提示词? 提示词,是引导语言模型的指令,让用户能够驾驭模型的输出,确保生成的文本符合需求。 ChatGPT,这位文字界的艺术大师,以transformer架构为基石,能轻松驾驭海量数据,编织…

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始,设置为从1开始 问题描述:word中插入题注,出来的是表0-1,不是1-1,怎么办? 写论文时,虽然我设置了“第一章”为一级标题,但是这三个字并不是自动插入的…

【Docker】Docker安全与最佳实践:保护你的容器化应用程序

欢迎来到英杰社区: https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区: https://bbs.csdn.net/topics/617897397 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步&#xff…

GEE显示研究区sentinel-2每年可用影像

第一次使用GEE,用了别人的代码,想查看每年影像可用数量,但是老是报错,说是null geometry,之前我是用GAMMA软件导出的kml文件,后面在arcgis自己勾画了sho文件,线类型,然后我就在想会不…

AI 工具到底要怎么用,老板才满意?

AI 大模型(GPT-3.5)从问世到现在广泛应用,已经一年多时间,去年 8 月,我们曾经探讨过“有了 AI 大模型,人工客服就没用了?”这个话题,彼时百模大战如火如荼,AI 创业公司风…

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应

Vant Weapp 1.0 版本开始支持van-uploader组件&#xff0c;请先确认好版本号和引用路径正确&#xff01;&#xff01; <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader&#xff0c;但是…