Git常见分支问题各个击破-阿里云开发者社区

开发者社区> xxq2dream> 正文

Git常见分支问题各个击破

简介: 本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 为什么已经推到远程的分支,我本地checkout的时候还是提示找不到分支? 首先我们要弄清楚的是,checkout 是本地命令,不跟远程仓库打交道。
+关注继续查看

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

为什么已经推到远程的分支,我本地checkout的时候还是提示找不到分支?

首先我们要弄清楚的是,checkout 是本地命令,不跟远程仓库打交道。我们基于远程分支新建一个分支时一般会这样操作:

git checkout -b XXX origin/XXX

实际上,上面的命令并不是从远程仓库拉分支下来切换,而是从我们本地的远程引用中切换新分支,也就是从我们本地的Git仓库中的 refs/remotes 目录下面。

而本地的远程引用只有在和远程仓库沟通时才会更新。换句话说,我们的本地仓库很多时候并不是最新的,其他小伙伴推到远程的分支我们如果不拉取是没有的。

所以我们需要先更新一下,把新的分支拉到我们的本地仓库中,执行一下 git fetch 就好了。

Git fetch和Git pull

git fetch 是从远程仓库拉取本地没有的数据,不会修改工作目录的内容。获取的数据包括远程新的分支、新的提交等,更新的是远程引用。

git pull 基本就相当于 git fetch 加上 git merge,也就是除了拉取新的数据外,它还会把当前分支对应的远程分支上的内容 merge 到当前分支。所以很多时候,我们用 git pull 以后都会报冲突,就是因为Git自己执行了merge操作。

非常重要的是,如果我们是和其他小伙伴在同一个分支合作开发,我们在 push 之前,必须先拉取一下。

回滚远程仓库时,git push origin HEAD --force的原理是什么?实际上是做了啥操作?

实际上是把本地分支指向的 commit 强制更新到了远程对应的分支。

如何用命令删除远程分支?删除远程仓库分支实际是干了啥?(谨慎操作)

// -D 大写,表示强制删除
git branch -d branchName

我们知道分支实际上是 resf/heads/下面的一个文件,里面保存的是最新的一次 commit 的SHA-1值。实际上,删除分支就是删除了这个引用文件,那删除远程仓库的分支也就是删除远程仓库下面的对应分支的引用。

明白了删除远程仓库分支的原理,我们来看看删除远程仓库分支的命令:

git push origin :branchName

上面命令的意思就是将远程仓库的 branchName 的分支引用置为空。

引用规格

上面的命令实际上是一种引用规格的应用,引用规格的形式为 :,其中 <src><dst> 是一个模式(pattern)。之前在讲到 git fetch 的时候我们提到了 Git仓库目录下的 config文件:

[remote "origin"]
    url = https://github.com/schacon/simplegit-progit
    fetch = +refs/heads/*:refs/remotes/origin/*

上面的 fetch 实际上就是应用到了引用规格,含义之前已经提到过,就是把远程仓库 refs/heads/ 目录下的引用更新到本地仓库的 refs/remotes/origin/

实际上,我们还可以设置 push 操作的引用规格。比如我们想将当前的 master 分支推送到远程仓库的mymaster 分支,我们就可以这样:

git push origin master:refs/heads/mymaster

更进一步的,如果我们想把自己分支都推送到远程仓库的 KAE 目录下,我们就可以在 config 目录下更新一条关于 push 操作的引用规格:

[remote "origin"]
    url = https://github.com/schacon/simplegit-progit
    //fetch中冒号前面的表示是远程仓库的引用,后面的表示那些远程引用在本地所对应的位置
    fetch = +refs/heads/*:refs/remotes/origin/*
    //push相反,前面的是本地的引用位置,后面的表示远程仓库的地址
    push = refs/heads/*:refs/heads/ant/*

经过上面的设置以后,我们每次 push 都会把本地的分支推送到远程仓库的 ant/* 分支。


欢迎关注我的公众号查看更多精彩文章!
AntDream

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10077 0
使用git遇到的问题汇总
1、git中remotes/origin/HEAD指向的分支丢失 用git命令查看分支时,会提示一个错误信息: $ git branch -av ...... ...... error: some refs could not be read 查看几个分支都正在使用,用branch -a查看到remotes/origin/HEAD指向了一个不存在的分支: $
2026 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13884 0
**Git中的AutoCRLF与SafeCRLF换行符问题
目前我的解决的方法是:windows上开发,提交到git(oschina的linux环境),在windows上用ftp(二进制传输,不做处理原样传输)上传部署到业务服务器上 我觉得在windows下开发,再git到oschina,再ftp上传到linux服务器上,比较保险的方式是:git时不开启自动转换autocrlf,但开启safecrlf,  ftp用二进制 最近在使用GitHub,发现不时没有修改过的文件要提交,对比发现文件全部修改,但找不到不一样的地方。
872 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
+关注
xxq2dream
Android开发一枚,偶尔搞点别的,哈哈!公众号:AntDream
54
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载