git 细节区分

以项目为例,从拉取代码到平时的开发使用

git的三个区域:

  1. HEAD 指向最近一次commit里的所有snapshot(历史记录区)
  2. Index 缓存区域,只有Index区域里的东西才可以被commit(暂缓区)
  3. Working Directory 用户操作区域(工作区)

变化过程如下:

图片描述

常规的操作命令:

git clone 项目路径         //拉取代码
git add .                 //工作区全部文件提交到暂缓区
git commit -m "描述"      //暂缓区文件提交到本地仓库
git pull                  //从远程仓库拉取代码
git push origin master    //本地仓库提交到远程仓库master分支


git status                //查看状态
git diff                  //查看上次修改的内容
git log                   //显示从最近到最远的提交日志
git log --pretty=oneline  //显示在一行
git log --graph           //命令可以看到分支合并图
git checkout -b dev       //创建并切换到分支dev
git checkout master       //切换到master分支
git branch                //查看当前分支
git branch -a             //查看所有分支(包含远程仓库)
git merge dev             //合并分支(先切换到主支再合并)
git branch -d dev         //删除分支dev

拉取远程仓库全部分支

克隆成功一个仓库后,有时没有克隆远程仓库的分支,需要手动执行

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --al

reset详解

reset实际上有3个步骤,根据不同的参数可以决定执行到哪个步骤(--soft--mixed--hard)。

  1. 改变HEAD所指向的commit(--soft)
  2. 执行第1步,将Index区域更新为HEAD所指向的commit里包含的内容(--mixed)
  3. 执行第1、2步,将Working Directory区域更新为HEAD所指向的commit里包含的内容(--hard)

注意:

–mixed是默认参数,也就是说执行reset的时候不给就认为是--mixed

下表说明了三种形式的git reset所产生的不同效果。

target代表想要将git指向到哪个commit

working index HEAD target         working index HEAD
----------------------------------------------------
  A       B     C    D     --soft   A       B     D
                           --mixed  A       D     D
                           --hard   D       D     D
                           --merge (disallowed)

working index HEAD target         working index HEAD
----------------------------------------------------
  A       B     C    C     --soft   A       B     C
                           --mixed  A       C     C
                           --hard   C       C     C
                           --merge (disallowed)

reset和revert的区别

在日常的开发中,总会出现这种情况,提交了一个新的版本,因为莫名其妙的bug,把项目搞瘫痪了。亦或是刚开发完的需求,客户变方案了。这些都需要我们进行回滚,reset和revert都可以实现,区别在于

reset:修改提交历史(重点:历史被改变了,由1=>2=>3=>4变成了1=>2=>3,4在历史中被移除了)

revert:提交历史中继续延伸(重点:创建新的历史,由1=>2=>3=>4变成了1=>2=>3=>4=>5,新提交的5根据4逆向生成)

这就好比开车经过分叉路口,你走了左边,但是发现路不对,应该是右边。。。

reset做的是时光倒流,倒流回你经过分岔路口的那个时间,而revert做的是原路返回,返回到分岔路口。

两种都达到了目的,区别在于reset可能会影响其他开发人员的提交历史,而revert不会。

推荐revert回滚!!!

 

cherry pick和merge的区别

两者都有合并代码的效果,区别在于

cherry pick:合并一条提交历史

merge:合并分支的全部历史

主要还是使用场景的不同,举个例子:

主分支master,新功能在dev分支上开发,要上线了需要把代码同步到主分支上,这种情况使用cherry pick最佳,因为主分支有最终的代码就够了,开发的中间过程commit对于master分支没有意义。

merge更多的使用在合并分支,合并到主分支后,当前分支不再进行开发,可以删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值