- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设远程仓库中有一个远程分支br1
签出,而本地仓库中有一个master
分支。
命令1:如果我执行“ git pull origin br1:br1
”,它将把远程br1
拉入本地br1
,并显示:
9188a5d..97d4825 br1 -> br1
9188a5d..97d4825 br1 -> origin/br1
命令2:如果我仅执行“ git pull
”,它将把远程br1
拉入本地master
,但仅显示以下内容:
9188a5d..97d4825 br1 -> origin/br1
我希望它也显示类似“ br1 -> master
”的内容。为什么不显示呢?
“ br1 -> br1
”是否意味着将远程br1
拉入本地br1
?
“ br1 -> origin/br1
”是什么意思?
更新:在VonC的帮助下,我发现了以下内容:git pull
更新所有跟踪分支。 br1 -> origin/br1
表示遥控器上的br1
被拉到本地跟踪分支origin/br1
中。git pull origin br1:br1
将远程br1
拉入本地br1
和origin/br1
。然后,此后的消息意味着相同的更改集也被拉入当前已签出的分支(消息为Updating ...
,不显示br1 -> master
):
$ git pull origin br1:br1
beb48a4..b344dd1 br1 -> br1
beb48a4..b344dd1 br1 -> origin/br1
Updating cca5a9b..b344dd1
Fast-forward
file2 | 0
file3 | 0
4 files changed, 0 insertions(+), 0 deletions(-)
以前我以为git pull
可以加入本地主机。事实并非如此。正是git pull origin br1:br1
做到了。
更新2:根据torek的解释,特定的问题是命令git pull origin br1:br1
在一系列其他操作之后将远程br1
拉入FETCH_HEAD
,随后将FETCH_HEAD
合并到当前分支中。
最佳答案
警告:长。 TL; DR版本:您正在查看git fetch
输出,而git fetch
根本不影响您的master
,这是影响您git merge
的git pull
的master
部分。但是,您的git fetch
正在更新远程跟踪分支origin/br1
,在一种情况下,甚至会更新甚至创建本地分支br1
。git pull
是一个便捷脚本
始终记住,git pull
只是一个方便脚本,可以为您运行另外两个git命令:首先,git pull
将您的参数传递给git fetch
。完成此操作后,git pull
将运行git merge
(或,如果有指示,请输入git rebase
),但是原始问题中所有引用的操作仅在git fetch
中发生。 (“更新”部分的一部分来自git merge
,我将在后面介绍。)
如果不提供git pull
的远程参数,则pull
脚本将从当前分支的配置中提取一个。在这种情况下,其提取的内容显然是origin
。因此,如果您在未指定git pull
的情况下运行origin
,则实际上是在运行git pull origin
。
如果您没有为git pull
提供refspec参数,则pull
脚本将从您当前分支的配置中提取一个非常简单的脚本-在这种情况下,您从git config --get branch.master.merge
中看到的显然是br1
。因此,这意味着如果您运行git pull origin
,则实际上是在运行git pull origin br1
.1
同样,所有这些然后都直接传递给git fetch
,所以无论您运行git pull
,git pull origin
还是git pull origin br1
,所有这些最终都会调用:
git fetch origin br1
git fetch origin br1:br1
。
br1
签出,而本地仓库中有一个
master
分支。
fetch
几乎无关。
fetch
做的第一件事(或第一件事)是连接到遥控器,并要求它提供所有引用及其对应的SHA-1的列表(您可以通过运行
git fetch
看到
git ls-remote
可以看到的内容) 。遥控器的
HEAD
包含在该列表中,这使您可以指示自己的
fetch
使用它,但是如果不使用它,您的
fetch
只会忽略它(遥控器的
HEAD
通常仅用于控制初始
git clone
上的默认初始分支)。
git pull
提供额外的参数,它将根据您当前的分支找到它们;和
fetch
成功后,
git pull
运行
git merge
或
git rebase
,它们使用当前分支。
master
,因此
pull
将使用
branch.master.remote
和
branch.master.merge
作为默认的remote和refspec参数。2这就是我们可以从原始输出中推断出它们是
origin
和
br1
分别。
git fetch
git fetch
,它的作用是与远程git服务器进行一些协商,以找出可用的引用(主要是分支和标签)以及它们对应的SHA-1值。一旦获得了这些信息,它就会查看您要求它带来哪些引用。如果您列出了像
br1
这样的特定参考,那将是它带来的参考。
git fetch remote refspec
上的行为在git 1.8.4及更高版本中已更改。过去,如果您运行
git fetch remote refspec
,则refspec会覆盖该git的git配置条目中的规则,但现在它只是从中进行选择。默认情况下,名为
origin
的远程服务器的规则集为
+refs/heads/*:refs/remotes/origin/*
,因此您的
br1
refspec从此规则集中选择一个项目。
git fetch
会发生什么,如下所示:
$ git fetch origin
git config --get-all remote.origin.fetch
.4的输出。这是“ refspecs”的列表,每行
git config --get-all
一个。
remote.origin.fetch
的标准行(单行)是
+refs/heads/*:refs/remotes/origin/*
,因此您的本地git将采用与
refs/heads/*
匹配的每个引用名称。也就是说,它将占用
origin
上的所有分支,因为分支只是“名称以
refs/heads/
开头的引用”。这些分支的作用由该refspec的右侧确定:它将
refs/heads/
替换为
refs/remotes/origin/
。
master
,则本地git会将其转换为
origin/master
。如果遥控器上有
br1
,则本地git会将其翻译为
origin/br1
。对于遥控器上的每个分支,您将获得一个(本地)远程跟踪分支,该分支的名称以
origin/
.5开头。
git fetch origin br1
的情况,我们现在可以看到发生了什么:本地git带来了
br1
,它原来是一个分支,因此其全名是
refs/heads/br1
。因此,它与标准
remote.origin.fetch
行匹配,并且
refs/heads/br1
转换为
refs/remotes/origin/br1
,这导致git打印出
origin/br1
:
9188a5d..97d4825 br1 -> origin/br1
br1
是遥控器上引用的简称,右侧的名称
origin/br1
是
git fetch
已更新的引用的简称。
* branch name -> FETCH_HEAD
git fetch
在远程上找到了一个名为
name
的分支(即,引用形式为
refs/heads/name
),并将其转移到本地存储库中,并将其放入
FETCH_HEAD
中。什么是
FETCH_HEAD
?这是一个特殊文件,仅针对
git pull
脚本存在。 (它的工作原理与参考非常相似,但是它具有特殊的格式,并且可能包含多个SHA-1。)
br1:br1
问题。在这里,您要告诉您的本地
git fetch
带来引用
br1
。它照常执行-调用遥控器,发现
br1
确实是
refs/heads/br1
,并带走引用和任何需要的对象-但是这次,除了查询
remote.origin.fetch
行之外,它还编写了新的SHA -1放入您指定的参考中。
br1
没有限定条件:不是
refs/heads/br1
,不是
refs/remotes/origin/br1
,只是
br1
。在这种情况下,git看到它是远程服务器上的
refs/heads/
引用,这意味着它是分支。因此git也会在您的末尾添加
refs/heads/
,并创建或更新自己的
refs/heads/br1
。
br1
。
remote.origin.fetch
行,该行仍为
+refs/heads/*:refs/remotes/origin/*
,因此它仍会更新您的远程跟踪分支
origin/br1
(全名
refs/remotes/origin/br1
)。这就是为什么您从Command 1获得输出的原因。
git merge
FETCH_HEAD
呢?好吧,这是
git pull
其余部分返回的位置:在执行
git fetch
步骤之后,
pull
脚本将运行
git merge
或
git rebase
。它合并的内容(或变基为基础)是
git fetch
文件中留下的
FETCH_HEAD
(带有一些特殊的大写字母和其他注意事项,我在这里不再赘述)。
master
但指示
git pull
拉
origin br1
时,正是
git merge
步骤使
master
与
br1
保持最新。更准确地说,合并使您可以在
origin/br1
完成时获取最新的
git fetch
副本-很可能在
git fetch
完成后,其他人进行了
git push
更新
br1
在您的遥控器上。
Fast-forward
行。
master
留在
git fetch
文件中的原始SHA-1,这也是
FETCH_HEAD
的新SHA-1,在某些情况下,也是新的或更新的本地分支
origin/br1
的新SHA-1)。
br1
远程跟踪分支未更新。不过,所有内容仍然可以在
origin/br1
文件中使用,而且,即使有什么问题,也比新版gits更加令人困惑,在这里我们可以说,您现在是最新的
FETCH_HEAD
,而不必太苛刻和挑剔“
origin/br1
,就像您运行
br1
时在遥控器上一样”。
git fetch
中的
+
。此
+refs/heads/*:refs/remotes/origin/*
符号表示“强制更新”。通常,在更新分支引用时(任何以
+
开头的引用),git均不允许更新,除非它是“快进”标签更新。在refspec中设置force标志会允许该特定更新。在命令行上使用
refs/heads/
还允许该更新以及所有其他参考更新。换句话说,加号只是
--force
的更具针对性(单个refspec)版本。
--force
。
git fetch
脚本确定
pull
完成后稍后要应用哪个refspec。
git fetch
操作还将带入与其所带入的任何提交ID匹配的所有标记名引用。如果您自己运行
fetch
,则可以更改
git fetch
处理它们的方式,但是,如果仅让
fetch
运行
git pull
,则会得到此默认行为。请注意,是由您的本地git做出这些决定:远程git只是将所有内容显示到本地git,然后您的git决定是否向存储库添加标签。
git fetch
只是调用执行此操作的C代码,而不是实际运行
git fetch
。无论如何,如果
git config --get-all
有多个配置条目,则
remote.origin.fetch
实际上确实适用所有这些条目。但是,它的执行方式有点复杂,在此我将跳过详细内容。
git fetch origin
开头的引用,就像本地分支是名称以
refs/remotes/
开头的引用一样。这在git中很普遍:您的标记是名称以
refs/heads/
开头的引用。
refs/tags
脚本使用单个特殊引用
git stash
。 Git的“注释”存储在
refs/stash
下,您可以发明自己的引用:只需选择一个不同的起始字符串,并希望以后没有其他人会为新的git功能选择相同的字符串。 :-)
关于git - git pull命令输出消息含义到哪个分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28337390/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一系列 SQL 命令,我想在大约 40 个不同的表上运行。必须有一种方法可以在不编写 40 条不同命令的情况下执行此操作... 我在 SQL Server 中运行它。所有表都有不同的名称,我要操作
我习惯在 PHP 中使用命令“mysql_insert_id()”来返回插入到我的数据库中的最后一行的 id。 在 C# 中的 SQLite 中是否有等效的命令? 谢谢! -阿德娜 最佳答案 选择 l
试图找出一种方法来回填 ds 分区 Hive 表的分区。 我知道如何从 CLI 运行 Hive 命令,例如 $HIVE_HOME/bin/hive -e 'select a.col from tab1
我有 .bat 文件。看起来像下一个 ....many commands1 ftp -i -s:copy.txt ...many commands2 copy.txt 包含下一个命令 open ...
基本上我想输入 show 并检查是否有 show 命令或别名已定义并触发它,如果未定义则触发 git show 。 例如 rm 应该执行 rm 但 checkout 应该执行 git checkout
我公司的主数据库是 iSeries 机器,我已经非常习惯使用 DB2 命令和结构。我现在正在尝试做一个小项目,更新一个包含超过 300 万条记录的表。我想出一种比较和“清理”数据的更快方法是使用 My
我想在带有 Node 的终端中制作一个简单的按钮板,并“blessed”用于连接或运行不同的命令。 ----------------------------------------------- _
我们有一个 selenium IDE 脚本,正在转换为 python webdriver。以下命令未转换: [openWindow | http://mywebsite.com/index.php |
我正在学习这个关于从 GIT HUB 下载和安装 Web 文件的在线教程。我进入主题:启动我们的静态网站,系统提示我输入命令以下载和安装 Web 文件。但是,当我输入命令 yarn install 时
我在 shell 脚本中使用 elif 命令时遇到问题,就像在 fortran 中一样。 我有 100 家公司的员工名单。我想屏蔽那些员工少于 500 人的公司。我的脚本是 rm -f categor
我有一些 Linux 命令可以生成 token 。我在 Linux 机器上使用操作系统库形式的 Python 自动化了这些命令。它工作正常。 但是,当我在 Windows 中尝试相同的代码时,它没有返
本文分享自华为云社区《Git你有可能不知道交互式暂存》,作者:龙哥手记。 本节中的几个交互式 Git 命令可以帮助你将文件的特定部分组合成提交。 当你在修改了大量文件后,希望这些改动能拆分为若干提交而
我想知道如何使用 IN 比较语法来做到这一点。 当前的 SQL 查询是: select * from employee where (employeeName = 'AJAY' and month(e
我在这个位置安装了 Hadoop /usr/local/hadoop$ 现在我想列出 dfs 中的文件。我使用的命令是: hduser@ubuntu:/usr/local/hadoop$ bin/ha
是否有一个单一的 docker 命令可用于清除所有内容?如果正在运行,请停止所有容器、删除所有图像、删除所有卷...等。 最佳答案 我认为没有一个命令可以做到这一点。您首先需要停止所有容器使用 $ d
我基本上是在 clojure/nrepl 模式中寻找与 C-u C-x C-e 或 C-c C-p 等效的 Scheme。 我想要一个 C-x C-e 将输出打印到缓冲区,而不是仅仅在 repl 中。
我可以在 vim 中使用 pudb(一个 ncurses Python 调试器),因为,例如,:!python %在实际的终端窗口中运行。我更喜欢使用 gvim,但 gvim 运行 :!python
我正在尝试编写一个 FFMPEG 命令: 取为 输入 一个视频 input.mp4 和一个图像 pic.jpg 作为 输出 将 input.mp4 拆分为 20 秒的视频,按顺序重命名;对于每个分割视
我想转储视频每帧的比特率。我正在尝试使用 -vstats 获取此信息命令。当我运行此命令时 - ffmpeg -i input.mp4 -vstats 它显示至少应该定义一个文件。 如果有人能建议我任
我是一名优秀的程序员,十分优秀!