当clone一个远程repo之后,默认会新建一个master或main的本地分支。
比如:
$ git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/main
可以看到本地默认只建了一个main分支,剩下的都是远程分支。
可以在远程分支基础上checkout出一个本地分支来,比如执行命令:
$ git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
这是一个本地分支develop被创建出来。
就是上边输出的名字以remotes/origin/开始的分支。虽然叫远程分支,但是这些分支所对应的commits也是在我们本地的,严格来说应该叫本地的远程分支(有些别扭)。下文说的远程分支都是指这种分支,而不是指远程仓库上的分支。
同时我们也可以将远程分支checkout出来,只不过这个远程分支是只读的,也即我们处于'detached HEAD'状态。
$ git checkout remotes/origin/develop
Note: switching to 'remotes/origin/develop'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 098c616 Create file-in-develop
我们想在本地修改,提交然后同步到远程repo,必须在本地分支上工作,而不能在远程分支操作。
我们在执行git fetch操作的时候,会将远程仓库的commits,files,ref等信息下载到本地,并保存在以remotes/origin/ 开始的分支中(这样说并不准确,严格来说是让remotes/origin/ 开始的分支指向这些新的commits),底层的原理如下图:

我们所有的commits都是类似于一个链表似的,所有分支的commits都互相连接在一起,不管是本地的分支(上图中main指向的)还是远程分支(上图中名字以Orgin/开始的分支),他们都指向这个commits链条的某个点(没错,分支名就是指针,指向某个提交)。我们执行git fetch命令时,会将远程的commits下载下来,让名字以remotes/origin开始的分支去指向他们。但是这些remote的commits,我们是没办法直接在上边工作的(修改操作),我们可以先将这些包含新的commits的远程分支checkout来,然后在此基础上新建一个分支,然后再做修改。
或者我们可以直接将这些远程分支merge到我们的本地分支,比如:
$ git fetch origin develop
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), 609 bytes | 304.00 KiB/s, done.
From https://github.com/YiyiSmile/test06087
* branch develop -> FETCH_HEAD
90b6713..311a291 develop -> origin/develop
$
$
$ git status
On branch develop
Your branch is behind 'origin/develop' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
$ ls
README.md a file-in-develop file2 file3 hello world
$ git merge origin/develop
Updating 90b6713..311a291
Fast-forward
file4 | 1 +
1 file changed, 1 insertion(+)
create mode 100644 file4
$ ls
README.md file-in-develop file3 hello
a file2 file4 world
我们先用git fetch将远程repo上的develop分支的新的提交(file4)下载到本地的origin/develop分支上,这时本地的develop分支完全没有受影响,工作区,stage区和提交区都没有变化。然后执行merge命令,将origin/develop分支 merge到本地分支develop。
除了用merge命令,还可以简单用git pull来完成将快进(fast forward),将origin/develop里有的commits 合并到我们本地的develop分支。
git pull与git fetch的区别具体可以参考文档:
Git Fetch | Atlassian Git Tutorial
git fetch是将远程repo数据下载到本地,但对本地仓库完全没有影响。而git pull会将远程仓库数据下载到本地,并自动完成合并,更新工作区和stage区(索引区)。
比如我们在远程仓库develop闻分支新建一个文件file5,然后执行命令git status,发现并没有提示消息:Your branch is behind 'origin/develop' by 1 commit

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.
nothing to commit, working tree clean
$ ls
README.md file-in-develop file3 hello
a file2 file4 world
这时,我们可以通过两种方式让该消息出现:
方式一:可以在别的分支下,比如main分支下,执行git pull,后边不带任何参数。这时除了远程仓库的main分支数据会被下载下来,其他所有分支的数据会被拉下来,但是只有当前所在的本地分支main会自动与远程同步,完成merge、工作区、stage区的同步。而其他分支,比如这里的develop分支,他们并不会同步。但是对应的远程分支(orgin/develop)却完成了同步。
方式二:执行git fetch命令。
当orgin/develop指向了从远程下载下来的新的提交,而本地的develop还是指向老的提交,这时运行git status命令时,就会看到“Your branch is behind 'origin/develop' by 1 commit”消息。
$ git fetch
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 646 bytes | 323.00 KiB/s, done.
From https://github.com/YiyiSmile/test06087
311a291..634ba9e develop -> origin/develop
$ git status
On branch develop
Your branch is behind 'origin/develop' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
也就是说并不是只要远程仓库有更新了,git status就会报告你的本地分支落后于远程分支。而是只有当远程仓库的数据同步到本地的名字以origin/开始的分支之后,git status才会比较本地与远程分支的差异。这个比较过程都是在本地完成的,不存在网络通信过程。
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev