- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我刚刚注意到,有时在 master 和 feature-branch 之间切换时,即使一切都已经 pull/推 + 最新...
如果我这样做
git checkout featureBranch
它是即时的(没有进度信息)。
但是当我这样做的时候
git checkout master
它需要更长的时间,并且您还会获得进度信息:
Checking out files: 100% (312/312), done.
即使我只是来回切换几次,这种行为也是可重复的。
只是好奇——导致这种情况的底层实现细节(?)是什么?
最佳答案
更新 - torek 指出(在评论中)git 在开始显示状态之前用完了一个计时器 - 所以快速 checkout 根本不显示状态,但如果它开始花费足够长的时间你可能会注意到,你可以看到进步。更新了几句话来反射(reflect)这一点。
在某种程度上,我会说这一定与特定的 repo 有关,因为我不知道 git 考虑的任何方式(除了“作为第一个分支的默认名称”) master
随着分支的发展而特别。
但我可以做出有根据的猜测。当存在打包对象时,git 会针对任何给定文件的最新版本进行优化。例如,假设您有
A --- B --- C <--(master)
\
D <--(feature)
D
中的每个文件都将是该特定文件的“最新版本”;所以它要么是一个松散的对象,要么是包文件中的“非差异”对象。因此检查 feature
不需要修补任何文件;它只是读取 blob。它可能发生得足够快,以至于 git 感觉不需要开始显示状态。
理论上 C
可以有一些文件的“旧版本”,在一个包中可以表示为“与 较新版本的文件 的差异”。实际上,如果您的事件分支中只有一个较新的提交,我怀疑它会变成那样。但是在真实的 repo 中,master
可能在 develop
之后,而 develop
可能在任意数量的功能分支之后,master
head commit 有一些 packed-and-diffed 对象需要解析。我怀疑补丁的应用需要足够的时间来提供可见的状态报告。
这不是唯一的可能解释。也许您在 master
下有一个更大的工作树,或者 LFS 的使用可能是一个因素(尽管我认为在那种情况下您会看到不同的输出)。就像我说的,通常我会怀疑 repo 特定因素在起作用。只是我上面描述的是一个“ repo 特定因素”,可能适用于大多数重要的 repo 。
更新 2 - 我在这里的基本主张 - master
并不特别 - 很容易测试。克隆 repo,并在克隆中
git checkout master
git branch featureOldMasterBranch
git checkout featureBranch
git branch -f master
现在,master
的克隆 check out 应该是即时的,而 featureOldMasterBranch
的 check out 应该需要足够的时间来显示可见的进度更新。
请记住,分支只是一个 ref 只是一个指针,这表明它与提交有所不同 - 即某些特定于 repo 的东西 - 而不是对 master
的任何特殊处理。
关于git - 为什么 'checkout master' 花费的时间比 'checkout feature-branch' 长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309482/
我试图让 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
我是一名优秀的程序员,十分优秀!