Git,在同一个存储库中查看多个分支

时间:2013-05-26 22:22:32

标签: git

这是我们的工作流程:

  1. 开发人员正在从中央存储库进行克隆。
  2. Dev A在本地处理错误修复A,分支bug_a,将分支bug_a推送到中央存储库。
  3. Dev B在本地处理错误修复B,分支bug_b,将分支bug_b推送到中央存储库。
  4. 工作完成后,分支将合并到develop分支。
  5. 让我们假设(为简单起见)两个分支都不接触公共文件。我们的要求是,最终可以重建哪些文件和代码随之改变 bug_abug_b也是如此。因此,在bug_a中合并develop的提交显示了对此错误A解决方案所做的更改。

    现在问题出现了:我正在处理bug_a,我希望在我的存储库中看到bug_b的更改。

    我知道我可以在bug_b分支中提取bug_a的更改但是现在我的要求不是 已完成,因为在develop的最后合并/提交中,我也看到bug_b的更改 我无法重建为解决错误A所做的确切更改。

    我的问题是Git中有一个命令或程序,其中的更改是在其他分支中进行的 在当地的工作部门可见吗?就像一个透明的“视图”,例如

    master
    develop
    bug_b
    *bug_a
    

2 个答案:

答案 0 :(得分:2)

滥用一些术语,每个git repo本身就像一个明确的私人视图:你不能直接看到其他人。 (但是我会提到一条捷径。)

幸运的是,你可以间接地看到他,因为你们两个拥有第三个共享的回购。他推送到共享仓库,然后你fetch(不要pull因为这使答案变得复杂)来自共享仓库。现在你可以看到他做了什么,因为fetch抓住了(无论如何)默认的一切。

这里是git与clearcase非常不同的地方:你通过让git将它提取到某个可见的地方来“看到他做了什么”。它不会“只是出现”,你必须告诉它“让我看看”。

您可以通过执行以下一项或多项操作来查看它:

  • 要求git(或GUI)显示差异
  • 要求git检查当前工作树中的不同分支(这里存在明显的冲突可能性)
  • 要求git将特定分支中的一个或多个特定文件的内容签出到当前工作树中
  • 要求git将不同的分支签出到不同的(可能是新的)工作树

所有这些都需要了解如何指定特定修订(通过“分支名称”或通过commit-ID或其他)。请记住以下两件重要事项:

  • 当您克隆并获取时,git会创建名称为remotes/origin/masterremotes/origin/bug_b的分支。
  • 当您在repo中本地工作时,git会创建名称为masterbug_a的分支。

因此,要查看已fetch加入remotes/origin/bug_b的更改,请使用:

git log remotes/origin/bug_b

请注意,您不需要拥有自己的名为bug_b的分支,更不用说任何合并或提取或其他任何分支。只需命名远程分支,只需要查看即可。如果您要在bug_b分支上自己完成工作,则只需要自己的分支名称。

这是你不需要了解的更深层次的内容,但你应该偶尔回过头来看:像remotes/origin/bug_b这样的分支名称实际上只是一种象征性的方式来命名其中一个大git SHA1值如ae0af6d748b98716f0f72e428728345b828c4067。当fetch获取所有新文件和树等时,git会做什么,以及所有提交有大毛茸茸ID的提交,并将所有这些提交到您的存储库中;然后更新remotes/x/y标签以指向每个“远程分支”的“提示”。你的回购拥有每个人都做过的一切,如果需要,就在你的指尖。 (有时候结果是“太多”所以有限制你实际拥有多少的方法,但“一切”是默认的,并且是思考它的方式。)(以明确的方式,你有一个每个VOB的完整副本。幸运的是,git比clearcase更节省空间和时间。)

当你执行git pull时,你真的做了两件事:git fetch - 这就是改变 - 然后(通常)改变git merge。合并将“别人做过的工作”和“你做过的工作”结合起来。当您获取Bob在bug_b分支上工作时为bug_a所做的更改时,您不希望这样做。

(或者,您可以告诉git使git pull表示git fetch后跟git rebase。但您也不希望这样。只需坚持使用git fetch。)

现在,对于该快捷方式:如果您git clone原始共享仓库,则必须等待Bob git push将其bug_b更改回共享仓库,然后才能看他们。但是,如果Bob授予您对其私人仓库的读取权限(通过ssh或其他),则可以将Bob的仓库添加为备用“远程”。您可以将此remotes/origin/bug_b命名为remotes/bob/而不是remotes/bob/bug_b,而是引用git remote update bob。您可以使用push获取这些内容。除非你能与Bob协调,否则不要为此烦恼。您{{1}}通常可以使用的单个共享仓库。

答案 1 :(得分:1)

假设您已检出分支A,并且您想要查看分支B中所做的更改。然后,您可以看到B中使用

所做的更改
git log --patch B

将显示B中提交的所有提交,以及每个提交引入的更改的差异。您可以在the Git docs了解有关使用git log的更多信息。

如果您没有在本地仓库中通过远程/中央仓库在B中进行的最新更改,则可以git fetch <remote repo>将这些更改添加到您的本地仓库中,而无需将这些更改合并到{ {1}}。然后,您可以使用

查看这些更改
A

很多Git guis都有视觉差异查看器,您也可以使用它来查看您想要的任何分支。