git基操

2018-03-28  本文已影响0人  李永开

一.git 简介

git官方文档-中文版

区块解释

  • 工作区:就是你现在写代码的地方,
  • 暂存区:在工作区修改的记录保存的地方
  • 本地版本库: 暂存区通过commit命令,将暂存区的东西生成commit,可以推送到远端
  • 远端版本库: 服务器上和本地版本库一模一样的仓库
    注:
    工作区暂存区通信,暂存区本地版本库通信,本地版本库远端版本库通信
    工作区不能和远端直接进行通信,暂存区也不能和远端直接进行通信

fast forward
顾名思义:就是最快的前进方式
解释:git 默认的merge方式.将dev分支合并到master分支时,master分支的指针直接指向dev的commit
优点:快
缺点:当删除dev分支后,会丢掉分支信息
解决办法:(不常用)使用git merge --no-ff dev,这样的话master会生成一个新的commit,不会直接使用dev的commit

HEAD(对应的文件存储在./git/HEAD ref: refs/heads/master)

  • 有一个分支master,master的指针指向该分支的最新commit,HEAD指向master,也就是说HEAD是指向指针的指针

当然:HEAD指针不仅可以指向分支,也可以指向tag和commit.
内部实现:

  1. tag的内部是commit,可用git cat-file查看
  2. 分支的内部其实也是commit
    所以,HEAD其实指向的都是commit

branch(对应的文件存储在./git/branchs)

  • branch其实是由commit组成的一条链表,每个链表都有自己的tree和parent commit,都可以通过父节点找到上一个commit
  • 新建dev分支,就是新建一个dev指针指向最新commit,然后HEAD再指向dev
  • 切换分支其实就是把HEAD从master更新到dev

git 后悔药

  • git restore <文件>...
    解释:该文件还没有加入到暂存区,使用该命令可以丢掉你在工作区的改动
  • git checkout --file --作用对象为工作区
    解释:该文件已经加入到暂存区,现在你在工作区对该文件进行修改,但还没有执行git add操作,这时可以使用该命令将暂存区的内容替换工作区的内容,也就是说删掉基于该暂存的内容改动(没有执行git add操作是重点)
  • git reset HEAD --file --作用对象为暂存区
    解释:当你执行完git add后,可以使用该命令丢弃掉基于上个暂存的的暂存内容,并将丢掉的这部分暂存恢复到工作区

演示:stage为暂存区,现在workspace工作区test.md +加了 love字段
第一种情况:执行git checkout --file,那么会将stage的内容替换到workspace中,也就是删除掉了love字段
第二种情况:执行git add test.md将love加入暂存区,那么可以使用 git reset HEAD --file丢掉love这个暂存,并将丢掉的暂存恢复到工作区,也就是说工作区回到了添加love这个字段的状态

二.git config设置

注:
其中--global可以替换为--local --system, 他们用法一样,作用域不一样.
--local只针对某个git仓库
--global针对当前用户的所有仓库
--system针对系统所有的登录用户有效
如果多次设置产生冲突,那么有效顺序为--local>--global>--system

可以在.git/config文件下找到我们通过命令行命令设置的姓名、邮箱等

三.git 常用命令

本地

远程仓库

分支

标签

四.安装gitk

使用gitk图形化界面来查看git

brew update
brew install git
brew install git-gui

使用方法:gitk或者gitk --all
使用gitk -a &可以开启多线程,这样终端和wish都可以使用

六. git 技巧

组合搜索
github组合搜索:搜索自己想要的仓库时,可以在搜索内容例如deepfeak加上文件名称,
例如deepfeak in:readme, --------------------------------------搜索出来的是仓库
例如:从文件名中搜索想要的字段deepfeak filename:readme.txt,--搜索出来的是code
例如:筛选星数deepfeak stars>:100,
或者直接使用高级搜索

远端的pull request设置
可以在github上设置pull request的选项
如果设置为merge,则自动合并分支
如果设置为aquash and merge,则自动整个多个commit为一个commit并cheery-pick到合并的分支
如果设置为rebase and merge,则将多个commit用cheery-pick到合并的分支(如果多个commit有冲突,设置为rebase则有可能merge失败.所以还是squash更安全一点)

  • squash和rebase都可以使merge操作变成线性的,但是rebase保留了多个commit,而squash只保留了整合后的一个commit

七.git 问题

  1. 分离头指针的问题
    解释:HEAD指针和目前你的工作区的内容不一致就会出现detached HEADstate(例如在master上使用git checkout -commit)
    解决办法:使用git branch newBranch 3d4fed创建一个以3d4fed commit为基准的新分支newBranch,最后merge到master分支上
  1. git对比svn?
    git本地存在版本库,而svn是集中式的管理系统,只有服务器有版本库.
  2. gitlab和github都支持CI/CD(持续继承,持续交付)功能,类似jinkens.
  3. git submodule的用处
    我觉得可以搞搞组件化,以后可以试试 0.0
上一篇下一篇

猜你喜欢

热点阅读