- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常,git标签是对提交的固定引用。但是有时它们被用来标记某些事件(last-build
,base-line
等),并且它们经常更改。
我有一个脚本,可以从引用资料库中刷新那些“ float ”标签。
git fetch --tags --force
git pull origin <mybranch>
git pull
在本地存在时不会刷新标签,并且如果它先运行,它可能会与所有标签的引用一起工作。
git pull
具有
--force
选项,但是选项
--no-tags
的帮助部分将默认行为解释为:
By default, tags that point at objects that are downloaded from the remote repository are fetched and stored locally.
git pull
应该放在第一位。
最佳答案
这进入了Git较为模糊的角落之一,但最后的答案是“最初使用哪个顺序都没有关系”。但是,我建议通常避免使用git pull
,并且无论如何也不要在脚本中使用它。另外,正如您将在下面看到的那样,它确实以不同的方式准确地影响了何时获取。因此,我建议您先运行自己的git fetch
,然后根本不使用git pull
。git fetch
普通的git fetch
(不带--tags
)默认情况下使用怪异的混合标签更新,尽管每个 Remote 都可以定义一个默认标签选项来覆盖此默认值。您引用的是奇怪的混合体:指向从远程存储库下载的对象的标记被获取并存储在本地。用于此的基 native 制有些棘手,我将在以后讨论。
在--tags
参数中添加git fetch
与在命令行上指定refs/tags/*:refs/tags/*
具有几乎相同的效果。 (稍后我们会看到区别。)请注意,这在refspec中没有设置force标志,但是测试表明无论如何都对获取的标签进行了强制更新。
添加--force
与在每个显式refspec中设置force标志具有相同的效果。换句话说,git fetch --tags --force
大致等同于运行git fetch '+refs/tags/*:refs/tags/*'
:如果 Remote 上有标记refs/tags/foo
指向提交1234567...
,则您的Git将替换任何现有的refs/tags/foo
,因此您现在拥有自己的refs/tags/foo
也指向commit 1234567...
。 (但是在实践中观察到,即使仅使用--tags
,它也可以做到这一点。)
请注意,在所有情况下,git fetch
都会将有关所获取内容的信息写入FETCH_HEAD
文件。例如:
$ cat .git/FETCH_HEAD
e05806da9ec4aff8adfed142ab2a2b3b02e33c8c branch 'master' of git://git.kernel.org/pub/scm/git/git
a274e0a036ea886a31f8b216564ab1b4a3142f6c not-for-merge branch 'maint' of git://git.kernel.org/pub/scm/git/git
c69c2f50cfc0dcd4bcd014c7fd56e344a7c5522f not-for-merge branch 'next' of git://git.kernel.org/pub/scm/git/git
4e24a51e4d5c19f3fb16d09634811f5c26922c01 not-for-merge branch 'pu' of git://git.kernel.org/pub/scm/git/git
2135c1c06eeb728901f96ac403a8af10e6145065 not-for-merge branch 'todo' of git://git.kernel.org/pub/scm/git/git
--tags
的提取运行中进行):
$ git fetch --tags
[fetch messages]
$ cat .git/FETCH_HEAD
cat .git/FETCH_HEAD
d7dffce1cebde29a0c4b309a79e4345450bf352a branch 'master' of git://git.kernel.org/pub/scm/git/git
a274e0a036ea886a31f8b216564ab1b4a3142f6c not-for-merge branch 'maint' of git://git.kernel.org/pub/scm/git/git
8553c6e5137d7fde1cda49817bcc035d3ce35aeb not-for-merge branch 'next' of git://git.kernel.org/pub/scm/git/git
31148811db6039be66eb3d6cbd84af067e0f0e13 not-for-merge branch 'pu' of git://git.kernel.org/pub/scm/git/git
aa3afa0b4ab4f07e6b36f0712fd58229735afddc not-for-merge branch 'todo' of git://git.kernel.org/pub/scm/git/git
d5aef6e4d58cfe1549adef5b436f3ace984e8c86 not-for-merge tag 'gitgui-0.10.0' of git://git.kernel.org/pub/scm/git/git
[much more, snipped]
remote.origin.fetch
配置条目控制),以更新一组远程跟踪分支,并创建或更新一些标记。如果将您配置为获取镜像,并且将更新refspec设置为
+refs/*:refs/*
,那么您将获得所有内容。请注意,此refspec设置了force标志,并覆盖所有分支,所有标签,所有远程跟踪分支和所有注释。关于何时使用什么refspec的细节还有更多晦涩的细节,但是使用
--tags
(带有或不带有
--force
)不会覆盖配置条目(尽管编写一组明确的refspecs确实如此,所以这是一种方法-也许是唯一的方法-
--tags
与众不同从写出
refs/tags/*:refs/tags/*
)。
pull
而言并不重要,我们将在下一部分中看到。
git pull
git pull
仅运行
git fetch
,然后运行第二个Git命令,除非您指示它使用
git merge
,否则第二个命令默认为
git rebase
。这是正确且正确的,但途中有一个晦涩的细节。在将
git fetch
重写为C代码之前,这更容易说:在返回脚本时,您可以遵循脚本的
git fetch
和
git merge
命令并查看实际参数是什么。
git pull
运行
git merge
或
git rebase
时,它不使用您的远程跟踪分支和标记。而是使用
FETCH_HEAD
中留下的记录。
refs/heads/master
上存储库中的
git.kernel.org
指向commit
e05806d...
。在我运行
git fetch --tags
之后,新的
FETCH_HEAD
文件告诉我们
refs/heads/master
上存储库中的
git.kernel.org
指出了(在我运行
fetch
时,它可能现在已经更改了)来提交
d7dffce...
。
git pull
运行
git merge
或
git rebase
时,它将传递这些原始SHA-1数字。因此,您的引用名称解析为什么都没有关系。我运行的
git fetch
实际上更新了
origin/master
:
$ git rev-parse origin/master
d7dffce1cebde29a0c4b309a79e4345450bf352a
git pull
也会将
d7dffce1cebde29a0c4b309a79e4345450bf352a
传递给第二个命令。
--force
的标签并获得了对象
1234567...
。进一步假设,如果您一直在强行获取标签,这将是
git rev-parse refs/tags/last-build
的结果,但是由于您没有使用
--force
,因此您自己的存储库中的
last-build
指向
8888888...
(在中国非常幸运的提交:-))。如果您亲自说“告诉我有关
last-build
的信息”,您将获得修订版
8888888...
。但是
git pull
知道它得到了
1234567...
,无论发生什么其他事情,只要有需要,它都会将数字
1234567...
传递给它的第二个命令。
FETCH_HEAD
中获取该数字。因此,这里重要的是
FETCH_HEAD
的(完整)内容,这取决于您是否使用
-a
/
--append
进行获取。仅在特殊情况下才需要/想要
--append
(在此处不适用)(当您从多个单独的存储库中获取信息,或者出于调试目的而在单独的步骤中获取信息时,等等)。
last-build
标记,则必须在某个时候运行
git fetch --tags --force
-现在我们要解决原子性问题。
git fetch
,有或没有
--tags
,有或没有
--force
,也许是通过运行
git pull
而不是
git fetch
来运行
--tags
的。现在,您已经在本地提交了
1234567...
,名称
last-build
指向
8888888...
(未更新)或
1234567...
(已更新)。现在,您运行
git fetch --tags --force
来更新所有内容。现在, Remote 有可能再次移动了
last-build
。如果是这样,您将获得新值,并更新您的本地标签。
8888888...
。您可能有一个 merge 了该提交的分支,但不知道该标签的提交—现在您要更新标签,现在也不知道该标签的
8888888...
。那是好事,坏事还是无动于衷?这取决于你。
git pull
git pull
仅运行
git fetch
后跟第二个命令,因此您可以自己运行
git fetch
,后跟第二个命令。这使您可以完全控制
fetch
步骤,并避免重复获取。
fetch
步骤,因此您可以使用refspecs精确地指定要更新的内容。现在是时候访问奇怪的混合标签更新机制了。
git ls-remote
。这将显示
git fetch
在连接时看到的内容:
$ git ls-remote | head
From git://git.kernel.org/pub/scm/git/git.git
3313b78c145ba9212272b5318c111cde12bfef4a HEAD
ad36dc8b4b165bf9eb3576b42a241164e312d48c refs/heads/maint
3313b78c145ba9212272b5318c111cde12bfef4a refs/heads/master
af746e49c281f2a2946222252a1effea7c9bcf8b refs/heads/next
6391604f1412fd6fe047444931335bf92c168008 refs/heads/pu
aa3afa0b4ab4f07e6b36f0712fd58229735afddc refs/heads/todo
d5aef6e4d58cfe1549adef5b436f3ace984e8c86 refs/tags/gitgui-0.10.0
3d654be48f65545c4d3e35f5d3bbed5489820930 refs/tags/gitgui-0.10.0^{}
33682a5e98adfd8ba4ce0e21363c443bd273eb77 refs/tags/gitgui-0.10.1
729ffa50f75a025935623bfc58d0932c65f7de2f refs/tags/gitgui-0.10.1^{}
gitgui-0.10.0^{}
。此语法表示剥离的标记(请参见
gitrevisions
,尽管此处未使用单词“peeled”)。
refs/heads/*
的分支)。 (您不必下载已经拥有的对象,只需下载那些您缺少但需要的对象。)然后,您的Git可以浏览所有已剥离的标签,以查看是否有任何标签指向那些提交中的一个。如果是这样,您的Git会使用给定标签(无论是否带
--force
模式,具体取决于您的提取)。如果该标签指向标签对象,而不是直接指向提交,则Git还将该标签对象也添加到集合中。
--force
。也就是说,先前的标签目标仅需要是新标签目标的祖先。显然,这只会影响轻量级标签,在任何情况下,Git 1.8.2及更高版本在推送时都具有“从不替换没有
--force
的标签”的行为。然而,对于Git 2.10.x和2.11.x观察到的行为是,使用
--tags
时,标签在获取时被替换。
git fetch --tags --force --prune
可以做到;或者,您也可以
git fetch --prune '+refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*'
,它使用
+
语法来强制标记和远程跟踪分支更新。 (
--prune
像往常一样是可选的。)force标志可能是不必要的,但在这里至少是无害的,并且在某些Git版本中可能会做一些有用的事情。现在,您的标签和远程跟踪分支已更新,您可以使用不带任何参数的
git merge
或
git rebase
,使用当前分支的上游配置 merge 或重新设置基础。您可以根据需要在任意多个分支重复此操作,根本不需要运行
git pull
(及其冗余
fetch
)。
关于git - “git fetch --tags --force”和 “git pull <branch>”是可交换的操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41708925/
我试图让 Branch.io 在 Android 上工作,但我遇到了: myapplication.MainActivity cannot be cast to android.app.Applica
当我执行 git branch 时,我知道我在分支 v0.2 上。 git branch v0.1 * v0.2 但是当我执行 git push 时它说“你当前分支的上游分支与你当前分支的名称不
在使用 Git GUI 检查远程分支 releases/rel_5.4.1 之后,当我尝试 push 时看到了这个意外的错误消息: fatal: The upstream branch of your
SO 上有一个相关问题处理如何更改 push 命令的参数以避免出现此消息: fatal: The upstream branch of your current branch does not mat
arc feature [branch-name] 和 git branch [branch-name] 有什么区别? 他们似乎都创建了一个新分支。 最佳答案 arc feature [branch-
FIFO、LIFO 和LC Branch and Bound 有什么区别? 最佳答案 Branch & Bound 通过使用估计边界来限制可能解决方案的数量来发现完整搜索空间内的分支。不同的类型(FI
有人知道这两个切换和跟踪远程分支的命令之间的区别吗? git checkout -b branch origin/branch git checkout --track origin/branch 我
关于 git-svn 工作流程有很多问题,但我一直无法弄清楚这一点: This section of the svn book谈到 SVN 的一个常见做法:创建一个分支,并在主干更新时不断合并主干中的
我正在构建一个控制 git 存储库的 PHP 应用程序。我有一个执行命令 git status 的同步函数,虽然没有返回“你的分支是最新的”,但可能会提前采取必要的行动,比如远程或本地分支。 我还构建
是否可以使用 branch.io 创建自定义链接,例如 https://example.app.link/fzmLEhobLD所以我可以用我的自定义 10 位参数(如 amitpp8888)控制 fz
我从 github 克隆了一个分支,它的名字是 dev。我已经开始使用它, pull 和推送代码更改并确保我的本地存储库与远程存储库保持同步。我要开始实现一个新功能,因此创建了一个新分支,如下所示:
我们有一个发布模型,为简单起见,我们假设每月 1 次。所以,我们通常会去: Jan -> trunk trunk -> Feb trunk trunk et
使用 Branch.io HTTP API 创建的链接不会在 Branch 门户中显示为快速链接。快速链接很方便,因为它们在一个 View 中显示“点击”、“打开”等内容 用于创建链接的 API:li
我创建了一个分支,当我第一次从源代码合并到分支时,出现了一大堆旧的变更集,它说没有合并,但它们在分支之前就存在,我确认它们在那里。 例子: 假设当 Source 中有 9 个变更集时,我从 Sourc
这是关于我为什么这样做 不是 收到错误“致命:当前分支 A 没有上游分支”。 我删除了 远程 分公司 一个 使用命令 git push origin :A . 然后我切换到本地 分支 A 使用命令 g
我正在使用 clover 插件来检查我的 java 代码测试覆盖率。 我为所有行编写了单元测试。当我点击红线时,它显示“true分支执行了2次,分支执行了0次”。这是什么意思?我该如何解决这个问题?
很确定我误解了 git。 我的目标 我在 github 上有一个带有“master”分支的私有(private)存储库。 我还想有一个生产分支,我会将所有更改从 master 推送到该分支。 然后我想
我将一个相当老的主题分支重新定位到 master 上。由于在 rebase 期间有很多冲突,我想将旧主题分支与 rebased 分支进行比较,以确保我没有意外删除或搞砸主题上的任何更改。我最接近的是比
我正在尝试将我的一个项目推送到 github,但我一直收到此错误: peeplesoft@jane3:~/846156 (master) $ git push fatal: The current b
Jenkins Git 插件根据我的引用规范在控制台输出中生成了以下命令 下面两个命令有什么区别?他们的输出看起来没什么不同。我在下面给出了他们的输出: 命令 1: git fetch --no-ta
我是一名优秀的程序员,十分优秀!