ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

  • 虚拟化服务

  • 数据库服务

    • MySQL笔记

    • ELK笔记

    • Redis笔记

    • MongoDB笔记

    • Git笔记

      • Git介绍与使用
        • Git介绍
          • Git
          • 版本控制介绍
          • 版本控制的分类
          • Git相关概念
        • Git命令
          • 签名配置命令
          • 工作区相关命令
          • 暂存区相关命令
          • 版本库相关命令
          • 远程仓库相关命令
          • 分支合并相关命令
        • Git强制删除历史版本
      • Gitlab部署与使用
  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 数据库服务
  • Git笔记
Hoshinozora
2023-03-10
目录

Git介绍与使用

# Git介绍

# Git

  • Git是一个免费的、开源的分布式版本控制系统。
  • 他可以快速高效地处理从小到大的各种项目。
  • 他的特点是易使用、性能极快、廉价的本地仓库、方便的智存区域和多个工作流分支的特性。

# 版本控制介绍

  • 版本控制系统是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。

  • 版本控制最重要的是可以记录文件修改的历史记录,从而让用户能够查看历史版本,方便版本切换。

  • 版本控制使得个人开发过渡到团队协作开发。

# 版本控制的分类

  • # 集中式版本控制系统
    • 集中式版本控制系统使用单一的集中管理服务器保存管理所有文件的修订版本。
    • 客户端可以通过访问这台服务器来取出、提交或更新文件。且每个人可以有不同的管理权限。
    • 代码放在中央服务器中,保证团队的人修改的是同一套代码。同时每一次修改就是一个新的版本,防止代码混乱。
    • 但缺点是单节点问题,如果节点故障宕机,那么就会造成无法进行版本控制(提交或取出等),甚至数据丢失。
  • # 分布式版本控制系统
    • 版本库可以存储在本地、远程仓库或者代码托管中心,但版本控制是在本地主机进行的。服务器断网的情况下,也可以进行开发,因为版本控制是在本地进行的。
    • 每个客户端保存的也都是完整的版本库,且版本控制在本地,解决了集中式版本控制的单点问题。
    • 通常也有一台充当"中央服务器"的服务器,但仅仅是用来方便"交换"修改,即便没有该节点也一样能工作。

# Git相关概念

image-20230310180534607

# 工作区

  • 存放本地文件的磁盘目录,电脑里能看到的目录。
  • 相关命令:git add - 将工作区文件添加到暂存区

# 暂存区(index)

  • 用于临时存储要提交到版本库的文件,一般存放在.git目录下的index文件中
  • 相关命令:git commit - 将暂存区文件提交到版本库

# 版本库(本地仓库)

  • 用于进行管理版本控制等,存放在工作区的隐藏目录.git,这个不算工作区,而是Git的版本库,这个目录里面的所有文件都可以被Git管理起来。
  • 相关命令:git push - 将本地版本库的版本推送到远程仓库

# 代码托管中心

  • 基于网络服务器的远程代码仓库,简称为远程仓库,比如:github、gitlab

# HEAD指针

  • HEAD指针指向的分支(比如Master分支),就是当前分支。

# Git分支

image-20230310233119071

  • 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交。
  • 再把HEAD指向dev,就表示当前分支在dev上。然后接下来对工作区的修改和提交就是针对dev分支了。

# Git合并

  • 假如我们在dev上的工作完成了,就可以把dev合并到master上。

  • 最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。 image-20230310233226403

  • 合并完分支后,甚至可以删除dev分支,删掉后,我们就剩下了一条master分支。 image-20230310233303006

# Git命令

Git命令必须在Git仓库目录下执行 (配置命令除外),也就是要切换到有.git目录的目录下。

# 签名配置命令

第一次执行Git命令前应当先配置签名信息,签名的作用是区分不同的操作者身份,是必须设置的,否则无法提交代码到版本库。

  • git config --global user.name [用户名] - 设置用户签名中的用户名
  • git config --global user.email [用户邮箱] - 设置用户签名中的用户邮箱

# 工作区相关命令

# git init

  • 初始化版本库,在没有.git/的目录下执行以进行初始化。

# git diff

  • git diff [文件名] - 比较文件在暂存区和工作区的差异。

  • git diff --cached [file] - 显示暂存区和上一次提交(commit)的差异。

# git status

查看当前所在目录的版本库状态。

  • On branch master - 表示当前在主分支
  • Untracked files - 表示Git还没有追踪下列文件

# git rm

  • git rm [文件名] - 将文件从暂存区和工作区中删除。

# git stash save

  • git stash save "记录名" - 保存工作区和缓存区为记录,会保存当前分支的工作区和缓存区的文件。
  • 比如突然要切换到另一个分支修改东西,但当前分支又修改了东西,但又没写完不想提交时,就可以使用stash进行临时保存记录。
  • 注意:在没有还执行add之前才能执行stash。

# git stash list

  • 查看所有保存的记录列表。

# git stash apply

  • git stash apply "记录名" - 从记录恢复到工作区和缓存区,不会删除用于恢复的记录。如果不指定记录名则默认恢复最新记录。

# git stash pop

  • git stash pop "记录名" - 从记录恢复到工作区和缓存区,会删除用于恢复的记录。如果不指定记录名则默认恢复最新记录。

# git stash drop

  • git stash drop "记录名" - 删除保存记录,如果不指定记录名则默认删除最新记录。

# 暂存区相关命令

# git add

  • git add [文件名] - 添加一个或多个文件、目录到暂存区,为.时则是添加当前目录下的所有文件到暂存区。
  • 工作区修改或新增的文件的内容会被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

# git rm

  • git rm --cached [文件名] - 将一个或多个文件、目录从暂存区移出。
  • 会从暂存区删除文件,工作区则不做出改变。

# git checkout

  • git checkout -- [文件名] - 将一个或多个文件、目录在工作区的修改或删除全部回退
  • 两种情况
    • 修改后还没有被放到暂存区,回退修改就回到最近一次提交版本库的状态
    • 修改后已经添加到暂存区,回退修改就回到最近一次添加到暂存区后的状态

# git reset HEAD

  • git reset HEAD [文件名] - 回退暂存区的修改,重新放回工作区
  • 配合checkout --可实现回退到上次提交

# 版本库相关命令

# git commit

  • git commit -m "提交的版本日志信息" [文件名<可选>] - 将暂存区的所有文件提交到版本库。
  • 暂存区的目录树写到版本库中,然后当前分支会指向刚刚提交的新的目录树。

# git reset --hard

  • git reset --hard [版本号] - 可直接指定切换的版本号,通过reflog查看

    • 或者版本号也可以指定:HEAD~n:表示上n个版本、HEAD^:表示上一个版本
  • 将暂存区与工作区都回退到指定版本,实际就是指向当前版本的HEAD指针所指向的目录树的改变

    ┌────┐
    │HEAD│
    └────┘
       │
       └──> ○ version 1.0
            │
            ○ version 1.1
            │
            ○ version 1.2
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

# git reflog

  • 查看分支的版本信息

# git log

  • 查看详细的版本信息

# 远程仓库相关命令

# git init --bare

  • git init --bare [仓库名].git - 远程仓主机中执行,创建一个空仓库

# git remote add

  • git remote add [远程仓库名] 远程主机用户@远程主机:远程仓库物理路径 - 添加远程仓库
  • "远程主机用户@远程主机:远程仓库"这一串是URL,是用于连接远程仓库的,如果远程主机SSH端口不是22端口,则应当指定SSH://开头,同时远程主机后面跟端口号

# git clone

  • git clone [远程仓库名] git@远程主机:远程仓库路径 - 克隆远程仓库到本地

# git push

  • git push [远程仓库名] [分支名] - 将指定分支推送到远程仓库
    • 如果是因为远程分支比本地的更新导致推送失败,则需要先用git pull尝试合并。如果合并有冲突,则解决冲突,并在本地提交。
  • 第一次推送时加上-u参数。Git就会把本地的master和远程的master关联起来,在以后推送或者拉取时就可以简化命令成git push

# git pull

  • git pull [远程仓库名] [分支名] - 将远程仓库的分支拉取到本地。
  • 需要设置本地分支与远程分支的对应关系,git branch --set-upstream-to [分支名] 远程仓库名/远程分支名。

# git remote -v

  • git remote -v [远程仓库名] - 查看远程仓库信息。

# git remote rm

  • git remote rm [远程仓库名] - 删除远程仓库连接。

# 分支合并相关命令

# git branch

  • 查看所有分支,当前分支前面会标一个*号。

# git branch [分支名]

  • 创建一个分支。

# git branch -d [分支名]

  • 删除一个已合并的分支。

# git branch -D [分支名]

  • 强制删除一个未合并的分支。

# git switch [分支名]

  • 切换到指定分支,同等于git checkout [分支名]。

# git switch -c [分支名]

  • 创建分支然后切换到该分支。

# git merge [分支名]

  • 合并指定分支到当前分支。
  • 默认是Fast-forward合并模式,快进模式合并就是直接把master指向dev的当前提交,所以合并速度非常快。
  • 加上--no-ff参数就可以用普通模式合并。
    • 合并后的历史有分支,git log能看出来曾经做过合并。
    • 而fast forward合并删除分支后就看不出来曾经做过合并。

# git cherry-pick [commit id]

  • 能够把另一个分支的一个或多个提交复制到当前分支。git log命令可以获取提交的commit的id。

# Git强制删除历史版本

# 删除所有提交历史记录,但将代码保持在当前状态,可以按照以下方式安全地执行此操作:
git checkout --orphan latest_branch
# 添加所有文件
git add -A
# 提交更改
git commit -am "commit message"
# 删除分支
git branch -D master
# 将当前分支重命名
git branch -m master
# 强制更新存储库
git push -f origin master
1
2
3
4
5
6
7
8
9
10
11
12
# 简写为以下:
git checkout --orphan latest_branch && \
git add -A && \
git commit -am "init" && \
git branch -D master && \
git branch -m master && \
git push -f origin master
1
2
3
4
5
6
7
#代码管理#Git
MongDB介绍与部署
Gitlab部署与使用

← MongDB介绍与部署 Gitlab部署与使用→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式