Learn Git Branching是一个学习Git操作的教程,作者为不同的命令设计了相应的关卡,它并不枯燥乏味,相反,我们每通过一个关卡,自信心就会提升,兴趣也会加深,带着满满的成就感去学习,真的很有趣!考虑到自我思考的重要性,作者将相关隐藏命令陆续放在了后面的关卡中,不至于让玩家一开始就急于看答案,而且配上优雅的动图,看起来真的舒心。作者考虑真的很周到,必须点个赞~
每个关卡的答案不唯一,只要发挥你的想象达到目标即可。下面是我的关卡挑战合集。
快去玩转Git吧!(https://learngitbranching.js.org)
git commit
git branch 分支名
创建分支
git checkout 分支名
切换分支,即将HEAD
移动到分支上
创建并移动到分支上:
git branch bugFix
git checkout bugFix
---
git checkout -b bugFix
git merge
合并分支
git checkout -b bugFix
git commit
git checkout main
git commit
git merge bugFix
合并分支并返回主线
git checkout -b bugFix
git commit
git checkout main
git commit
git checkout bugFix
git rebase main
HEAD
总是指向当前分支上最近一次提交记录,大多数修改提交树的 Git
命令都是从改变HEAD
的指向开始的,HEAD
通常情况下是指向分支名的(如 bugFix)。
分离的 HEAD
就是让其指向了某个具体的提交记录而不是分支名。
查看HEAD指向 cat .git/HEAD
指向引用 git symbolio-ref HEAD
------------------------------
git checkout C4
git log
查看提交记录的哈希值(基于SHA-1,共40位),仅输入前几个字符即可。
^
向上移动1个提交记录,把^
加到引用名称的后面,表示让git
寻找指定提交记录的父提交,比如切换到main
的父节点 git checkout main^
~<num>
向上移动多个记录,如 ~3
,完整如 git checkout main~3
git checkout bugFix
git checkout C4
git checkout HEAD^
---
git checkout C4^
---
git checkout C4~1
~<num>
向上移动多个记录,如 ~3
,完整如 git checkout HEAD~3
强行修改分支位置
使用 -f
选项让分支指向另一个提交,
如git branch -f main HEAD~3
,将main
分支强制指向HEAD
的第3
级父提交
git branch -f main C6
git checkout HEAD^
git branch -f bugFix HEAD~1
本地分支的撤销:git reset
,通过把分支记录回退几个提交记录来实现撤销改动。
例如,git reset HEAD~1
远程分支的撤销:git revert
,例如 git revert HEAD
git reset HEAD^
git checkout pushed
git revert HEAD
git cherry-pick <...>
,如果想将一些提交复制到当前所在的位置(HEAD
)下面的话,该命令非常实用,如git cherry-pick C2 C4
是将C2和C4分支
复制到当前位置git cherry-pick C3 C4 C7
git rebase -i HEAD~4
git rebase -i HEAD~4 (pick C4 并 移动顺序)
git rebase -i
git cherry-pick
git rebase -i HEAD~3
git checkout main
git rebase bugFix
--
git rebase -i HEAD~3
git branch -f main HEAD
newImage
分支上进行了一次提交,基于它又创建了option分支,然后又提交了一次。现在我们想修改newImage
中的内容
git rebase -i
将提交重排git commit --amend
进行小修改git rebase -i
移动到原来的顺序main
移动到HEAD
git rebase -i HEAD~2
git rebase -i HEAD
git rebase -i HEAD~2
git branch -f main HEAD
cherry-pick
可以将提交树上任何地方的提交记录取过来追加到HEAD
上(只要不是HEAD
上游的提交就没问题)
git checkout C1
git cherry-pick C2
git checkout C1
git cherry-pick C2 C3
git branch -f main HEAD
---
git checkout C1
git cherry-pick C2
git checkout main
git cherry-pick C2 C3
标签tag
在代码库中起着锚点的作用
git tag v1 C1
创建一个指向C1
的标签v1
git tag v0 C1
git tag v1 C2
git checkout v1
git describe <ref>
描述离当前(ref)最近的标签,
输出为 <tag>_<numCommits>_g<hash>
git describe C5
git commit
git checkout bugFix
git rebase main
git checkout side
git rebase bugFix
git checkout another
git rebase -i side
git branch -f main HEAD
---
git rebase main bugFix
git rebase bugFix side
git rebase side another
git rebase another main
^
后面也可以跟数字,表示指定合并提交记录的某个父提交(一个以上的父分支),如 git checkout main^2
~
和^
支持链式操作,如git checkout HEAD~^2~2
git checkout main~1^2^
git branch bugWork
git checkout main
---
(分支不存在会主动创建)
git branch -f bugWork main^^2^
git checkout one
git cherry-pick C4 C3 C2
git checkout two
git cherry-pick C5 C4 C3 C2
git branch -f three C2
远程仓库的特点:
git clone
在本地创建一个远程仓库的克隆
git clone
origin
,且git
默认将远程仓库设置为origin
<remote name>/<branch name>
,如o/main
,origin/main
git commit
git checkout o/main
git commit
git fetch
从远程仓库获取更新的分支,主要做了两步
origin/main
)git fetch
实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch
就是你与远程仓库通信的方。git fetch
通常通过互联网(使用 http://
或 git://
协议) 与远程仓库通信。
==git fetch
并不会改变本地仓库的状态,也不会更新main
分支,也不会修改磁盘上的文件。==所以可以将git fetch
理解为单纯的下载操作。
git fetch
git pull
抓取更新并合并到本地分支git fetch ; git merge orign/main
等价于git pull
git fetch
git merge o/main
---
git pull
git clone
git fakeTeamwork main 2
git fetch
git commit
git merge o/main
---
git clone
git fakeTeamwork main 2
git commit
git pull
git push
负责将你的变更上传到指定的远程仓库git push
不带任何参数时的行为与 Git 的一个名为 push.default
的配置有关。它的默认值取决于你正使用的 Git 的版本。git commit
git commit
git push
假如你克隆了一个仓库,研发某个新功能完毕准备提交时,发现你的同事更新了好多分支并且已经推送到远程仓库了,因此你的工作就变成了基于项目旧版的代码,与远程仓库最新的代码不匹配了。
解决办法:调整你的工作使你的工作基于最新的远程分支
使用git fetch
更新本地仓库中的远程分支,然后用rebase
将我们的工作移动到最新的提交记录下
git fetch; git rebase o/main
等价于git pull --rebase
更新本地仓库中的远程分支,然后合并新变更到我们的本地分支
git fetch; git merge o/main
等价于git pull
git clone
git fakeTeamwork main
git commit
git fetch
git rebase o/main
git push
--
git clone
git fakeTeamwork main
git commit
git fetch
git merge o/main
git push
---
git clone
git fakeTeamwork main
git commit
git pull --rebase
git push
---
git clone
git fakeTeamwork main
git commit
git pull
git push
main
被锁定时需要一些pull request
流程来合并修改。
新建一个分支feature
,推送到远程服务器。然后reset
你的main分支和远程服务器保持一致,否则下次你pull
并且他人的提交和你冲突的时候就会有问题。
git branch feature
git branch -f main o/main
git checkout feature
git push
---
git branch -f main o/main
git branch -f feature C2
git checkout feature
git push
---
git checkout -b feature
git branch -f main o/main
git push
---
show solution
(在本程序中默认的行为是 --hard 硬重置,可以尽情省略掉那个选项以避免麻烦!但是要记录 Git 中默认的是 --mixed)
git reset --hard o/main
git checkout -b feature C2
git push origin feature
git checkout main
git pull --rebase
git rebase main side1
git rebase HEAD side2
git rebase HEAD side3
git branch -f main side3
git checkout main
git push
---
git fetch
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 main
git push
o/main
)中的最新变更就可以了,至于具体是用 rebase 还是 merge,并没有限制rebase
的优点是使你的提交树变得很干净,所有的提交都在一条线上,缺点是修改了树的提交历史。
git fetch
git branch -f main o/main
git checkout main
git merge side1
git merge side2
git merge side3
git push
---
git fetch
git rebase o/main main
git merge side1
git merge side2
git merge side3
git push
---
git checkout main
git pull
git merge side1
git merge side2
git merge side3
git push
pull
操作时, 提交记录会被先下载到 o/main
上,之后再合并到本地的 main
分支。隐含的合并目标由这个关联确定的。push
操作时, 我们把工作从 main
推到远程仓库中的 main
分支(同时会更新远程分支 o/main
) 。main
和 o/main
的关联关系就是由分支的“remote tracking”属性决定的。main
被设定为跟踪 o/main
—— 这意味着为 main
分支指定了推送的目的地以及拉取后合并的目标。当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支(比如 o/main
)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 main
。克隆完成后,你会得到一个本地分支(如果没有这个本地分支的话,你的目录就是“空白”的)。
我们可以让任意分支跟踪 o/main
, 然后该分支会像 main
分支一样得到隐含的 push 目的地以及 merge
的目标。 这意味着可以在分支 totallyNotMain
上执行 git push
,将工作推送到远程仓库的 main
分支上。
创建名为totallyNotMain的分支,来跟踪远程分支o/main
,有两证方式可实现:
git checkout -b totallyNotMain o/main
git branch -u o/main totallyNotMain
git checkout -b side o/main
git commit
git pull --rebase
git push
为git push
指定参数,语法为git push <remote> <place>
例如git push origin main
的意思是:切换到本地仓库中的main
分支,获取所有的提交,再到远程仓库origin
中找到main
分支,将远程仓库中没有的提交都添加上去。
git push origin main
git push origin foo
git push origin <source>:<destination>
是将本地source
分支推送到远程destination
分支。并且source
是git
可识别的位置,如name~3
、name^
,name^2
等。如果推送的目的分支不存在git
会在远程仓库中自动创建这个分支。
git push origin foo:main
git push origin main^:foo
git fetch
同样具有参数,只是方向相反,例如命令git fetch origin foo
会到远程仓库foo
分支上,获取本地不存在的提交,放到本地的o/foo
上。
git fetch
没有参数,它会下载所有的提交记录到各个远程分支git fetch origin main~:foo
git fetch origin foo:main
git checkout foo
git merge main
git
有两种关于 <source>
的用法是比较诡异的,即你可以在 git push
或 git fetch
时不指定任何 source
,方法就是仅保留冒号和 destination
部分,source
部分留空。
git push origin :foo
操作是删除远程分支foo
git fetch origin :bar
操作是创建本地分支bar
git push origin :foo
git fetch origin :bar
git pull
即git fetch
和git merge
的缩写。
git pull origin foo
相当于git fetch origin foo; git merge o/foo
git pull origin bar~1:bugFix
相当于git fetch origin bar~1:bugFix; git merge bugFix
git pull origin bar:foo
git pull origin main:side
恭喜通关!!!
文章浏览阅读2k次。1 static List<crads> shuen(List<crads> list) 2 { 3 List<crads> cList = new List<crads>(); 4 for (int i = 0; i < list.Count;++i) ...
文章浏览阅读2.1w次。Thinkpad T460P安装win7 Skylake平台装Windows7_t460p支持win7吗
文章浏览阅读1.4k次。亲身经历的四段小事,早想写出来,一直拖到现在。今日做个小记,待日后慢慢品味。百事可乐 09年年初初来京时,居住在一个偏僻的村子里,村子虽小,日常生活都可以在这里解决。当时收入不多,为了省钱,每天早晨都会去一家简陋的小馆子里吃“炸油饼”。去的多了,渐渐的就与馆子的老板_百事顺风车
文章浏览阅读842次。在Android app开发过程中,用fastjson获取后台数据,后台返回的数据:[{"doseFrequencyList":[{"FrequencyCode":"ed","name":"每天","ordinal":"1"},{"FrequencyCode":"iod","name":"隔天","ordinal":"2"},{"FrequencyCode":"iow","name":"隔周","_android网络请求大小写问题
文章浏览阅读235次。原文链接:Bougie的博客 制作目录索引这种东西当然是放在前端方便。选择放在后端一是为了了解Node后端生态,掌握更多后端技术;二是因为公司实行前后端分离的方式开发,睾贵的JAVA后端经常啥也不做处理就返回一个row数据(甚至有时时间戳都不处理),对此有些无语。最终目标 1. 点击索引单项跳转到相应标题 2. 大号标题包含小号标题,小号标题向右缩进 3. 滚动页面时自..._toc-wrapper
文章浏览阅读151次。介绍:In the first RESTEasy tutorial we have learnt the basics about REST Web services and we have tested a simple RESTful Web service. In this tutorial we willshow how to inject web application eleme..._@headerparam@queryparam
文章浏览阅读1.4k次。2016年山东春季高考各校计算机专业录取分数线分别是多少?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!2016年山东春季高考各校计算机专业录取分数线分别是多少?2016年山东春季高考各校计算机专业录取分数线分别是多少?1、2016年全国各省份高考成绩及各批次控制分数线公布时间都集中在6月23-26日之间,预测的分数线..._山东滨州学院计算机专业春考本科分数线
文章浏览阅读151次。(一). 概述HyperLink默认没有Click事件, 重写了一个HyperLink自定义控件. 实现原理: 默认Hyperlink是跳到点击请求的页面, 本HyperLink自定义控件最终也是跳转到请求的页面, 但期间执行了自己的一个方法, 我们可以在此方法中添写自己所需的功能. 本示例演示统计此超链接点击次数功能. [参考Asp.net 2.0高级编程](二). 代..._hyperlink控件后台点击方法
文章浏览阅读9k次,点赞3次,收藏6次。查看防火墙状态$ service iptables status关闭防火墙$ service iptables stop查看防火墙状态$ service iptables status停止hbase$ stop-hbase.sh启动hbase$ start-hbase.sh_can't get connection to zookeeper: keepererrorcode = connectionloss for /hba
文章浏览阅读324次。进一步切入全屋智能、大屏、车机等全场景。2020年,华为消费者业务的产品线纵深正进一步拓展。12月21日,华为面向家庭、出行场景正式发布了三大系列产品。其一是华为智能家居战略及全屋智能解决方案,顾名思义,是提升家居生活智能化的软硬件体系;其二是华为智慧屏S系列,搭载了鸿蒙OS最新版本,该系列是华为智慧屏家族的新成员,产品定位中低端市场,拥有55、65、75寸三种屏幕尺寸共6款机型;其三是车载智慧屏...
文章浏览阅读322次。CMenu::EnableMenuItem启用、 禁用,或变暗的菜单项。UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable);参数nIDEnableItem根据所指定的菜单项,若要启用,nEnable。 弹出菜单项,以及标准菜单项,可以指定此参数。nEnable指定要执行的操作。 它可以是组合的M..._cmenu 菜单项置灰
文章浏览阅读167次。php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,memcached是比较新的开发库,php安装这两个扩展中的任意一个后就可以在编写php代码时使用的memcached缓存数据,达到缓存php执行的结果1、安装memcachetar -zxvfmemcache-2.2.7.tgzcdmemcache-2.2.7/usr/loc..._群晖添加phpredis扩展