Jim*_*Jim 7 git git-pull git-merge git-branch
我正在尝试从另一个分支获取文件的内容。
我正在做以下事情:
git checkout branchB some_specific_file.cc
Run Code Online (Sandbox Code Playgroud)
当前分支不受影响。我怀疑原因是即使我做了一个git pull我从来没有在branchB本地签出过。
如果我刚刚pull在 repo 中完成了一个但从未实际检查过另一个分支,有没有办法让这个命令起作用?
是否有等价于:
git pull
git checkout branchB
git checkout branchA
git checkout branchB some_specific_file.cc
Run Code Online (Sandbox Code Playgroud)
实际上不必切换到分支,所以最后一个命令有效?
tor*_*rek 10
我想你想要的是:
$ git fetch
$ git checkout origin/branchB -- some_specific_file.cc
Run Code Online (Sandbox Code Playgroud)
你在这里犯的根本错误是认为分支意味着什么。:-) 或者更确切地说,分支名称具有某种全局意义——但它没有!
该git pull命令是为了方便操作:它首先运行git fetch,然后运行第二个 Git 命令。默认的第二个命令通常是git merge,但是(a)您可以更改它并且(b)有一些极端情况。这被认为(但实际上并不)方便的原因是git fetch只获得新的提交。它不会影响您的任何分支(它们是您的,它们不属于某些远程分支origin!)。
通常,在您从某个远程(如 )获得新提交后origin,您将希望将(一些)这些提交合并到(一些)您自己的分支中。为此,您需要第二个 Git 命令,例如git merge或git rebase。不过这里有很多小问题,例如:
该git pull便利命令投下所有这些放到一边,向你保证,无论什么git fetch一样,你是100%肯定立即git xxx在-you填充xxx部分之前你抓取,是正确的答案!如果不是——根据我的经验,实际上经常发生——那么git pull就是错误的命令。
上面这两个命令的序列:
git pull
git checkout branchB
Run Code Online (Sandbox Code Playgroud)
会,如果你还没有拥有一个branchB,创建了自己一个新的(本地)分支名称branchB,指向相同的承诺为您现有的远程跟踪名称 origin/branchB。然后:
git checkout branchA
Run Code Online (Sandbox Code Playgroud)
让您回到您的(可能存在的)分支 A,我们稍后会对此进行更多说明。最后的命令:
git checkout branchB -- some_specific_file.cc
Run Code Online (Sandbox Code Playgroud)
然后从 name 标识的提交中提取该特定文件branchB。(我在--此处添加了- 反射使用它是个好主意,以防文件名类似于git checkout选项或分支名称;some_specific_file.cc不会,因此无论哪种方式都是安全的。)
该git fetch步骤让您的 Git 调用另一个 Git,通常在您存储在 name 下的 URL 处origin。他们的 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,上游branchA是origin/branchA,依此类推。这些是你为他们的分支机构命名的。当git pull运行时git fetch,它说:只更新这一块远程跟踪名称。
这最终意味着,git pull虽然未打开,但不会branchB更新您的origin/branchB,这(最终)是一个大问题。 您需要颠倒命令的顺序:先检出branchB,然后拉出。(或者,更好的是,避免 git pull,但稍等片刻。)
该git checkout命令会将您切换到您已经拥有的某个现有分支:
git checkout master
Run Code Online (Sandbox Code Playgroud)
例如,会将您切换到master您可能已经拥有的 。但如果你还没有,git checkout将扫描你的origin/*名字——远程跟踪(不完全是一个分支)的名字——看看在拿走origin/零件后是否有匹配的名字。
如果是这样,您的 Git 将创建一个新的本地分支名称,将其origin/版本作为其“上游”。
git merge始终且仅在当前分支上运行的最后一步git pull通常是运行git merge. 如果你运行:
git checkout branchB
git pull
Run Code Online (Sandbox Code Playgroud)
这意味着 Git 应该:
branchB,或在必要时创建它origin/branchB;origin/branchB(仅);git merge以更新您当前的分支branchB——使用它的上游,origin/branchB,git fetch刚刚更新。然后合并步骤将使您的本地分支branchB得到更新。
因此,在一般情况下,你必须git checkout branchB 之前您git pull以确保origin/branchB是(单)远程跟踪名称的fetch更新,然后你自己的地方branchB也被更新。
但是您的任务不需要任何这些。如果您只是运行git fetch,它会更新您的所有origin/*名称,然后使用它origin/branchB来识别包含some_specific_file.cc您想要的版本的提交,那么您很好。因此,我在顶部建议的最后一组命令。
| 归档时间: |
|
| 查看次数: |
6427 次 |
| 最近记录: |