Git基础知识

111 阅读9分钟

git config

git的配置在实际工作中是很重要的一项,比如:

  1. 涉及到的安全和隐私的问题
  2. 简化命令,设置别名可以提高我们的工作效率
  3. 可以设置一些默认选项
  4. 一些hooks的利用
    git config --list // 可以查看当前所有的config设置
    在系统根目录中操作不会显示项目中的配置
    在项目目录中输出 前缀为alias的表示全局配置,前缀为core的表示项目配置

用户名邮箱的配置

    git config --global user.name '用户名'  // 全局配置用户名
    git config --global user.email '邮箱'   //  全局配置邮箱
    // 如果只需对当前项目进行配置 可以省去 --global命令
    // 也可以使用--local代替--global对当前仓库进行设置

别名的配置

    如果想查看当前仓库的一些文件的状态 可以使用 
    git status
    如果想使用别名alias的配置一般也是进行全局的配置
    git config --global alias.st status
    // alias.'简写名' 代替的命令  这样在运行时只需要使用git st <====>  git status
    eg: git config --global alias.pl pull <=======>    git pl <=====> git pull
    这个再去使用git config --list 就会发现一些变化
    alias.st = status  
    alias.pl = pull
    !!tips  如果想使用pull和rebase可以进行如下设置
    git config --global pull.rebase true

git config 原理

  • 在我们PC端下载git后一般会在根目录生成一个./gitconfig文件,我们对config的设置总共有system/global/local三种情况,前者优先级最多,一般使用的是后两者,我们在bash here中的--global操作其实就是对./gitconfig文件进行读写的一个操作
  • git config --list --local会显示当前仓库下的一些git配置信息,它读取的就是我们当前被git管理的.git/config文件
  • system级别
  • global级别
  • local级别 git进行读取时的优先级 local>global>system如果信息匹配到后就不会再往后去查找

git clone 和 git tag

  • git clone一般是在本地克隆远程仓库,然后在本地进行编辑后就可以进行推送
    git clone 链接地址
    // 克隆完成后就会在当前的文件夹内生成一个和远程仓库同名的一个文件夹
    // 我们clone默认是对master分支进行操作
    如果我们只想克隆某一个分支时可以使用 
    git clone -b 分支名
    使用ls  就可以查看当前所有的文件名
  • git-tag 是对一个版本号的管理,比如vue的一些版本迭代就是用git-tag进行整理 如果我们在分支上打上tag标签时,我们远程对应的分支旁边就是显示对应的tag标签这里的标签通常表示我们当前的版本号
    git tag -a +标签 -m '提交后的信息一般和版本号相同' 进行标识
    eg: git tag -a v0.0.1 -m 'v0.0.1'   // 打标签
    eg: git push --tag     // 推送标签到远程分支
    git tag -l '版本号'    可以对想查找的标签进行过滤
    git tag -l 'v0.0.*'   可以获取v0.0.匹配的所有标签
    git log --pretty=oneline 获取当前分支的所有提交信息
    如果我们想做某一个提交版本上打上标签可以赋值对应的commitID的前六位进行设置
    git tag -a v0.0.2 commitID的前六位 -m 'v0.0.2'
    git push --tag

git status 和 git diff

git status 主要是用来查看当前文件的所有更新,git diff主要是用来查看文件更新的内容 在git管理的文件中主要分为两种文件状态类型

  • 已追踪文件
  • 在仓库之前的版本快照中会包含文件的一些记录,在工作一段时间后这些文件同样能被追踪
  • 未追踪文件

image.png

git status

  • 通过 git status 显示出的文件状态总共有三种
  • 已添加至暂存区 待提交 git add
  • 已修改 未暂存
  • 未追踪状态的文件
    echo 'hello world' > test3  // 生成新文件
    echo 'hello world2'  > test2  // 修改已存在md文件
    rm test2.md
    在进行增改删之后再使用 git status查看文件状态就可以观察到对应文件的标识
    modified: test2
    deleted: test2.md
    Untracked files: test3
    如果我们对修改后的文件进行add操作 git add test 再用git status进行状态查看
    就会多出 Changes to be commited
                            modified: test
    直到我们添加所有的文件至暂存区及推送到远程仓库前git status都可以看到每个文件的版本快照

git diff

    当我们修改文件后使用git diff可以看到我们对文件进行了哪些状态的改变
    但是当我们把修改的文件使用 git add 命令后再使用git diff是不会看到任务内容的,因为git diff默认查看添加到暂存区之前的内容
    但是我们也可以使用 git diff --staged 来查看暂存区的内容.
    这个命令主要是用来查看文件的修改状态

commit message

commit message有哪些好处呢

  • 提供更多可查询的信息,用于排查问题
  • 过滤重要的内容
  • 生成changelog
  • 标准的commit message 包括Header,Body,Footer三个部分 平时我们一般只使用Header

Header部分

  • type(scope):subject 这里的scope代表模块名,subject代表描述信息
  • type有以下几种类型
  1. feat: 新功能
  2. fix:修改bug
  3. style:格式
  4. refactor:代码重构
  5. chore:项目构建 介绍一个帮助我们提交的一个插件commitizen 简称git cz
  • 全局安装commitizen
  • 设置支持angular格式的Commit message
  • 在我们项目初始化后设置commitizen init cz-conventional-changelog -- save-exact 这样在我们需要用git commit -m 的命令时使用git cz来代替

changelog

changelog是项目迭代过程中一系列的变更记录如果你的所有的Commit都符合Angular模式,那么发布新版本时,Changelog就可以私用脚本自动生成(例1.例2.例3)生成文档包括以下三个部分

    New features
    Bug fixes
    Breaking changes

每个部分都会罗列相关的commit,并且有指向这些commit的链接,当然生成的文档允许手动修改,所有发布前,你还可以添加其他内容 conventional-changelog就是生成Change-log的工具,运行下面的命令即可

    npm i -g conventional-changelog
    cd my-project
    conventional-changelog -p angular -i CHANGELOG.md -s -r 0 

git remote

  • 远程分支类似于本地分支,是指向远程仓库中文件的指针
  • 实际开发中,每一个本地分支都应该存在于一个与远程分支的对应关系

远程分支的抓取

  • git fetch 当远程仓库代码领先于本地仓库代码时,使用git fetch并不会修改本地的仓库代码,如果想同步远程的代码需要进行git merge操作
  • git merge 真正的更新本地仓库的内容
  • git pull = git fetch + git merge

远程推送

  • git push
  • git push分支,推送内容至仓库
     git push origin dev // 推送至远程dev分支
  • git push -d 删除分支
     git push origin -d 远程分支名
  • git push --tag 推送tag
    一般标签都只是在master分支上进行
    git checkout master
    git tag -a v0.0.2 -m 'v0.0.2'
    git push --tag

git remote

  • git remote -v
使用git remote -v 命令 会出现两个一样的远程的仓库地址链接一个后缀为fetch一个为push  表示我们可以对这个仓库进行fetch和push操作
  • git remote add
    当我们想将一个本地仓库和一个新建的远程仓库建立连接时 可以使用如下命令
    git remote add origin 仓库链接地址
    这样再次进行 add commit push 就可以把本地文件上传到远程仓库
  • git remote
  • 我们可以添加远程仓库,同样可以删除远程仓库
    git remote remove origin  // 使用该命令可以删除远程仓库
    现在我们可以更换对另一个远程仓库的链接

git branch

分支的本质其实就是指向提交对象的一个可变指针

image.png

  • git branch 不加参数会显示本地分支 加入名字会创建一个分支
  • git checkout dev //可以进行分支的切换
  • git checkout -b 分支名 //可以创建并切换到新的分支
  • git branch -d 分支名 // 可以将分支名删除 一般本地的分支最多会保持5-6个分支,防止产生记忆混乱

分支合并

当我们本地的功能分支完成成,为了将dev分支同步到最新的代码.我们需要先切换到dev分支,然后再执行 git merge + 功能分支 将代码进行合并

解决冲突

冲突(Conflict)在我们进行多人代码开发时是很常见的,碰到冲突时我们只需要进行合理的对比再add commit可以正常的解决我们的冲突,同时为了条理更清楚的解决冲突,建议对commit格式做一定的统一,以及更加的颗粒化

git rebase git merge

  • git rebase 和 git merge都可以进行分支的合并
  • git merge 合并后保留两个分支的记录
  • git rebase 合并后会展示成一个分支的记录,另一个分支的提交实际生成了一个副本

image.png

  • 当我们把远程的origin分支合并到我们的mywork分支时,他会生成一个新的提交记录指向之前的两个分支

image.png

  • 当我们使用 git rebase进行合并时,会对C5,C6生成一个副本,并不会生成一个新的C7分支,而且只会生成一个commit提交记录,这就是两者的第一个区别,当我们使用source tree进行合并操作时可以明显看到所有的分支都会变成一条直线,而是用merge还是会存留之前的岔口分支
  • git merge 一次性会解决之前提交记录中的所有冲突
  • git rebase一次只会解决一次提交上的冲突,如果多次提交都冲突,需要执行多次rebase操作