gpt4 book ai didi

git - 从另一个分支获取文件的内容而不检查它

转载 作者:太空狗 更新时间:2023-10-29 14:28:55 25 4
gpt4 key购买 nike

我正在尝试从另一个分支获取文件的内容。
我正在做以下事情:

git checkout branchB some_specific_file.cc  

当前分支不受影响。我怀疑原因是即使我做了一个 git pull我从来没有退房 branchB本地。
如果我刚刚完成了 pull,有没有办法让这个命令起作用?在 repo 中但从未实际检查过另一个分支?
是否有等价于:
git pull  
git checkout branchB
git checkout branchA
git checkout branchB some_specific_file.cc

实际上不必切换到分支,所以最后一个命令有效?

最佳答案

TL; 博士

我想你想要的是:

$ git fetch
$ git checkout origin/branchB -- some_specific_file.cc

背景

你在这里犯的根本错误是认为分支意味着什么。 :-) 或者更确切地说,分支名称具有某种全局意义——但它没有!
git pull命令是为了方便操作:它首先运行 git fetch ,然后它运行第二个 Git 命令。默认的第二个命令通常是 git merge ,但是 (a) 您可以更改此设置,并且 (b) 有一些极端情况。这被认为(但实际上并不)方便的原因是 git fetch只获得新的提交。它不会影响您的任何分支(它们是 您的 ,它们不属于诸如 origin 之类的远程分支!)。

通常,在您从某个远程(如 origin)获得新的提交后,您将希望将(一些)这些提交 merge 到(一些)您自己的分支中。为此,您需要第二个 Git 命令,例如 git mergegit rebase .不过这里有很多小问题,例如:
  • 你怎么知道是 merge 、 rebase 还是完全做其他事情?
  • 如果您想在多个分支机构开展业务怎么办?
  • git pull便利命令将所有这些放在一边,并向您保证,无论如何 git fetch确实,您 100% 确定立即 git xxx —您填写 xxx在你获取之前部分 - 是正确的答案!如果不是——根据我的经验,这实际上经常发生——那么 git pull是错误的命令。

    你在上面做什么

    上面这两个命令的序列:
    git pull
    git checkout branchB

    如果您还没有 branchB , 为自己创建一个新的(本地)分支名称 branchB ,指向与您现有的远程跟踪名称相同的提交 origin/branchB .然后:
    git checkout branchA

    让您回到您的(可能存在的)分支 A,我们稍后会对此进行更多说明。最后的命令:
    git checkout branchB -- some_specific_file.cc

    然后从由名称 branchB 标识的提交中提取该特定文件. (我在这里添加了 --——反射使用它是个好主意,以防文件名类似于 git checkout 选项或分支名称; some_specific_file.cc 不会,所以无论哪种方式都是安全的。)

    git pull = git fetch + git merge
    git fetch step 让您的 Git 调用另一个 Git,通常在您存储在名称 origin 下的 URL 中。 .他们的 Git 列出了他们的分支名称,以及哪些提交哈希 ID 与这些分支名称对应。然后你的 Git 确保你有这些提交,一旦你这样做了,设置你的 origin/*名称以记住这些哈希 ID。
    origin/*名称就是我所说的远程跟踪名称; Git 称它们为远程跟踪分支名称。他们记得,对你来说,在你自己的 Git 存储库中,远程分支名称所在的位置,上次你的 Git 与他们的 Git 交谈。

    因此,由于 git pull运行 git fetch ,这具有更新远程跟踪名称的副作用。但是有一个问题: git pull ,为了方便起见,限制了 git fetch 的名称集取。

    通常 git fetch获取他们所有的分支名称,更新所有相应的远程跟踪名称。从 git pull 运行时不过,Git 会查看您当前分支的所谓上游设置。通常是 master 的上游是 origin/master ,上游 branchAorigin/branchA , 等等。这些是你为他们的分支机构命名的。当 git pull运行 git fetch ,它说:只更新这个远程跟踪名称。

    这到底意味着git pull虽然不在 branchB不会更新您的 origin/branchB ,这(最终)是一个大问题。 您需要颠倒命令的顺序:查看 branchB先 pull ,后 pull 。 (或者,最好避免 git pull ,但请稍等。)

    创建(本地)分支
    git checkout命令会将您切换到您已经拥有的某个现有分支:
    git checkout master

    例如将您切换到 master ,你可能已经有了。但如果你还没有, git checkout将扫描您的 origin/*名称 - 远程跟踪(不完全是分支)名称 - 以查看在移除 origin/ 后是否有匹配的名称部分。

    如果是这样,您的 Git 将创建一个具有 origin/ 的新本地分支名称。版本本身作为它的“上游”。
    git merge始终且仅在当前分支上运行
    git pull的最后一步正常运行 git merge .如果你运行:
    git checkout branchB
    git pull

    这意味着 Git 应该:
  • 查看您现有的 branchB ,或在必要时从 origin/branchB 创建它;
  • 获取和更新 origin/branchB (只要);
  • 运行 git merge更新您当前的分支— branchB — 使用其上游,origin/branchB , 其中 git fetch刚刚更新。

  • 然后 merge 步骤将使您的本地分支 branchB得到更新。

    所以一般来说,你必须 git checkout branchB在你之前 git pull以确保 origin/branchBfetch 的(单个)远程跟踪名称更新,然后是您自己的本地 branchB也更新了。

    你不需要那个

    但是您的任务不需要任何这些。如果你只是运行 git fetch ,它会更新您的所有 origin/*名称,然后使用 origin/branchB识别包含 some_specific_file.cc 版本的提交你想要的,你很好。因此,我在顶部建议的最后一组命令。

    关于git - 从另一个分支获取文件的内容而不检查它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49695973/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com