ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Git分布式版本控制系统

2021-06-29 14:03:01  阅读:128  来源: 互联网

标签:文件 git 仓库 控制系统 -- Git 分支 分布式


1. Git概述

1.1 Git简介

Git是一款免费、开源的分布式版本控制系统,用于明捷高效处理任何或小或大的项目。Git是Linus为了帮助管理Linux内核开发而开发的一个开源版本控制软件。

1.2 Git的优点

  • 更顺畅的工作流程,开发过程中,完全可以离线操作
  • 快速,Git分布式架构使得本地仓库包含所有的历史版本信息,可以在不同的版本之间快速切换
  • 弹性的本地分支,在svn下,建一个分支需要把源代码复制到另外一个文件夹,而在Git下,创建分支的代价是非常小的,只需一条命令
  • 仓库目录结构简洁,用Git复制一个项目,只会在项目根目录创建一个.git的目录,而其他目录很干净
  • 内容按元数据方式存储,所有的版本信息都位于.git目录下
  • 完整性好,更易于协作开发
  • 用户群大,现在已经有成千上万个开源项目采用Git来做项目管理,github上更是有无数个代码仓库

2. Git的工作原理

2.1 基本概述

在Git中的绝大多数操作都只需要访问本地文件和资源,不用连网,因为Git在本地磁盘上就保存着当前项目的历史更新,所以处理起来速度很快。

如果想要看当前版本的文件和一个月前的版本之间有何差异,Git会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事。

2.2 Git的状态

对于任何一个文件,在Git内部都只有三种状态:已修改(modified)、已暂存(storaged)和 已提交(committed)

  • 已修改:表示修改了某个文件,但是还没有提交保存
  • 已暂存:表示把已修改的文件放在下次提交时要保存的清单中
  • 已提交:表示该文件已经被安全的保存在本地数据库中了

2.3 Git文件流转的区域

  • 使用Git管理项目时,文件流转的区域:Git的工作目录、暂存区域、本地仓库、远程仓库

1)工作区

本地电脑存放项目文件的地方

2)暂存区:(Index/Stage)

本地项目目录中的 .git 目录称之为版本库。

.git 目录包含了两个部分,一个是暂存区(Index或者Stage),就是暂时存放文件的地方,通常使用add命令将工作区的文件添加到暂存区里。

3)本地仓库

.git 目录中还包括git自动创建的maste分支,并且将HEAD指针指向master分支。

使用commit命令可以将暂存区中的文件添加到本地仓库中。

4)远程仓库

不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可。

2.4 Git的基本工作流程

1)工作流程

每个项目都有一个Git目录(如果是 git clone 出来的话,就是其中 .git 的目录;如果是 git clone  --bare 的话,新建的目录本身就是Git目录)。它是Git用来保存元数据和对象数据库的地方。每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫工作目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。

所谓的暂存区域只不过是一个简单的文件,一般都放置Git目录中。有时会把这个文件叫做索引文件,但是标准叫法还是暂存区域。

  1. 在工作目录中修改某些文件
  2. 对修改或的文件进行快照,然后保存到暂存区域
  3. 提交更新,将保持在暂存区域的文件快照转储到Git目录中

2)可以从文件所处的位置来判断状态

  • 如果是Git目录中保存着特定版本文件,就属于已提交状态
  • 如果做了修改并已放入暂存区域,就属于已暂存状态
  • 如果自上次取出后,做了修改但是还没有放到暂存区域,就是已修改状态

3. Git的使用方法

3.1 基本使用命令

1)基本使用

git  config   --global  user.name  "xxx"   // 配置用户名
//上传本地 repository 到服务器上的时候,在 Github 上会显示这里配置的上传者信息
git  config   --global  user.email  "xxx"  // 配置邮箱
// 以上配置信息执行一次即可

git  init  /path           // 创建本地仓库(repository),初始化
// 会在目录下创建一个 .git 目录,.git 目录里存储了所有的版本信息、标记等信息

git  add  xxx.html        // 从本地仓库增删,结果将会保存到本机的缓存里面
git  add  -A              // 提交全部修改
git   add  .                // 管理全部没有被管理的文件

git  commit   -m  "注释"    // 提交,把本机缓存中的内容提交到本机的 HEAD 里面

git  status                // 查看状态

git log                    // 查看版本,以确定需要回到的时刻点
git log --pretty=oneline   // 每行显示一条版本记录
git log --graph            // 以简单的图的方式来显示

git reset --hard 6774dbf8d5116fa6b99875db461321b8eaad60c1 
// 进行版本回退,后面的字符就是git log命令显示结果中的版本号

git reflog  
// 回到过去的版本号后,如果想要回到最新的版本的时候,就要用这里命令来找到最新的版本号,然后再用reset回到那个版本号

git  config  --list       // 查看配置列表

git  rm  xxx              // 从本地仓库删除指定文件,将文件从暂存区中删除
git  rm  -r  xxx         // 从本地仓库删除指定文件夹

2)推送到远端

git clone https://github.com/hgzerowzh/blog_website.git
// 将github上的仓库克隆到本地,它内部已经起了别名了,也就是后面再进行推送的时候,已经不需要再添加了
git add readme.txt

git  remote  add  origin  git@github.com:xxx/first.git
// 把本地仓库和远程仓库关联起来,如果不执行这个命令,则每次 push 的时候都需要指定远程服务器的地址

git   remote -v 
// 查看origin的相关信息

git  push  origin  master  //把本地的commit push到远程服务器
// origin 也就是之前 git remote add origin 那个命令里面的 origin,origin 替代了服务器仓库地址:git  push  git@github.com:xxx/first.git   master
// master表示推送的是本地的master分支
// 如果显示没有权限,则要去修改 .git/config文件中的origin配置段:url = https://用户名:密码@github.com/用户名/仓库名.git

git  pull  origin  master //从远程服务器pull新的改动
  // 上面一个命令等同于以下两个命令:
    git  fetch  origin  master
        git  merge  origin/master

git  push  origin  master
//把本地的 commit  push 到远程仓库中
//可以使用  .gitignore 文件忽略指定的内容

# 使用ssh认证只需要把生成的公钥上传到github上即可
// 生成公私钥:ssh-keygen -t rsa -C "注册邮箱"

3.2 撤销

1)撤销的相关命令

# 将暂存区的文件覆盖工作目录中的文件,不加 -- 文件名 则表示覆盖全部文件
git checkout  --  文件名

# 删除工作区文件,并且也从暂存区删除对应文件的记录
git rm xxx.file

# 将文件从暂存区中删除,但是工作区依然还有该文件
git rm --cached 文件名

# 取消暂存区已经暂存的文件
git reset HEAD  ...
git reset HEAD~2   # 往前撤销2次

# 将git仓库中指定的更新记录恢复出来,并且覆盖暂存区和工作目录
git reset --hard  commitID

# git reset的参数:
--soft  缓存区和工作目录都不会改变,只会改变库里面的
--mixed 默认选项,缓存区和你指定的提交同步,但工作目录不会受影响(没有提交的东西需不需要保留)
--hard 缓存区和工作目录都同步到你指定的提交

2)git reset说明

# 当检测到文件路径时,git reset将缓存区同步到你指定的那个提交
# 比如,下面这个命令会将倒数第二个提交中的foo.py加入到缓存区中,供下一个提交使用
git reset HEAD~2 foo.py

# 运行git reset HEAD foo.py会将当前的foo.py从缓存区中移除出去,
# 而不会影响工作目录中对foo.py的更改

# --soft 、--mixed、--hard对文件层面的git reset毫无作用
# 因为缓存区中的文件一定会变化,而工作目录中的文件一定不变

3)使用场景

3.3 分支管理

1)分支:生成副本,避免影响开发主线

  • 主分支(master):第一次向git仓库提交更新记录时自动产生的一个分支
  • 开发分支(develop):作为开发的分支,基于master分支创建
  • 功能分支(feature):作为开发具体功能的分支基于开发分支创建

2)分支管理命令

git branch                 // 查看分支
git branch 分支名称        // 创建分支
git checkout 分支名称      // 切换分支(切换指针)
git merge 被合并的分支     // 合并分支,要先切回master分支,然后在master分支上合并其他分支
git branch -d 分支名称     // 删除分支,分支合并后才允许被删除,可以用-D大写强制删除
# 在删除分支的时候,一定要先退出要删除的分支,然后才能删除

git branch --merged        // 查看已经被merge的分支
git branch --no-merged     // 查看还没有被merge的分支
  • 线上代码出bug紧急修复:
    • 创建一个新的分支,在这个分支上对bug进行修复
    • 修复完成之后,将新的分支合并到主分支(master)中去,然后删除这个bug分支

3)冲突的产生

  • 比如没有拉取就进行提交操作,可能就会产生冲突
    • 解决方法:先pull一下,然后需要开发之间进行协商,进行代码的取舍,然后重新提交
  • 如果是分支合并出现了冲突,就需要手动进行冲突修复

3.4 rebase的使用

将多个提交记录整合

记录合并语法:

  • git  rebase  -i  HEAD~3
    • 将从HEAD开始的三条记录进行合并
  • git  rebase  -i  记录编号
    • 将从HEAD开始到此记录编号的所有记录全部合并

然后进行记录合并:

  • s 表示将当前版本合并到它上一个版本中去
  • 下面表示将v3和v4的记录都合并到v2中去

接着修改提交记录:

  • 原本是这样:
  • 修改成:

最后查看提交记录:

  • 注意:不要合并已经push到远程仓库的记录

3.5 打tag并推送到远端

# 查看log
git log

# 为当前分支打上tag:v1
git tag -a v1 -m "第一版"

# 将tag推送到远程仓库
git push origin --tag


# 创建dev并切换到dev分支
git checkout -b dev 

# 把dev分支推送到远程仓库
git push origin dev

3.6 忽略文件

某些文件我们不想让其提交到远程仓库,此时就可以使用“忽略文件”机制来实现需求。

忽略文件需要新建一个 .gitignore的文件,该文件用于声明忽略文件或不忽略文件的规则,规则对当前目录及其子目录生效。

常见规则的写法:

/mtk/            // 过滤整个文件夹
*.zip            // 过滤所有.zip文件
/mtk/do.c        // 过滤某个具体文件
!index.php       // 不过滤具体某个文件

3.7 将项目推送到Github

1)创建本机密钥对

# 在gitbash中键入如下命令
ssh-keygen -t rsa -C "hgzerowzh"

命令执行成功后会在 ~/.ssh/ 目录中创建一对密钥,其中以 .pub结尾是公钥。

2)在github上创建仓库后进入设置

  • 在操作之前要先创建一个仓库

3)将代码推送到github

# 将本地仓库和远程仓库关联起来
git remote add origin https://github.com/hgzerowzh/gittest.git
# 将代码推送到远端仓库
git push origin master
  • 命令执行完后,会要求输入用户名和密码,填写后login即可

4)推送成功

$ git push origin master
Logon failed, use ctrl+c to cancel basic credential prompt.
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (11/11), 910 bytes | 303.00 KiB/s, done.
Total 11 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), done.
To https://github.com/hgzerowzh/gittest.git
 * [new branch]      master -> master

4. 搭建Git服务器

4.1 整体环境

  • 服务端:
        c7_node_03
        10.0.0.203
  • 客户端:
        c7_node_04
        10.0.0.204
  • 软件安装:
        服务端和客户端都安装git
        yum  install  git  -y

4.2 服务端创建仓库

useradd -m git
passwd git
// 输入git用户的密码
su - git

mkdir project.git
cd project.git

[git@c7_node_03 project.git]$ git init --bare
Initialized empty Git repository in /home/git/project.git/
// 如果是 git clone 出来的话,就是其中 .git 的目录
// 如果是 git clone  --bare 的话,新建的目录本身就是Git目录

4.3 客户端从仓库拉取和提交代码

mkdir git
cd git/

git clone git@10.0.0.203:/home/git/project.git

cd project/
echo "NO.1" > 1.html

git config --global user.name "hgzero"          // 设置用户名(仓库名)
git config --global user.email "hgzero@qq.com"  // 设置邮件地址

git add .               // 将当前目录加入暂缓区
git commit -m "NO.1"    // 提交到本地仓库,会输出很多欢迎信息,用于协同操作提示作用

git remote add orgin git@10.0.0.203:/home/git/project.git  
                        // 确认本地和远程的状态是否正常

git push origin master  // 本地推送到远程服务器

# 然后再更新一个版本
vim 1.html              // 添加点内容,做点修改
git add 1.html 
git commit -m "NO.2"
git push

5. Windows下使用Git

一些Git图形化工具:

  • GitHub for Desktop
  • Source tree
  • TortoiseGit

Windows下安装Tortoisegit之前,需要安装msysgit,这样tortoisegit才能正常运转

更详细的Git教程:

标签:文件,git,仓库,控制系统,--,Git,分支,分布式
来源: https://www.cnblogs.com/haolb123/p/14949705.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有