当前位置:   article > 正文

Git概念及工作原理总结_git工作原理

git工作原理

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
  • 1
  • 2
  • 3

2、克隆中心库到本地

  $ git clone +中心库地址
  • 1

3、新增和修改文件名

  $ git add +文件名

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

  $echo “first” >>>first

  $git add first

  提交:$git commit

  注:此操作是将所有缓存区的修改提交到本地版本库
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

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

(2)$ git rest HEAD+文件名

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

5、删除文件

 $ git rm 文件名

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

 eg: $ git rm second

 $ git commit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

(1)$ git checkout(HEAD/commitID)

 注:此操作将取消本地文件(未提交)已做的但未提交的修改,如果需回退当前目录下的所有修改
 文件,则可以通过“git checkout .”命令来完成各成。

 eg:$ git checkout -first

 (2) $ git clean -f

 注:清除本地未被跟踪的所有文件,使用时需要注意是否确定需要清除
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

7、重命名文件或目录

  $ git mv 原文件名 新文件名

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

  eg:$ git mv first first_new
  • 1
  • 2
  • 3
  • 4
  • 5

8、查看文件状态

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

9、比较文件

 $ git diff OldcommitID NewcommitID(前6位)

 注:比较文件/目录下所有文件修改前后的不同,不加CommitID,则比较本地的与缓存或缓存的与
 库中最新的。

 新添加的文件使用git diff的时候不能显示

 git diff和 git diff -cached的不同
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

10、查看修改日志

    $ gitk --all

   注:此操作将调出git日志的图形化界面,在相关的版本号上右击选择“Create new branch”
   来创建基于此项的新分支,需要运行Xming

   $ git log

   注:在命令行中查看log信息

   注意:查看日志信息只能看到本地的修改日志和已经获取到本地的远端修改日志,不能看到远端
   还没有获取到本地的修改日志。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

11、创建私有分支

   $ git branch 分支名 commitID

   $ git checkout -b 分支名 commitID

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

12、合并分支

    (1)直接合并$ git merge +分支名

      注:此操作是将“分支名”指示的分支合并到当前所在的分支,所以合并前必须切换到目标
      分支。

    (2)拣选合并 $ git cherry -pick commitID

      注:将某次特定提交合并到当前分支,首先合并前必须切换到目标分支。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

13、查看分支

   $ git branch

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

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

   $ git branch -mergerd

  注:查看已经合并到当前分支的所有分支。

  $ git branch -no -merged

 注:查看还没有合并到当前分支的所有分支。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

15、删除私有分支

   $ git branch -d/-D 分支名

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

16、重命名分支

    $ git branch -m oldbranch newbranch

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

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

   $ git push 远端库名称 本地分支名称:远程分支名称

   注:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远
   程分支名称可忽略。

   eg:$ git push origin new :new -br
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

18、更新当前模块

    $ git fetch 远端库名称(获取远端库的更新到本地库)

    $ git fetch origin

    $ git merge 远程库名称/分支名称(将中心库的更新合并到本地工作目录中)

    $ git merge origin/new -br
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

19、修改提交信息

   $git commit -m “新的提交信息” -amend

   注:此操作只能修改最新的一次提交,之前的提交无法修改。
  • 1
  • 2
  • 3

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

    $ git revert 全球版本号

   注:此操作将回退记录到历史的某一节点,并作为一次新的提交到库中。
  • 1
  • 2
  • 3

21、暂存本地修改

    $ git stash

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

22、二分法定位错误

   $ git bisect start

   $ git bisect bad CommitID

   $ git bisect good CommitID

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

23、解决冲突

   合并分支或者合并库上的更新到本地均会产生冲突。Git的冲突产生是由于同一文件的同一行
   内容。

   哪些情况会出现冲突:1.修改了同一个文件的同一行;2.文件被重命名为不同的名字;3.在一个
   分支上文件被删除在另一个分支上该文件被修改。
  • 1
  • 2
  • 3
  • 4
  • 5

24、变基

   $ git rebase 目标分支 原分支

   注:此操作将原分支变基到目标分支HEAD上。
  • 1
  • 2
  • 3

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

  $ git checkout mywork

  $ git rebase origin

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

24、忽略某些文件

   在git仓工作的根目录下面,创建gitignore文件,文件内容如下实例,同样gitignore文件也
   可以上传到库上,这样每次下载都可以记录忽略规则,如果将某个已经忽略的文件添加,使用
   $ git add -f文件名即可。

   * .a #忽略所有.a结尾的文件

   ! lib.a #但lib.a除外

   /TODO #仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO

   build/ #忽略build/目录下的所有文件

   doc/*.txt #会忽略build/目录下的所有文件

   doc/*.txt #会忽略doc/notes.txt但不包括 doc/server/arch.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

   $ git gui

   添加修改,删除文件时,可以直接通过“git gui”命令,调出图形界面,通过“stage changed”
   缓存文件(新添加的文件只能通过git add命令缓存),在提交信息处输入“提交信息”,然后
   通过“commit” 提交。
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/487788
推荐阅读
相关标签
  

闽ICP备14008679号