Git最难学习的就是Git的多分支问题,不同操作会对当前分支造成什么影响,比如相同初始状态,类似操作,rebasemerge的不同结果。

rebase(左),merge(右)

教程简介

推荐一个非常通俗易懂的Git多分支教程:

Learn Git Branching​learngitbranching.js.org

学习时长:0.5-1天

教程特点:

  • 将各个知识点划分成关卡,像打游戏一样学习。
  • 所有操作均产生动态变化过程(可视化),十分容易理解。
  • 每个知识点都带练习,看完讲解后亲手输命令看结果,加深印象。
不同关卡

教程平台自己的命令:

  • 左边console输入levels命令,调出关卡页。
  • reset:reset习题为初始状态。
  • undo:undo上一条git命令。

更多命令及设置:教程GitHub页

上手教程

初接触Git的朋友需要简单了解下Git的基础知识,即可轻松上手这个教程。

Git分为local和remote,一个典型的Git工作流:

  1. http://github.com上建一个repo(remote),clone到local。
  2. 修改后,git add –-all将所有修改加入staging area。
  3. commit到local repo。
  4. push到remote repo。

图片来源

教程要点

A 图例

如下图,一个节点(状态)对应一次commit。节点的标识(i.e. c0)表示commit记录的hash值,可用git log查看。

c1->c0表示c1是在c0基础上的commit。当你只有local或remote时,只有左边实线状态图;两者都有时,则用实线表示local状态(左),虚线表示remote状态(右)。

local的master, o/master,remote的master都是branch name,其中o/是origin/,教程中用o/简写。

默认local master跟踪o/master,o/master跟踪remote master。(跟踪track见教程)

local的HEAD表当前状态,若HEAD和某个branch(i.e. master)相同时,则省略HEAD,并在该branch上加*,表该branch是当前状态(i.e. master*)。

B 主要命令汇总

  1. 创建、移动分支:branch, checkout
  2. 撤销变更:reset, revert
  3. 合并/整理记录:merge, rebase
  4. 远程相关:pull, push
  5. 其他:cherry-pick,PR问题

1 创建、移动分支

branch, checkout

创建:

git branch <branch>
git checkout -b <branch>

移动:

git checkout <branch> # 切换到<branch>

分离HEAD:

git log # 查看commit记录
git checkout <commit记录hash前几位> # 将HEAD指向一个状态

相对引用:^~

  • ^表上一节点,^<num>表第<num>个父节点。
  • ~也表上一节点,~<num>表往上<num>个节点。
  • ^ ~支持链式操作,如^2~3:第二个父节点往上3个节点。
git checkout master^2 # 将HEAD移到master第2个父节点

强制移动branch:

git branch -f master HEAD~3 # 强制移动master到当前节点往上三个节点的位置

bugFix*表HEAD指向bugFix,故HEAD~3为bugFix~3。

2 撤销变更

reset, revert

  • 这里是git reset,区别平台自己的reset命令。
  • reset:回滚到之前某一状态。
  • revert:增加新节点,复制之前某一状态。
git reset HEAD~1

reset后并不是直接删除,git log查到c2记录,还可以checkout或branch -f恢复c2。

git revert c0

3 合并/整理记录

merge, rebase

先来看下两个命令各自的效果:

初始(左)HEAD指向master,将master整理/合并到o/master上:

  • git rebase o/master(中)
  • git merge o/master(右)

可以看出,相比merge,rebase:

  • 优点:rebase使状态图变得很干净,所有commit都在一条线上。
  • 缺点:rebase修改了状态图历史。

rebase还支持交互式操作,只需加上-i (--interactive)参数。

pick就是下面omit删除后,重新拾回。

e.g.

git rebase -i HEAD~4

4 远程相关

pull, push

pull和push对应。因为pull = fetch + merge,pull –rebase = fetch + rebase,故先解释下fetch:

fetch的使用场景是当clone后remote又有了非local的新的commit:

remote有了新commit(左),fetch后(右)

具体来说,fetch完成了两步操作:

  1. 从remote下载local缺失的状态。
  2. 更新local对应remote的指针(i.e. o/master)。

pull = fetch + merge:

git pull先fetch c3到local,并移动o/master指向local c3;然后将当前状态(master*)和o/master merge 。

git pull

pull –rebase = fetch + rebase:

上例用pull –rebase的话

push和pull对应,是将remote没有的local状态上传,并更新相关指针。

git push

push和pull都有两种带参数的形式:

下面的<remote>就是remote repo,默认是origin。

push <remote> <local branch>

将<local branch>上remote没有的状态上传,并更新相关指针。

push <remote> <local状态>:<remote branch>

和第一条的区别:(1)只要是<local状态>就行,即使没branch指向。(2)上传到指定<remote branch>,若remote无<remote branch>,则会自动新建。

pull <remote> <remote branch>
pull <remote> <remote状态>:<local branch>

⭐其实无参数的push和pull就是同步所有变化。

e.g.

初始状态:

git push origin foo

git push origin c5:foo

5 其他

cherry-pick,PR问题

cherry-pick也是用于整理记录的,可实现pick部分状态到当前branch上。

e.g.

git cherry-pick c2 c4

PR问题:以remote master分支为例,若remote将master锁定,则git push时会返回

! [远程服务器拒绝] master -> master (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)

即不允许直接push到master。

解决:新建一个分支,push这个分支,并提交pull request。

git branch看不到分支_最好的Git分支管理教程相关推荐

  1. git 删除分支_深入浅出图解Git,入门到精通(保姆级教程)

    原文链接:https://mp.weixin.qq.com/s/_G3l9urASsFjyrYAZBWhDg 分支管理 Git中比较最重要的一点就是分支的概念,有了分支就有了合并和衍合的操作,「合并」 ...

  2. git 查看分支_系统掌握Git之—探索.git

    文章概述 上文中,我们聊了聊git的配置与一些基本概念,今天来看看.git文件夹里面有什么内容.通过阅读本文,你将获得下面的知识: .git的内部信息. git的分支操作. 图形化git工具. 新建分 ...

  3. git 还原文件到其他版本_如何在Git中还原旧文件版本

    git 还原文件到其他版本 读: 第1部分:什么是Git? 第2部分:Git入门 第3部分:创建第一个Git存储库 第4部分:如何在Git中还原旧文件版本 第5部分:3个用于Git的图形工具 第6部分 ...

  4. git拉取代码如何解决冲突_开源项目 git pull 代码冲突的解决方式?

    假设我正在使用一个开源项目,为了时刻保持根官方github保持同步,我用git clone项目到本地并进行二次开发,我的大部分二次开发是不会和官方的核心文件产生冲突的,但是个别文件还是会冲突.. 比如 ...

  5. git branch看不到分支_Git简介及基本用法

    目录 Git基本概念 Git常用的命令 Git资源 Git基本概念 VCS模型 Git模型 通过上图我们可以直观的看出,传统的VCS(Version control system)系统是基于中央处理的 ...

  6. git提取和拉取区别_每天一Git之起步 - 关于版本控制

    每天一Git之起步 - 关于版本控制 本文章为git官方文档摘抄,请访问https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%B ...

  7. git安装后找不见版本_结果发现git版本为1.7.4,(git --version)而官方提示必须是1.7.10及以后版本...

    结果发现git版本为1.7.4,(git --version)而官方提示必须是1.7.10及以后版本 升级 增加ppa sudo apt-add-repository ppa:git-core/ppa ...

  8. git 如何忽略掉文件夹_如何使git忽略某些文件或文件夹

    为什么要忽略某些文件或文件夹的变化? git作为一款项目文件变更版本管理软件,其主要功能之一就是追踪项目文件夹内各种文件及文件夹的变更情况.但是,在日常使用中,并非项目文件夹下的所有文件及文件夹变更都 ...

  9. mysql 条件分支_记mysql条件分支语句CASE WHEN THEN ELSE END的使用

    linux 记录用户操作记录日志 ################################################################################### ...

最新文章

  1. SQL 表之间的更新
  2. 已安装内存和可用内存不一致 4GB内存在win1064位系统中显示为可用 3.87GB解决办法
  3. ECCV 2020 《Improving One-stage Visual Grounding by Recursive Sub-query Construction》论文笔记
  4. python开发基础教程
  5. 如何洗牌 ListT 中的元素?
  6. 日志钩子(JournalRecord Hook)的使用
  7. 神经网络如何调参、超参数的最优化方法、python实现
  8. 个人通讯管理程序C语言,个人通讯录管理系统C语言源程序(优秀版)[1]
  9. python读取fiddler_Python3.x+Fiddler抓取APP数据
  10. 微信公众平台系列-7拓展(如何使用微信扫一扫登录自己的网站)
  11. basic4android 开发 使用类库方法
  12. TM4C129建立FREERTOS工程
  13. 测试工程师从面试到入职
  14. Datax-web版安装(含安装包)
  15. 2万字 + 50 张图,细说 JVM 内存分布、内存对齐、压缩指针
  16. 2021美赛B题翻译
  17. 大数据 机器学习 分类算法_13种用于数据科学的机器学习分类算法及其代码
  18. Winrar4.11免费破解版(破解方法/激活码)
  19. 超全金属PBR多通道贴图素材网站整理
  20. 人工智能,可谓炙手可热,无人不知,无人不晓

热门文章

  1. linux 域名怎么平台,linux平台搭建DNS域名服务与常用配置
  2. php对接小程序获取表单,PHP实现微信小程序用户授权的工具类
  3. 归并排序的java代码_归并排序的原理及java代码实现
  4. mysql查询数据上一条_MySQL查询当前数据上一条和下一条的记录
  5. 连续arq协议的利用率_Chrome底层原理和HTTP协议 - 石吴玉
  6. Ubuntu终端常用的快捷键,光标移动到开始位置
  7. [Ubuntu18.04]使用snap
  8. laravel 运用
  9. Swing 100行画图示例
  10. 一个程序员的郁闷吐槽