• Git详解


    Git是一个开源的分布式版本控制系统,常用于软件开发中对代码版本管理。Git具有版本控制、协作开发、分支管理、代码审查等功能,能够记录每次代码修改的内容和时间,并能够回滚到任意历史版本,方便团队协作和代码维护。

    Git的基本概念包括仓库(repository)、分支(branch)、提交(commit)和合并(merge)。

    1. 仓库(repository)

    仓库是Git存储代码的基本单位,可以理解为一个目录,其中包含着项目的所有文件和历史提交记录。Git支持本地仓库和远程仓库,本地仓库存储在开发者的计算机上,而远程仓库通常存储在云端,如GitHub、GitLab等。

    1. 分支(branch)

    分支是Git非常重要的概念,它允许开发者在不影响主干代码的情况下,进行代码的修改和开发。每一个分支都是当前代码仓库中的一个拷贝,可以独立进行修改和版本管理。通过分支可以实现多人协作开发,同时也方便代码的维护和管理。

    1. 提交(commit)

    提交是Git在代码仓库中保存修改后的版本。每一次提交都会记录该次修改的作者、时间和修改内容等信息。Git中的提交可以在本地进行,也可以在远程仓库进行。

    1. 合并(merge)

    合并是将两个分支或多个分支的修改集成到一起,以合并后的版本作为基础版本,可以保留各自修改的内容。在多人协作开发中,合并是非常重要的操作,可以避免代码冲突和重复开发的问题。

    安装git

    centos 自带git

    1. [root@git ~]# rpm -qa git
    2. git-1.8.3.1-11.el7.x86_64

    安装方法

    [root@git ~]# yum install git -y

    编译安装,可以安装新版本的git

    Git下载地址: Releases · git/git · GitHub

    1. # 安装依赖关系
    2. [root@git ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker
    3. # 编译安装
    4. [root@git ~]# tar -zxf git-2.0.0.tar.gz
    5. [root@git ~]# cd git-2.0.0
    6. [root@git ~]# ./configure --prefix=/usr/local/git # 没有文件可以略过
    7. [root@git ~]# make
    8. [root@git ~]# make install

    第一次运行git前的配置

    1. git config --global user.name "username" #配置git使用用户
    2. git config --global user.email "email@mail.com" #配置git使用邮箱
    3. git config --global color.ui true #语法高亮
    4. git config --list # 查看全局配置

    过程

    1. [root@gitlab ~]# git config --global user.name "newrain" #配置git使用用户
    2. [root@gitlab ~]# git config --global user.email "newrain@aliyun.com" #配置git使用邮箱
    3. [root@gitlab ~]# git config --global color.ui true #语法高亮
    4. [root@gitlab ~]# git config --list # 查看全局配置
    5. user.name=newrain
    6. user.mail=newrain@aliyun.com
    7. color.ui=true

    生成的配置文件

    1. [root@gitlab ~]# cd
    2. [root@gitlab ~]# cat .gitconfig
    3. [user]
    4. name = newrain
    5. email = newrain@aliyun.com
    6. [color]
    7. ui = true

    获取git仓库

    创建个远程裸库

    1. 创建目录
    2. [root@yuancheng ~]# mkdir /git
    3. [root@yuancheng ~]# cd /git
    4. [root@yuancheng git]# ls
    5. 创建裸库
    6. [root@yuancheng git]# git init --bare ml.git
    7. 初始化空的 Git 版本库于 /git/ml.git/
    8. [root@yuancheng git]# ls
    9. ml.git
    10. 授权
    11. [root@yuancheng git]# chown -R git.git ml.git/

    克隆远程库生成本地的仓库

    1. 如果是另外一台虚拟机,那么也得进行git配置
    2. git config --global user.name "username" #配置git使用用户
    3. git config --global user.email "email@mail.com" #配置git使用邮箱
    4. git config --global color.ui true #语法高亮
    5. 克隆
    6. git clone git@192.168.249.156:/git-root/shell.git

    语法就是: git clone  + 你要克隆的IP:+路径

    创建本地库上传至远程库

    1. 创建本地空库
    2. [root@bendi ~]# git init cloud
    3. 初始化空的 Git 版本库于 /root/cloud/.git/
    4. [root@bendi ~]# cd cloud/
    5. 指定远程仓库
    6. [root@bendi cloud]# git remote add origin 192.168.231.235:/git/ml.git
    7. 拉取远程仓库的项目
    8. [root@bendi cloud]# git pull 192.168.231.235:/git/ml.git
    9. root@192.168.231.235's password:
    10. remote: Counting objects: 12, done.
    11. remote: Compressing objects: 100% (7/7), done.
    12. remote: Total 12 (delta 2), reused 0 (delta 0)
    13. Unpacking objects: 100% (12/12), done.
    14. 来自 192.168.231.235:/git/ml
    15. * branch HEAD -> FETCH_HEAD
    16. 拉取成功
    17. [root@bendi cloud]# ls
    18. 123.txt test1.txt test2.txt test3.txt
    19. [root@bendi cloud]# ls -a
    20. . .. 123.txt .git test1.txt test2.txt test3.txt
    21. 进入仓库
    22. [root@bendi cloud]# cd .git
    23. [root@bendi .git]# ls
    24. branches description HEAD index logs refs
    25. config FETCH_HEAD hooks info objects

    在本地仓库写好数据上传至远程仓库

    1. 创建文件
    2. [root@bendi cloud]# echo 'abc' > abc.txt
    3. 上传到暂存区,object只有一个内容
    4. [root@bendi cloud]# git add abc.txt
    5. 上传至本地仓库,object下生成内容,会有数据的信息和大小
    6. [root@bendi cloud]# git commit -m 'abc'
    7. [master 2530c4c] abc
    8. 1 file changed, 1 insertion(+)
    9. create mode 100644 abc.txt
    10. 上传至远程仓库
    11. [root@bendi cloud]# git push origin master
    12. root@192.168.231.235's password:
    13. Counting objects: 4, done.
    14. Delta compression using up to 8 threads.
    15. Compressing objects: 100% (2/2), done.
    16. Writing objects: 100% (3/3), 246 bytes | 0 bytes/s, done.
    17. Total 3 (delta 1), reused 0 (delta 0)
    18. To 192.168.231.235:/git/ml.git
    19. 3488352..2530c4c master -> master

    文件的状态变化周期

    查看仓库内的上传上来的数据

    1. 上传到远程仓库的代码都在 仓库下的object目录下
    2. [root@localhost shell.git]# cd objects/
    3. [root@localhost objects]# ls
    4. 19 30 c4 info pack
    5. 查看结构
    6. [root@localhost objects]# tree
    7. .
    8. ├── 19
    9. │   └── 0a18037c64c43e6b11489df4bf0b9eb6d2c9bf
    10. ├── 30
    11. │   └── 934b5e119e7d374ae4bdc95f0a78529dce3378
    12. ├── c4
    13. │   └── e7906139a764188f373d51cc188a7f578b07f5
    14. ├── info
    15. └── pack
    16. 5 directories, 3 files
    17. 查看数据信息
    18. [root@localhost objects]# git cat-file -p 190a1803
    19. 123
    20. [root@localhost objects]# git cat-file -p 30934
    21. 100644 blob 190a18037c64c43e6b11489df4bf0b9eb6d2c9bf 123.txt
    22. [root@localhost objects]# git cat-file -p c4e790
    23. tree 30934b5e119e7d374ae4bdc95f0a78529dce3378
    24. author newrain <newrain@aliyun.com> 1700473533 +0800
    25. committer newrain <newrain@aliyun.com> 1700473533 +0800
    26. 123

    git cat-file -p +(tree显示的内容,只需要加目录下和目录下的前几位字母即可)

    git cat-file -s 查看大小

    git cat-file -t 查看类型

    命令之git status

    git status命令用于显示工作目录和暂存区的状态。它可以告诉你哪些文件被修改过,哪些文件已经被暂存,哪些文件还没有被跟踪等等。

    git常见命令操作

    命令命令说明
    #add添加文件内容至索引
    bisect通过二分查找定位引入 bug 的变更
    #branch列出、创建或删除分支
    #checkout检出一个分支或路径到工作区
    #clone克隆一个版本库到一个新目录
    #commit记录变更到版本库
    #diff显示提交之间、提交和工作区之间等的差异
    fetch从另外一个版本库下载对象和引用
    grep输出和模式匹配的行
    #init创建一个空的
    #log显示提交日志
    #merge合并两个或更多开发历史
    #mv移动或重命名一个文件、目录或符号链接
    #pull获取并合并另外的版本库或一个本地分支
    #push更新远程引用和相关的对象
    rebase本地提交转移至更新后的上游分支中
    #reset重置当前HEAD到指定状态
    #rm从工作区和索引中删除文件
    show显示各种类型的对象
    #status显示工作区状态
    #tag创建、列出、删除或校验一个GPG签名的 tag 对象

    查看历史命令

    git log #→查看提交历史记录

    git log -2 #→查看最近几条记录

    git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异

    git log --stat -2 #→--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息

    git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息

    git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录

    git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名。

    实践

    1. [root@bendi cloud]# git log
    2. commit 3450be09f9358c5852973443e2ac5b754773aa50
    3. Author: ml <ml@11.com>
    4. Date: Mon Nov 20 14:08:48 2023 +0800
    5. 3333
    6. commit 620d9c2f7cd5c3fb2e0dc84771549cec29faf752
    7. Author: ml <ml@11.com>
    8. Date: Mon Nov 20 10:10:58 2023 +0800
    9. zzzz commit
    10. commit 63e83071fb506a671f2930038b7cfcfd24dacf9b
    11. Author: ml <ml@11.com>
    12. Date: Mon Nov 20 09:30:28 2023 +0800
    13. first commit

    现在有这些文件

    1. [root@bendi cloud]# ls
    2. test1.txt test2.txt test3.txt

    还原历史数据

    Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。

    git reset --hard hash

    git reset --hard HEAD^ #→还原历史提交版本上一次

    git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统

    会自动匹配)

    测试

    1. [root@bendi cloud]# git reset --hard 63e8307
    2. HEAD 现在位于 63e8307 first commit
    3. 查看数据
    4. [root@bendi cloud]# ls
    5. test1.txt

    还原未来数据

    什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了。

    git reflog #→查看未来历史更新点

    测试命令

    1. [root@bendi cloud]# git reflog
    2. 63e8307 HEAD@{0}: reset: moving to 63e8307
    3. 3450be0 HEAD@{1}: commit: 3333
    4. 620d9c2 HEAD@{2}: initial pull
    5. 开始还原
    6. [root@bendi cloud]# git reset --hard 3450be0
    7. HEAD 现在位于 3450be0 3333
    8. 查看还原数据
    9. [root@bendi cloud]# ls
    10. test1.txt test2.txt test3.txt

    删除git内的文件

    前提:创建一个文件,将其添加到暂存区

    1. [root@bendi cloud]# git status
    2. # 位于分支 master
    3. 无文件要提交,干净的工作区
    4. [root@bendi cloud]# echo 123 > 1.txt
    5. [root@bendi cloud]# ls
    6. 1.txt test1.txt test2.txt
    7. [root@bendi cloud]# git status
    8. # 位于分支 master
    9. # 未跟踪的文件:
    10. # (使用 "git add ..." 以包含要提交的内容)
    11. #
    12. # 1.txt
    13. 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
    14. 添加到暂存区
    15. [root@bendi cloud]# git add 1.txt
    16. [root@bendi cloud]# git status
    17. # 位于分支 master
    18. # 要提交的变更:
    19. # (使用 "git reset HEAD ..." 撤出暂存区)
    20. #
    21. # 新文件: 1.txt
    22. #

    说明:

    没有添加到暂存区的数据直接rm删除即可。

    已经添加到暂存区数据:

    git rm --cached database

    将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)

    git rm -f database

    将文件数据从git暂存区和工作目录一起删除

    由于前提文件已经添加到暂存区,因此,只是rm --cached只会删除暂存区,源文件还在

    1. [root@bendi cloud]# git rm --cached 1.txt
    2. rm '1.txt'
    3. [root@bendi cloud]# ls
    4. 1.txt test1.txt test2.txt
    5. [root@bendi cloud]# git status
    6. # 位于分支 master
    7. # 未跟踪的文件:
    8. # (使用 "git add ..." 以包含要提交的内容)
    9. #
    10. # 1.txt
    11. 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

    要将源文件以及暂存区的文件全部删除

    1. [root@bendi cloud]# git status
    2. # 位于分支 master
    3. # 要提交的变更:
    4. # (使用 "git reset HEAD ..." 撤出暂存区)
    5. #
    6. # 新文件: 1.txt
    7. #
    8. !!!!
    9. [root@bendi cloud]# git rm -f 1.txt
    10. rm '1.txt'
    11. [root@bendi cloud]# ls
    12. test1.txt test2.txt

    重命名暂存区数据

    没有添加到暂存区的数据直接mv/rename改名即可。

    已经添加到暂存区的数据

    1. [root@bendi cloud]# ls
    2. 123.txt aaa.txt test1.txt
    3. [root@bendi cloud]# git mv 123.txt 456.txt
    4. [root@bendi cloud]# ls
    5. 456.txt aaa.txt test1.txt
    6. [root@bendi cloud]# git status
    7. # 位于分支 master
    8. # 要提交的变更:
    9. # (使用 "git reset HEAD ..." 撤出暂存区)
    10. #
    11. # 新文件: 456.txt
    12. #

    对已经添加到暂存区的数据,使用shell命令mv直接改名

    1. [root@bendi cloud]# mv 2.txt 3.txt
    2. [root@bendi cloud]# ls
    3. 3.txt
    4. [root@bendi cloud]# git status
    5. # 位于分支 master
    6. # 尚未暂存以备提交的变更:
    7. # (使用 "git add/rm ..." 更新要提交的内容)
    8. # (使用 "git checkout -- ..." 丢弃工作区的改动)
    9. #
    10. # 删除: 2.txt
    11. #
    12. # 未跟踪的文件:
    13. # (使用 "git add ..." 以包含要提交的内容)
    14. #
    15. # 3.txt

    他会先删除源文件,然后在创建3.txt

    分支

    在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。

    那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样。

    查看当前在哪个分支

    1. [root@bendi cloud]# git branch
    2. * master

    创建分支

    1. 查看远程仓库在哪个分支
    2. [root@yuancheng ml.git]# git branch
    3. * master
    4. 本地仓库
    5. [root@bendi cloud]# git branch
    6. * master
    7. 创建分支
    8. [root@bendi cloud]# git branch malong
    9. [root@bendi cloud]# git branch
    10. malong
    11. * master
    12. 上传分支
    13. [root@bendi cloud]# git push origin malong
    14. root@192.168.231.235's password:
    15. Total 0 (delta 0), reused 0 (delta 0)
    16. To 192.168.231.235:/git/ml.git
    17. * [new branch] malong -> malong
    18. 查看远程仓库的分支
    19. [root@yuancheng ml.git]# git branch
    20. malong
    21. * master

    切换分支

    1. [root@bendi cloud]# git branch
    2. malong
    3. * master
    4. 准备切换分支
    5. [root@bendi cloud]# git checkout malong
    6. 切换到分支 'malong'
    7. [root@bendi cloud]# git branch
    8. * malong
    9. master

    在malong分支进行修改,master分支不会有数据

    1. [root@bendi cloud]# git branch
    2. * malong
    3. master
    4. 在马龙分支创建提交数据
    5. [root@bendi cloud]# echo '123'> 123.txt
    6. [root@bendi cloud]# git add 123.txt
    7. [root@bendi cloud]# git commit -m '123'
    8. [malong 3488352] 123
    9. 1 file changed, 1 insertion(+)
    10. create mode 100644 123.txt
    11. [root@bendi cloud]# git push origin malong
    12. root@192.168.231.235's password:
    13. Counting objects: 4, done.
    14. Delta compression using up to 8 threads.
    15. Compressing objects: 100% (2/2), done.
    16. Writing objects: 100% (3/3), 303 bytes | 0 bytes/s, done.
    17. Total 3 (delta 0), reused 0 (delta 0)
    18. To 192.168.231.235:/git/ml.git
    19. 3450be0..3488352 malong -> malong
    20. [root@bendi cloud]# ls
    21. 123.txt test1.txt test2.txt test3.txt
    22. 切换回master分支
    23. [root@bendi cloud]# git checkout master
    24. 切换到分支 'master'
    25. [root@bendi cloud]# ls
    26. test1.txt test2.txt test3.txt
    27. [root@bendi cloud]# git status
    28. # 位于分支 master
    29. 无文件要提交,干净的工作区

    合并代码

    根据之前操作,malong分支上有123.txt 而master分支没有,进行合并

    1. 进行合并
    2. [root@bendi cloud]# git merge master malong
    3. 更新 3450be0..3488352
    4. Fast-forward
    5. 123.txt | 1 +
    6. 1 file changed, 1 insertion(+)
    7. create mode 100644 123.txt
    8. [root@bendi cloud]# ls
    9. 123.txt test1.txt test2.txt test3.txt
    10. [root@bendi cloud]# git branch
    11. malong
    12. * master

    删除分支

    1. [root@bendi cloud]# git branch
    2. malong
    3. * master
    4. [root@bendi cloud]# git branch -d malong
    5. 已删除分支 malong(曾为 3488352)。
    6. [root@bendi cloud]# git branch
    7. * master
    8. 强制删除分支
    9. git branch -D 加分支名

    总之,Git是一个非常强大、灵活和易于使用的版本控制系统,对于软件开发中的代码管理和协作非常有用。学习Git需要掌握其基本概念和操作,包括代码仓库的创建、分支的创建和合并、提交的管理等。同时需要注意Git的一些常见问题,如代码冲突、版本回滚等。

  • 相关阅读:
    基于SSM开发实现校园疫情防控管理系统
    [0CTF 2016]piapiapia
    Python爬虫编程思想(154):使用Scrapy处理登录页面
    【Python毕业设计源码】diango大学生职业推荐平台
    ICCV 2023|PViC:构建交互谓词视觉上下文,高效提升HOI Transformer检测性能
    【Python】 Python 文件与路径处理
    Java测试(12)---性能测试
    三剑客之 awk
    公司电脑禁用U盘的方法
    离线数仓搭建_02_服务器配置与数据生产
  • 原文地址:https://blog.csdn.net/m0_59933574/article/details/134511363