git 日常使用篇

1,153 阅读7分钟

git 日常使用

前言

此篇将是是我对git学习的一个阶段性总结,日常使用篇,希望方便自己查阅的同时也能帮助到大家🤭

贴出官方文档以便大家进一步学习 Git


初识 git

  • git 是目前世界上最先进的分布式版本控制系统。git的开发者是 Linus Torvalds 同样也是 Linus 系统的缔造者,简单来讲 git 的诞生就是有一家公司收回了作者对该家公司的版本控制系统使用权,之后作者就开发了一套属于自己的分布式版本控制系统。
  • 针对之前使用版本控制的经验,作者对他们的新系统定下了若干目标: 分支切换速度快 容量小(压缩) 简单的设计 完全分布式 对非线性开发模式的强力支持(允许上千个并行开发的分支) 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量) 自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设 定的目标。它的速度飞快,极其适合管理大项目,它还有着令人难以置信的非线性分支管理 系统可以应付各种复杂的项目开发需求。

基础概念(初始化)

工作中使用 git 前我们先做下基础配置

```
$ git config --global user.name  // 设置 用户名

$ git config --global user.name  // 查看 用户名

$ git config --global user.email // 设置 邮箱

$ git config --global user.email // 查看 邮箱

$ git init // 初始化 git 本地版本库

创建.gitignore文件 // 忽略某些文件,被忽略的文件是无法追踪到的(add .)
// 注意,如果已经被跟踪的文件,要先删除文件,在拖进来,可以生效

windows操作系统下面可以使用 everything 工具查找 .gitconfig 文件可直接手动修改其中配置
(后面配置别名也可以这样修改)
macOs操作系统下直接全局搜索打开相关文件即可

```

git的工作流程及区域

  • 使用 git之前先简述下 git 的使用流程。首先在工作区开发代码,完成后使用命令对代码进行跟踪并添加进一个叫做暂存区的地方,之后在通过命令把你的代码加上相关信息注释,保存到本地仓库。最后为了代码安全起见或者方便以后配置 ci / cd 流水线方便,我们把代码提交到远程仓库里面,至此一个简单的代码存储已经完成。
  • 如下图是根据个人理解简要画出的 git 流程图,此图主要包含了 git4个区域 和一些常见的操作。

image.png

  • 工作区: 平时开发改动代码的地方,是当前看到的最新内容,在开发过程只要文件发生了更改,在这个区域就可以通过 git status 查到,显示未跟踪文件,在这个区域可以使用 git add 将工作区文件加入暂存区。

  • 暂存区: 数据暂时存放的区域,暂存区标记了当前工作区中哪些内容是处于被 git 管理状态。在这个区域可以通过 git commit 把代码提交到本地版本库。

  • 本地仓库: 该仓库位于自己电脑本地,存放所有已经提交的数据,在这里的代码可以说是已经完成了一次版本管理。后面可以通过git push推送到远程仓库。

  • 远程仓库: 用来托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改。当本地代码丢失时,可以通过远程仓库拉取已经存储的代码。还可以通过远程仓库做 ci/cd 自动化部署项目。

基础命令

git clone

  • 从远程 git 仓库克隆项目
     $  git clone path // 克隆远程仓库代码到本地
     
     $  git clone -b branch path // 克隆指定分支的代码
    

git branch

  • 查看分支
     $  git branch          // 查看本地仓库分支情况
     
     $  git branch -a       // 查看本地&&远程分支情况
     
     $  git branch "newBranch" // 以当前分支为基础创建一个名字为 newBranch 的新分支 
     
     $  git branch -D branch // 强制删除指定分支
    

git checkout

  • 切换分支

     $  git checkout        // 查看分支
     
     $  git checkout branch // 切换分支
     
     $  git checkout -b newBranch // 创建并切换至新的分支 newBranch
     
     $  git checkout commitHASH -b  newBranch  // copy一个指定分支的提交记录并创建一个新的分支
     // 该指令也可以用作版本回滚的一种安全方式,了解更多该指令可以看我下面分享的这篇笔记
     
     $  git checkout . // 清理工作区 如果在工作区写了不想要的代码,可以使用这个命令
     // 注:该命令只能清空全部已修改的问题件, 但是对于新建的文件和文件夹无法清空,
     // 想要清空新建还未加入暂存区的文件需要组合 git clean -d 这个指令使用使用
    
  • git - 简述三种'代码回滚'方式

git status

  • 显示工作区状态
     $  git status // 可用于查看哪些文件已被跟踪/未跟踪
    

git add

  • 添加文件到暂存区
     $  git add fileName // 添加某个文件到暂存区,后面可以跟多个文件,以空格区分
     
     $  git add . // 这会将工作区所有的修改内容都添加到暂存区
    

git commit

  • 将暂存区的内容存储到本地仓库
     $  git commit -m '注释'  // 将暂存区代码存储至本地仓库,并添加注释
     
     $  git commit --amend   // 将最近的一次提交的信息进行撤回,给用户重新修改注释的机会 注:
    

git merge

  • 合并分支
     $  git merge branch    // 合并其他分支
     
     $  git merge --abort   // 合并遇到冲突时可选择取消冲突,一般情况都是选择解决
    
  • 想了解更多合并分支知识,可以看下之前我写的这篇分享
  • merge 与 reabse 究竟谁是优解

git fetch

  • 拉取远程仓库的更改
     $  git fetch            // 获取远程仓库所有分支的更新
    

git pull

  • 拉取远程仓库的更改并合并远程分支到本地,等同于 git fetch + get merge
     $  git pull origin(远程主机名) branch(远程分支名):branch(本地分支名) // 后面那个不写,默认当前分支
     
     $  git pull --reabse origin(远程主机名) branch(远程分支名):branch(本地分支名)
     // 使用等同于 git fetch + git rebase rebase和merge的差异,可以看下我写的下面这篇分享
    
  • merge 与 reabse 差异

git push

  • 将本地文件推送到远程仓库中
     $  git push origin(远程主机名) branch // 推送当前分支代码至远程分支
     
     $  git push origin(远程主机名) --delete branch(远程分支名) // 删除远程分支
    

git log

  • 查看提交记录

      $  git log --oneline // 查看提交记录commitHash简约版
      
      $  git log --graph --oneline // 查看提交记录点线图简约版
      $  git reflog  // 查看所有分支的所有操作记录
      // 上面两个指令去掉--oneline 可以查看的信息更全面
    
  • 你所不知道的一些 git 相关的小技能

工作场景

后悔药

  • 我们在日常开发时,偶尔会不小心提交错代码,分别在工作区,暂存区,版本库等以上场景. 来让我们看看,有什么好的解决方案

     $ git checkout .  // 指令可清空工作区
     
     $ git restore --staged filePath  //  指令可撤回暂存区的代码回到工作区
    
     $ git restore  filePath          //  指令可撤回暂存区的代码取消跟踪状态
     
     $ git merge --abort              //  使用merge合并冲突时取消并撤回
     
     $ git commit --amend  //  可直接打开.git文件夹下的存储注释的相关文件夹,直接快捷修改上一次提交文件
      // 在几个增删改linux操作后,退出文件夹即可完成二次提交,此时会更新log中修改的commitHASH值
     
    
  • 以上分别在 工作区,暂存区,commit提交对象相关进行了撤销,那么我们在本地/远程版本库中操作有误,又该怎么样弥补呢

  • 这是我专门写的介绍这种回滚方式分享,有兴趣的同学可以看看 url: git - 简述三种'代码回滚'方式

git rebase 优化你的提交记录

  • 我们使用 git 时候会发现使用 git merge 合并的代码会产生分叉,及多一条提交记录。有时候过多的分叉和冗余的提交记录会影响我们阅读 log 那么我们该怎么优化一下呢,git rebase 就是一种解决方案

     $ git rebase branch   // 合并其他分支,并产生变基
     
     $ git rebase continue  //  rebase在合并分支时,产生冲突不会产生多余的提交记录,解决完冲突使用该命令继续合并即可
    
     $ git rebase -i HEAD~x //  该命令可以合并到距离当前HEAD最近的几个历史提交 git rebase -i HEAD~3 3就是近3次提交记录合并
     
     $ git rebase -i commitHash //也可以使用该命令进行指定的commitHash的下一个到当前HEAD合并
    
    
  • 以上分别在 工作区,暂存区,commit提交对象相关进行了撤销,那么我们在本地/远程版本库中操作有误,又该怎么样弥补呢

  • 这是我专门写的介绍这种回滚方式分享,有兴趣的同学可以看看 url: git - 简述三种'代码回滚'方式

git cherry-pick 选择合并

  • 想象一下这个场景,想在某个稳定版本上,添加一个刚开发完成的版本中的功能。就可以使用 Cherry-pick 命令,将这个功能相关的 commit 提取出来,合入稳定版本的分支上。

      $  git reflog  // 查看本地所有分支提交记录,拿到相关commitHASH(提交索引)
      
      $  git cherry-pick commitHASH filePath  // a分支从b分支中拿到稳定功能提交记录,进行合并。
    

文件版本差异比较

  • 在日常工作中我们有时候会不小心在某个函数代码块放置错了代码,发现项目运行跑不起来,又不知晓我们改动了哪里这时候,想先看下当前文件代码与历史记录,在不借助插件的情况下我们该如何操作呢?
  • 当前文件工作区代码与当前文件历史提交记录做比较

      $  git log --oneline  // 查看分支未删减的提交记录简易版,拿到相关commitHASH(提交索引)
      
      $  git diff commitHASH filePath  // 拿当前工作区代码与拿到的历史提交记录的当前文件做比较。
    
  • 当前文件暂存区代码与当前文件历史提交记录做比较

      $  git log --oneline  // 查看分支未删减的提交记录简易版,拿到相关commitHASH(提交索引)
      
      $  git diff --cached commitHASH filePath  // 拿当前工作区代码与拿到的历史提交记录的当前文件做比较。
    
  • 当前文件版本库代码不同历史提交记录做比较

      $  git log --oneline  // 查看分支未删减的提交记录简易版,拿到相关commitHASH(提交索引)
      
      $  git diff  commitHASH  commitHASH2 filePath  // 当前文件下历史记录做比较
    
  • 注:以上比较去掉 filePath 可做比较当前项目下全文件差异

代码暂存

  • 在日常工作中我们有时候开发a功能的时候,产品这时候告诉你b功能比较紧急,但是此时的代码又不构成一次提交,这时我们该怎么做呢
  • 增:存储当前已跟踪的文件在暂存区中但又不构成一次提交的文件

      $  git stash   // 将未完成的修改保存到一个栈上,而你可以在任何时候重新应用这些改动
    
  • 查:查看当前已经存储的暂存索引

      $  git stash list   // 查看存储
    
  • 用:根据stash索引拿到存储的内容

      $  git stash apply stash@{index}  // 查看存储的哪些内容,根据stash索引拿到存储的内容
    
  • 删:移除存储的内容

      $  git stash drop stash@{index} :// 丢弃stash@{index}存储,从列表中删除这个存储
      
      $  git stash clear// 删除所有缓存的stash
    

配别名

  • 在日常工作中 git 并不会在你输入部分命令时自动推断出你想要的命令。 如果不想每次都输入 完整的 git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。

      $  git config --global alias.st status  // 配置全局git status命令别名
      
      $  git st //即可 
      
      $  git config --global alias.ci commit  // 配置全局git commit 命令别名
      
      $  git ci -m "xxx xxx xxx..."  //即可 
      
      一次配置多个别名,直接修改配置文件
      
      win下面的可以用 everything工具直接搜全局 .gitconfig 文件位置,在其中修改即可.
    

打标签

  • 一般有的项目组会在一个版本迭代的时候,打一个标签,表示一个版本,我们会在开源项目经常看到这种。

  • image.png

    $  git tag v1.0.1     // 打了个 v1.0.1 的标签
    
    $  git tag            // 查看所有标签 这里使用 git tag 也可
    
    $  git show v1.0.1    // 查看特定标签 可查看当前标签的更多分支信息
    
    $  git checkout tag // 切换到指定标签,之后可以使用 git checkout -b newBranch 以当前标签为基础生成一个新的分支
    
    $  git push origin(远程主机名) tag //推送指定标签到远程仓库
    
    $  git tag -d tag   // 删除指定标签标签
    

远程仓库地址

  • 日常开发中,git 仓库存放的地址难免会更换域名/ip等情况,这个时候如果远程地址发生了变化,我们本地仓库也需要重新产生链接
    $  git remote add origin url     // 给本地添加一个远程仓库地址
    
    $  git remote -v                 // 查看远程仓库地址
    
    $  git remote set-url origin url // 更新远程仓库地址
    

总结

  • 终于完成了自己记录 git 的一个里程碑,以上操作是在日常工作中多次使用的。合理使用 git 会让自己的开发得到事半功倍的加成,希望我在记录分享的同时,能在不同程度上给到同学们收获,大家看到有分歧的地方,欢迎在评论区一起沟通进步🤭。

参考文献

作者其他 git 相关的分享