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 改local branch名字_最好的Git分支管理教程相关推荐

  1. git branch 为什么会进入编辑状态_最好的Git分支管理教程

    Git最难学习的就是Git的多分支问题,不同操作会对当前分支造成什么影响,比如相同初始状态,类似操作,rebase和merge的不同结果. rebase(左),merge(右) 教程简介 推荐一个非常 ...

  2. git branch看不到分支_最好的Git分支管理教程

    Git最难学习的就是Git的多分支问题,不同操作会对当前分支造成什么影响,比如相同初始状态,类似操作,rebase和merge的不同结果. rebase(左),merge(右) 教程简介 推荐一个非常 ...

  3. git中local branch追踪remote branch

    Git新建本地分支与远程分支关联问题:git branch --set-upstream git在本地新建分支, push到remote服务器上之后,再次pull下来的时候,如果不做处理会报以下提示: ...

  4. git mr 怎样合并部分_系统掌握Git之—分离头指针与合并操作

    分离头指针 分离头指针表示我们在工作在没用分支的情况下,我们通过git log 打印日志,选择中间的一个commitId,然后进行checkout操作,git checkout 82fdac4baac ...

  5. a commit git 参数是什么意思_深入理解Git - 一切皆commit

    在对 git 有了基本理解和知道常规操作之后,如何对 git 的使用有进一步的理解? 一切皆 commit 或许是个不错的理解思路. 本文将从『一切皆 commit 』的角度,通过 git 中常见的名 ...

  6. as上的git到码云操作_如何使用git从码云克隆项目到本地?

    https://www.cnblogs.com/gbb123/p/6784822.html 前段时间,有读者微信问我,如果使用Git从码云或者Github 克隆代码到本地,然后进行提交代码的操作 .可 ...

  7. git两个账号切换_多个git账号之间的切换

    $ clip < ~/.ssh/id_rsa.pub bash: /c/Users/UsersName/.ssh/id_rsa.pub: No such file or directory St ...

  8. git关闭密码自动存储_项目在 git 里怎样合理的保存配置文件(服务器密码等敏感内容)...

    办法其实很多,有两种较常用. 第一种是配置文件不提交真实内容,只提交一个模板文件.每个开发者克隆之后按照自己的环境补完配置文件,这样自然而然就独立出来了(需更改文件名并忽略有效配置文件). 如果配置文 ...

  9. sudo修改文件夹名字_用 Python 高效智能管理文件夹

    #「闪光时刻」主题征文 二期# 大家在写报告.写总结时,是否会先去翻一下以前写过的类似的东西?是否有看过比较好的文章,想保存时却为归类而纠结?是否电脑里的文件越来越多,想删掉一些却又舍不得?身处大数据 ...

最新文章

  1. 【组队学习】【26期】动手学数据分析
  2. Spring Boot Web Error Page处理
  3. 报名 | 2019年第六届清华大学大数据社会科学讲习班
  4. linux centos使用xrdp远程界面登陆
  5. dropdown.js
  6. 音乐播放器 audio
  7. 算法学习四:算法性能分析理论基础——函数增长与渐进分析
  8. CSS中背景图片的坐标之使用说明及css中把所有背景图都放在一张图片上减少图片服务器的请求次数问题(转)...
  9. CSS:实现跳动小球蒙版效果
  10. 将页面强制保持在所属框架中
  11. JDK版本变化也太快了,意义有多大?
  12. 设置linux服务器下开放端口
  13. 最新二开版漫画小说听书三合一完整源码/整合免签接口/搭建教程/带采集接口
  14. java的Jaas授权与鉴权
  15. java郝斌_Java入门学习笔记-郝斌
  16. CAN总线负载率计算方法说明
  17. electron + fluent-ffmpeg推送桌面、音视频、窗口
  18. 《群山唱响》-- 爱的力量
  19. centos基本命令
  20. RTX4070ti-40系列显卡配置pytorch深度学习环境过程

热门文章

  1. 显示隐藏-display(HTML、CSS)
  2. 伪元素选择器使用场景2-仿土豆网显示隐藏遮罩案例(CSS3)
  3. CSS语法规范(CSS、HTML)
  4. 实验2-2-7 整数四则运算 (10 分)
  5. OpenCV 填充多边形 fillConvexPoly 和 fillPoly
  6. 用nodejs 调试nginx rewrite 后输出路径
  7. @ModelAttribute注解使用
  8. 什么水平的java工程师月薪3万起?
  9. Linux内存管理学习资料
  10. JavaScript对象快速入门