Git概念及工作原理总结

article/2025/9/11 15:50:55

Git是分布式版本控制系统。Github和华为等均使用Git作为代码管理工具。之前在工作中比较常用到的是克隆、代码提交拉取、解决回合冲突、代码回滚等。在实际的工作中,可能回合时冲突及版本回退的情况较多,下文将着重介绍这两点。本文不涉及Git的安装等,主要以介绍概念及原理为主。
个人感觉使用Idea内置的git比通过Git Bash使用Git命令要方便且易操作。

一、Git基本概念

  1. 工作拷贝(工作目录):用于存放产品开发数据本地工作目录。
  2. 索引(Index):用于存放待提交数据的缓存区。
  3. 本地库:远端库的一个完整的拷贝,包括所有文件的修改记录,分支等。
  4. 远端库:本地库clone来源。
  5. 中心库:远端库的一种,公司级存放某个项目所有产品数据的仓库。
  6. 快照(snapshot):版本库某个时间点所有文件集合。
  7. 全球版本号(commitID):Git库的版本号是用过SHA-1算法根据库中的所有内容计算出一个40位的哈希值,这个哈希值是全球唯一的,基本只要前六位就可以唯一标识了。
  8. 文件状态介绍
    1. Untracked files:未被跟踪的文件,一般指新添加的文件。
    2. Change not staged for commit:已修改的文件,包括modified和deleted状态。
    3. Change to be commit:已缓冲的文件,即已add的文件,包括modified、deleted和new file状态。
    4. Nothing to commit:已提交的文件,即已commit的文件。

二、Git概念及基本操作详解

Git分为工作区、暂存区、本地仓库和远端分支。
在这里插入图片描述
1、工作区:本地电脑上的某项目工程的代码文件夹就是工作区。
2、暂存区:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多的东西,其中最重要的就是成为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
在这里插入图片描述
我们把文件往Git版本库里添加的时候是分两步执行的;
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
在这里插入图片描述
第二步:是用git commit提交更改,实际上就是把暂存区的所有内容提交到本地仓库。
在这里插入图片描述
需要提交的文件修改统统放到暂存区,然后一次性提交暂存区的所有修改。
3、本地仓库
本地仓库就是上图的本地版本库,克隆自远程仓库。从下图可以看到,工作区、暂存区、本地仓库都是在本地计算机上的。
4、远端分支
git push命令能将本地仓库的代码上传到远端分支,但是必须经过committer确认之后才能合入远程分支。托管在网络上的项目仓库,Git的远程仓库是分布式的,能够极大保证代码的安全性。

三、使用Git clone项目库的两种方式

  1. 命令行克隆($git clone +代码库地址)
  2. 小乌龟(TortoiseGit)克隆
    1. 使用命令行clone代码
    1. 第一步:复制代码库地址——copy Address
    2. 第二步:打开想要克隆到的本地文件夹,右键单击打开Git Bash,输入: git clone +代码库地址
    3. 第三步:配置好复制地址及目标地址,点击OK即可。

四、合并冲突

因为自己的远程fork库一般只有自己一个分支(master),即一个人一个仓,所以在自己名下的代码库基本不会产生冲突。目前产生合并冲突只有两种可能性。
1、本地代码进行了一些修改,远程fork库同步了远程中心库(Merge),然后本地clone库从远程fork库更新代码(pull)。
在这里插入图片描述
2、本地代码进行了一些修改,并成功push到远程fork库。但是合入远程中心库时,因为其他人比你先合了代码,你的fork库并没有拉取到这个更改。因此在ISource上请求合并时,如果你们更改了同样的代码,就会提示,存在冲突,无法发起合并请求。
在这里插入图片描述

五、代码回滚

git reset和git revert都用来撤销代码仓库中某些更改。
git reset在本地代码库,add或commit以后发现提交的代码有问题,删除自己个人分支上还没合入主线的提交。用于个人库。
顾名思义,重置分支,将当前的分支重设(reset)到指定的或者HEAD(如果不显示指定commit)默认是HEAD,即最新的一次提交。有三个参数可供选择。
1、–hard
缓存区和工作区都同步到你指定的提交,重置文件索引,自指定提交以来在工作区中的任何改变都被丢弃,并将版本库重置为指定提交(commit)。
2、–mixed
缓存区同步到你指定的提交,重置文件索引,但是代码的改动仍留在工作区中,不会被丢弃。并将版本库重置为指定提交(commit)。
3、–soft
工作区、缓存区、文件索引都不会改变,仅仅将版本库重置为指定提交(commit)。
其作用域如下图所示:
在这里插入图片描述
git revert 代码已经push上库,同时回滚本地和线上代码到指定版本,用一个新提交来消除一个历史提交所做的任何修改。用于版本库。
1、如果已经push到远程fork库,reset删除指定commit以后,gitpush可能导致一大堆冲突,但是revert并不会。
2、reset是在正常的commit历史中,删除了指定的commit,这是HEAD是向后移动了,而revert是在正常的commit历史中再commit一次,只不过是反向提交,他的HEAD是一直向前的。
3、git revert也有可能会重写文件。所以,Git会在你执行revert之前要求你提交或者缓存你工作目录中的更改。
六、Git基本语法

语法功能说明
git clone克隆版本库
git pull拉回远程版本库的提交
git push推送至远程版本库
git add添加至暂存区
git add -interactive交互式添加
git apply应用补丁
git am应用邮箱格式补丁
git annotate同义词,等同于git blame
git bisect二分查找
git blame文件逐行追溯
git blame +文件名显示文件的每一行是在哪个版本最后修改
git branch分支管理
git cat -file版本库对象研究工具
git checkout检出到工作区,切换或创建分支
git cherry -pick提交拣选
git citool图形化提交,相当于git gui命令
git clean清除工作区未跟踪文件
git commit提交
git config查询和修改配置
git describe通过里程碑直观地显示提交ID
git diff差异比较
git difftool调用图形化差异比较工具
git fetch获取远程版本库的提交
git format -patch创建邮箱格式的补丁工具
git grep文件内容搜索定位工具
git gui基于cl/TK的图形化工具,侧重提交等操作
git help帮助
git init版本库初始化
git init -db同义词,等同于git init
git log显示提交日志
git log - - pretty = oneline显示每个版本都修改了哪些文件与git show (commit id),不过每个修改版本都包含了
git merge分支合并
git mergetool图形化冲突解决
git mv重命名
git push origin HEAD --force回退个人远端
git rebase分支变基
git rebase -interactive交互式分支变基
git reflog分支等引用变更记录管理
git repo -config同义词,等同于git config
git reset重置改变分支,“游标”指向
git reset --softcommitID本地代码回退到某一版本
git rev -parse将各种引用表示法转换为哈希值等
git revert反转提交
git rm删除文件
git show显示各种类型的对象
git show (commit id)显示某个版本的修改详情
git show +文件名显示某个版本的某个文件修改情况
git stage同义词,等同于git add
git stash保存和恢复进度
git status显示工作区文件状态
git tag里程碑管理
git whatchanged +文件名显示某个文件的每个版本提交信息,提交日期,提交人员,版本号,提交备注(没有修改细节)

七、Git基本操作

1、配置基本信息

  $git config --global user.name XXX$git config --global user.email XXX

2、克隆中心库到本地

  $ git clone +中心库地址

3、新增和修改文件名

  $ git add +文件名注:将需要添加的文件拷贝到工作目录或直接创建,此操作只是将需要添加的文件转移至缓存区,如果需缓存当前目录下的所有非受控文件,则可以通过“git add.”命令来完成已在缓存区但不需提交的文件怎么办?$echo “first” >>>first$git add first提交:$git commit注:此操作是将所有缓存区的修改提交到本地版本库

在这里插入图片描述
4、取消已缓存的修改(回退)

(1)$ git rest -hard HEAD+文件名

(2)$ git rest HEAD+文件名

 注:此操作将修改的文件从缓冲区内删除,不影响本地内容

5、删除文件

 $ git rm 文件名注:此操作只是删除文件并将删除的信息转移至缓存区,要想删除库上的文件需要执行commit操作,同样适用git reset恢复eg: $ git rm second$ git commit

6、取消本地文件的修改,包括删除的文件

(1)$ git checkout(HEAD/commitID)

 注:此操作将取消本地文件(未提交)已做的但未提交的修改,如果需回退当前目录下的所有修改文件,则可以通过“git checkout .”命令来完成各成。eg:$ git checkout -first(2) $ git clean -f注:清除本地未被跟踪的所有文件,使用时需要注意是否确定需要清除

7、重命名文件或目录

  $ git mv 原文件名 新文件名注:重命名或者移动本地文件或目录,mv后直接到缓存区,需要执行commit操作eg:$ git mv first first_new

8、查看文件状态

 注:查看本地库中所有文件的状态,包括未受控的、已修改、已缓存。冲突文件的状态也表现为已修改的。

9、比较文件

 $ git diff OldcommitID NewcommitID(前6位)注:比较文件/目录下所有文件修改前后的不同,不加CommitID,则比较本地的与缓存或缓存的与库中最新的。新添加的文件使用git diff的时候不能显示git diff和 git diff -cached的不同

10、查看修改日志

    $ gitk --all注:此操作将调出git日志的图形化界面,在相关的版本号上右击选择“Create new branch”来创建基于此项的新分支,需要运行Xming$ git log注:在命令行中查看log信息注意:查看日志信息只能看到本地的修改日志和已经获取到本地的远端修改日志,不能看到远端还没有获取到本地的修改日志。

11、创建私有分支

   $ git branch 分支名 commitID$ git checkout -b 分支名 commitID注:此操作是基于commitID即某一个全球版本号拉出新分支,如果没有则基于当前分支的HEAD拉出新分支。$ git checkout -b +分支名 commitID=$ git branch 分支名commitID +$ git checkout 分支名

12、合并分支

    (1)直接合并$ git merge +分支名注:此操作是将“分支名”指示的分支合并到当前所在的分支,所以合并前必须切换到目标分支。(2)拣选合并 $ git cherry -pick commitID注:将某次特定提交合并到当前分支,首先合并前必须切换到目标分支。

13、查看分支

   $ git branch注:查看当前git库中的所有分支,“-r”是查看git库中对应的远程分支参照。

14、检查分支是否合并到当前分支

   $ git branch -mergerd注:查看已经合并到当前分支的所有分支。$ git branch -no -merged注:查看还没有合并到当前分支的所有分支。

15、删除私有分支

   $ git branch -d/-D 分支名注:此操作“-d”删除分支前会检查分支中的内容是否都已经合并到其他分支,如果 没有,则命令不执行;“-D”不进行检查,直接删除分支。

16、重命名分支

    $ git branch -m oldbranch newbranch注:此操作是将“oldbranch”分支的名称改成“newbranch”。如果需要拉出分株,并同时切换到新分支可以用“git checkout -b branch1 branch2”。

17、上传修改到远端(fork)库

   $ git push 远端库名称 本地分支名称:远程分支名称注:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远程分支名称可忽略。eg:$ git push origin new :new -br

18、更新当前模块

    $ git fetch 远端库名称(获取远端库的更新到本地库)$ git fetch origin$ git merge 远程库名称/分支名称(将中心库的更新合并到本地工作目录中)$ git merge origin/new -br

19、修改提交信息

   $git commit -m “新的提交信息” -amend注:此操作只能修改最新的一次提交,之前的提交无法修改。

20、回退某一历史版本,然后提交到本地库

    $ git revert 全球版本号注:此操作将回退记录到历史的某一节点,并作为一次新的提交到库中。

21、暂存本地修改

    $ git stash注:此操作是将本地未提交的修改暂存起来,并将文件状态恢复到HEAD,如果要恢复暂存的修改,运行“ git stash pop”即可,非常适合临时插入的紧急bug修改。

22、二分法定位错误

   $ git bisect start$ git bisect bad CommitID$ git bisect good CommitID注:此操作用于定位问题引入的点,输入如上命令后,git会自动切换到中间的状态,经过测试输入测试结果“git bisect good/bad”,重复以上,直接定位出出错的提交,然后通过“git bisect reset”退出。

23、解决冲突

   合并分支或者合并库上的更新到本地均会产生冲突。Git的冲突产生是由于同一文件的同一行内容。哪些情况会出现冲突:1.修改了同一个文件的同一行;2.文件被重命名为不同的名字;3.在一个分支上文件被删除在另一个分支上该文件被修改。

24、变基

   $ git rebase 目标分支 原分支注:此操作将原分支变基到目标分支HEAD上。

在这里插入图片描述
从主项目pull拉最新代码到本地,如果有冲突在本地解决冲突的成本比在合并的时候再解决要低很多,所以建议在合并到主项目之前,先pull一下主项目的最新代码后在提交合并请求。在这里,你可以用“pull”命令把“origin”分支上的修改拉下来,并且和你的修改合并,结果看起来就像一个新的“合并的提交”(merge commit)。但是,如果你想让“mywork”分支历史看起来像没有经历过任何合并一样,你也许可以用 git rebase。

  $ git checkout mywork$ git rebase origin这些命令会把你的“mywork”分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到“git / rebase”目录中),然后把“mywork”分支更新到最新的“origin”分支,最后把保存的这些补丁应用到“mywork”分支上。

24、忽略某些文件

   在git仓工作的根目录下面,创建gitignore文件,文件内容如下实例,同样gitignore文件也可以上传到库上,这样每次下载都可以记录忽略规则,如果将某个已经忽略的文件添加,使用$ git add -f文件名即可。* .a #忽略所有.a结尾的文件! lib.a #但lib.a除外/TODO #仅仅忽略项目根目录下的TODO文件,不包括subdir/TODObuild/ #忽略build/目录下的所有文件doc/*.txt #会忽略build/目录下的所有文件doc/*.txt #会忽略doc/notes.txt但不包括 doc/server/arch.txt

25、使用GUI图形化操作界面

   $ git gui添加修改,删除文件时,可以直接通过“git gui”命令,调出图形界面,通过“stage changed”缓存文件(新添加的文件只能通过git add命令缓存),在提交信息处输入“提交信息”,然后通过“commit” 提交。

http://chatgpt.dhexx.cn/article/vDb22cLx.shtml

相关文章

Git 天天用 但是 Git 原理你了解吗?

前言 做技术一定要知其然知其所以然,意思就是:知道它是这样的,更知道它为什么是这样的。我主要通过4块内容来简单介绍 Git 原理是什么样的。这4块内容如下: Git 存储目录结构介绍Git 是如何存储的Git 的对象Git引用 当然 Git 原…

(一篇就够)git原理深入理解

深入理解git原理 1:git工作模式 基本步骤: 1.workspace 本地工作空间add命令 提交到本地缓存 2、localcache本地缓存commit命令提交到本地仓库 3、localRepository本地仓库push命令提交到远程仓库 拉取步骤: clone 克隆到本地仓库 checkout…

git原理笔记(一)

git原理笔记(一) 这个笔记是对于git内部原理的一个理解。网上很多关于git的用法的教程。这里推荐廖雪峰的git教程。 这里主要记录如下的内部原理的理解 1. git如何存储 2. git如何管理版本 一. git如何存储 常常在使用git的过程中&#…

git工作原理

一. git工作原理 二. git分支标准流程 三. git工具:sourcetree 待续知识分享

git原理和常用命令

git git介绍git工作流程git的几个核心概念 git常用命令参考资料 git介绍 git-分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 git特点 优点: 适合分布式开发,强调个体; 公共服务器压力和数据量都不会太…

Git分支原理

Git分支原理 前言 最近工作由SVN换成Git了,不由地想探寻一下这两种版本控制工具的差别到底在哪里,于是有了这篇笔记。 Git保存方式 Git和SVN的差别主要就在于对待数据的方式。 SVN将存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异&…

git fetch工作原理

背景 相信大家都知道git pull命令相当于git fetch加git merge。那么直接使用git pull和分开使用有什么区别呢&#xff1f;要解答这个问题首先要想了解git fetch的工作原理是什么样的。 git fetch的工作原理 先讲一下什么是远程跟踪分支。远程跟踪分支以 <remote>/<…

Git原理入门解析

前言: 自己第一次听到Git应该是一年前了,当时很懵,不知道它是干啥的,在网上搜索了很多文章,一直不是太明白;今天我来记录一下自己对Git的学习,如果对其他童鞋有所帮助,我荣幸之至! 一、Git 简析 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)。…

Git原理详解与实用指南

文章目录 上手 1&#xff1a;新公司用 Git 管理代码&#xff0c;怎么快速上手&#xff1f;上手2&#xff1a;团队工作的基本工作模型进阶1&#xff1a;HEAD、master与branch进阶2&#xff1a;push的本质进阶3&#xff1a;merge&#xff1a;合并commits进阶4&#xff1a;Feature…

最详细的Git原理总结+如何解决冲突

原文路径是https://www.cnblogs.com/cb0327/p/5066685.html 目录 1.提交 代码到远程仓库2.将远程仓库代码更新到本地3.更新到本地仓库时&#xff0c; 出现冲突&#xff0c;解决冲突后记&#xff1a; 正文 本文背景&#xff0c;在实际项目中使用git已有一年&#xff0c;发现不少…

图解git工作原理

git 是一个能处理各种大小项目的开源版本控制系统&#xff0c;本文想通过两张图来简单说明git的工作原理 从上图可以知道git分四个部分来记录文件状态 working directory:工作区&#xff0c;开发者直接修改的本地代码树 staging area&#xff1a;暂存区&#xff0c;用于临时保存…

git原理解释

工作区域 Git本地有三个工作区域&#xff1a;工作目录&#xff08;Working Directory&#xff09;、暂存区&#xff08;Stage/Index&#xff09;、本地仓库&#xff08;Repository或Git Directory&#xff09;。如果在加上远程的Git仓库&#xff08;Remote Directory&#xff0…

git的基本原理

刚刚接触到git和github&#xff0c;整理一部分相关原理帮助自己理解git命令和本地-远程的操作。 我们将这部分学习分为三部分&#xff1a;&#xff08;1&#xff09;本地仓库相关操作&#xff08;2&#xff09;远程仓库相关操作&#xff08;3&#xff09;本地-远程交互操作 本地…

Git原理及操作简介

Git原理及操作简介 一、Git是什么 Git是目前世界上最先进的分布式版本控制系统 工作原理 / 流程: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 二、SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中…

Git 工作原理

Git 工作原理 GIt简介Git 的基本原理Git的目录结构Git对象在之前我们提到过&#xff0c;Git是一套内容寻址&#xff08;content-addressable&#xff09;文件系统&#xff0c;那么Git是怎么进行寻址呢&#xff1f;Git对象的类型包括&#xff1a;BLOB、tree对象、commit对象。 对…

一文搞明白GIT——Git原理解析与常用命令

工作中经常用git&#xff0c;但是不少命令经常使用出现各种各样的问题&#xff0c;也不太理解其中的原理。今天专门总结一下git的原理&#xff0c;理解原理之后想实现什么样的功能直接找相应的命令即可。如有错误和不足&#xff0c;欢迎指正&#xff01; 一、 工作区 使用git…

Git 原理详解及实用指南

Git 原理详解及实用指南 什么是版本控制系统&#xff08;VCS&#xff09; 很多人认为 Git 难以理解的第一个门槛在于&#xff1a;所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚。其实分布式版本控制系统&#xff08;Distributed Version Control System - …

图解git原理

用了这么久git&#xff0c;你有没有想过git的原理是什么&#xff1f;为什么git做回退这么快&#xff1f;创建、切换分支也这么快&#xff1f;git的工作区、暂存区、本地仓库、远程仓库都分别对应怎样的实体&#xff1f;打开一个git仓&#xff0c;看看目录下的.git文件夹&#x…

Git 的原理

文章目录 什么是 Git&#xff1f;版本库是由什么构成的版本库&#xff08;项目文件夹&#xff09;的构成版本库&#xff08;对象数据库&#xff09;的结构提交的组成SHA1 算法 总结 暂存区什么样的文件&#xff0c;不应该上传到版本库中&#xff1f;查看暂存区清空暂存区选择性…