想学习使用git?学这一篇就够了!!!

avatar
搬砖人

哪部分写的不对望各位指出

什么是git?

git是分布式的版本管理系统。

集中式&分布式

集中式版本控制系统是将版本库集中的存放于中央服务器,每一次进行项目开发都需要在中央服务器获取最新版本,才可以继续编写代码,待代码编辑完成后,推送到中央服务器上,但获取代码及推送代码都需要联网。过于依赖服务器。

特点:

  • 必须要有中央服务器,必须联网
  • 一个人创建分支则所有人都会有

分布式版本控制系统没有中央服务器,每个人的电脑中都有完整的版本库,提高了代码存储的安全性。

  • 特点:

    • 相较于集中式的全程联网,分布式可在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 命令即可将改变提交至远程仓库。
    • 对比集中式会将项目所有文件存储在中央服务器,分布式中的文件会以更小的元数据形式存储,该举措极大程度上缩小了存储文件的体积

git操作

git操作流程

首先我们介绍具体操作流程过程中涉及到的几部分空间

  • workspace:工作区
  • Index:暂存区,又叫stage
  • repository:本地仓库
  • remote:远程仓库

git操作常用命令

  1. git config:git 相关配置。可配置用户名、邮箱,向仓库提交修改时,需要用户名和邮箱来跟踪记录提交者。

    // 配置用户名
    git config --global user.name "Your Name"
    // 配置用户的邮箱
    git config --global user.email "email@example.com"
    
  1. git init:初始化版本库。出现.git文件夹
  1. git add :将改动添加至暂存区
  • 添加所有文件

     git add .
    
  • 添加单个文件

     git add tyx.txt
    
  1. git commit :提交文件至本地仓库

    • -m:添加提交描述

       git commit -m 'feature: 样式修改'
      
    • -a:参数设置修改文件后不需要执行 git add 命令,直接来提交

       git commit -a
      
    • 我们也可以两个命令一起使用,添加文件的同时对本次操作进行描述

       git commit -am 'feature:样式修改'
      
    • --no-verify:忽略本次提交中检查出来的错误

  1. git push:推送本地分支至远程仓库
  1. git pull:拉取远程仓库内容到本地

    • git pull :拉取远程仓库中当前分支的内容

    • git pull origin :拉取远程仓库origin至本地

       git pull origin master   // 拉取master分支至本地
      
  1. git diff:对比和显示 commit 之间、工作区或者暂存区等详细的修改内容。

    • 显示工作区的修改内容——显示的是即将 git add 的内容。

       git diff
      
    • 显示暂存区的修改内容。修改内容是相对于 HEAD 的——暂存区和上一个 commit 对比。

       git diff --cached
      
    • 显示工作区相比于指定的 commit 的修改内容——工作区和指定的 commit对比

       git diff <commit>
      
    • 显示暂存区相比于指定的 commit 的修改内容——暂存区和指定的 commit对比

       git diff --cached <commit>
      
    • 显示 commit2 相对于 commit1 的修改内容

       git diff <commit1> 2<commit2>
      
  1. git status:查看当前仓库的状态,可以看到当前仓库中是否有文件被修改或暂存。
  1. git log:查看提交历史,可以看到之前所有的 commit 信息,包括 commit 的 Hash、日期、人员、日志
  1. git reflog:记录了分支的操作记录(我的理解是在当前分支所有的操作记录)

git log是显示当前的HEAD和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲,这样的原则

git reflog:git reflog根本不遍历HEAD的祖先。它是HEAD所指向的一个顺序的提交列表:它的undo历史。reflog并不是repo(仓库)的一部分,它单独存储,而且不包含在pushes,fetches或者clones里面,它纯属是本地的。

  1. git branch:用来显示当然分支,删除分支,新增分支,分支重命名,跟踪远程分支等
    • git branch:查看本地所有分支
    • git branch -a:显示本地和远程的所有分支
    • git branch -d:删除分支,会检查是否已合并,如果未合并则会提示“还未合并,无法删除”,-D 则会强制删除。
  1. git checkout:检出某个状态,即快照,可以是检出文件、分支。
  • git checkout :切换至某个分支

     git checkout master // 切换至master分支
    
  • git checkout -b :从当前分支切换至新分支并为该分支命名

     // 背景:当前分支为master分支
     git checkout -b feature/style // 基于master分支创建feature/style分支
    
  1. git reset:恢复到某一次提交。将该次提交之后的所有提交到都丢弃。

注意:如果是已经推入远程仓库的分支,禁止使用 git reset,除非你非常清楚的知道自己在做什么,否则人民会痛恨你,野狗会追咬你,这种情况下试试 git revert。

  • git reset --mixed:表示重置暂存区即 index,修改内容不会丢失,会恢复到工作区。

  • git reset --hard :恢复到某一次提交。commit 代表某个提交的 Hash 值,也可以使用HEAD。

     git reset --hard HEAD@{3}
    
  • git reset --soft :恢复到某一次提交,并将恢复的修改保留到工作区和暂存区

  1. git revert :commit 是指 commit 的 Hash 或者 HEAD 相关。恢复某一次提交。将某一次提交的修改恢复回去
  1. git merge:合并分支。

      假设我当前分支是master。

     git merge branch1 // 将branch1合到master上
    
  1. git rebase:变基。与 merge 不同,rebase 会将被分支的 commit 续到当前分支上,让 commit 历史呈现单线的状态,非常方便追溯问题和重置修改

    注:

    git merge与git rebase的区别: 参考链接:juejin.cn/post/702672…

    • merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容,merge 的提交历史记录了实际发生过什么,关注点在真实的提交历史上面
    • rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面,rebase 操作会丢弃当前分支已提交的 commit,故不要在已经 push 到远程,和其他人正在协作开发的分支上执行 rebase 操作 我们有两个分支,master 分支和release分支,release 分支是基于 master 分支在B处的提交节点创建的,在创建后 master 分支又经过迭代提交了两次,从C到D节点,release 分支也基于B往前继续更新了两次,到了F节点。两者从B开始就走向了分叉。 image.png 首先我们演示merge:

    将 release 分支合并到 master 分支

    // 切换到master分支
    git checkout master
    // 将 release 分支合并到 master 分支
    git merge release
    

    image.png merge 命令 它会把两个分支的最新快照(F、E 和 D、C)以及二者最近的共同祖先(B)进行三方合并,合并的结果是生成一个新的快照G

    接下来我们看一下rebase命令:

    将release分支合并到master分支

        // 将分支切换到master分支
        git checkout master
        // 把release分支合并到master分支
        git rebase release
    

    image.png 当我们在master (待变基分支)上执行git rebase release(基分支)时,git就会从两者的共同祖先B开始,提取 master 分支上的修改,也就是 C,D 两个 commit ,提取到之后 git 会先保存起来,然后将master 分支指向 release 分支最新提交的节点,也就是F节点,然后把提取到的 C,D 接到F后面,在这个过程当中,会删除原来的C,D commit 记录,生成新的C',D',虽然C',D'和原来的C,Dcommit的内容是一样的,但是 commit id 是不同的。

    git merge和git rebase都是用于分支合并,关键在于commit记录的处理上不同:

    • git merge会新建一个新的commit对象,然后两个分支以前的commit记录都指向这个新的commit记录,这种方法会保留之前每个分支的commit历史
    • git rebase会先找到两个分支的第一个共同的commit祖先记录,然后将提取当前分支这之后的所有commit记录,然后将这个commit记录添加到目标分支的最新提交后面,经过这个合并后,两个分支合并后的commit记录就变为了线性的记录了
  2. git fetch:git fetch 是把远程仓库的更新,合并到本地仓库中的远程分支,不会合并到本地分支

  3. git stash:缓存当前改动

    • git stash list:查看所有stash
    • git stash show -p stash@{3}:查看某个stash内容
    • git stash apply stash@{id} :回复指定stash id的内容
    • git stash pop 恢复stash列表中第一个内容

commit规范

Commit message 和 Change log 编写指南 - 阮一峰的网络日志

常遇到的问题

  1. 提了mr之后遇到冲突:

    1. git pull
    2. 解决冲突
    3. add,commit,push
  1. 想退回到之前的代码:

    1. git reflog查看操作历史
    2. 根据情况选择git reset或者git revert命令回退
  1. pull拉错分支了怎么退回

    1. git reflog 查看操作历史
    2. git reset --hard ae5244a8  填写自己想要回退的版本
  2. 切换分支的时候会将改动带到目标分支(从release分支切换到master分支)

    当前为release分支:

    1. git add
    2. git commit
    3. git push

这样再切换就不会把改动带过去了

  1. 多次修改出现很多commit但是不想被别人看到怎么办?

    1. 使用rebase命令

      1.     参考文章:
      2. juejin.cn/post/710645…
      3. github.com/zuopf769/ho…
    2. gitlab提交mr的时候勾选squash commits选项,将多个提交合并成一个

  2. 当想合入某个commit时,可以使用git cherry-pick 指令合入对应的commit,但需要拉取到分支最新的代码

可视化工具

同事小姐姐强烈推荐的fork:fork.dev/

参考文章:Git 可视化工具 Fork 使用指南_赵彦军的博客-CSDN博客_fork可视化工具