【问题标题】:How to merge/pull from remote repository如何从远程存储库合并/拉取
【发布时间】:2011-03-20 16:32:11
【问题描述】:

我正在尝试将一些子目录从远程 git 存储库合并到我的存储库。远程和本地存储库都包括整个内核存储库,我只对无线相关文件感兴趣。 我尝试按照"How to use the subtree merge strategy" 下的说明进行操作,但由于大多数文件都存在于本地存储库和远程存储库中 git read-tree --prefix=dir-B/ -u Bproject/master 命令失败。我无法在同一命令行中使用-m 选项和--prefix

这种合并实际上应该根据远程存储库中的文件更新(合并/拉取)所有相关的无线目录/文件,其中应该通过首选远程文件来解决冲突。

为了让我的问题更笼统——假设您有存储库 A 和 B。两者都有文件夹 wireless_dir:A/wireless_dir、B/wireless_dir。我正在开发存储库 B,并希望从 A/wireless_dir 更新其在 B/wireless_dir 中的所有文件,其中发生合并冲突时首选 A/wireless_dir 中的更改。

【问题讨论】:

  • 这是Linux内核吗?它不是为这样的组件使用子模块 - 这意味着它们已经是单独的存储库吗?

标签: git merge subtree


【解决方案1】:

根据 Jeformi 的评论,您似乎已经遇到了文件夹是一个单独的存储库的情况,如果是这种情况,您所要做的就是 git pull

但是,如果您要查找的提交中包含您不想要的其他文件夹中的文件,Git 允许您以这里提到的方式“unsqaush”提交:redhatmagazine

执行此操作的步骤(根据您的情况稍微概括一下)是:

1) 记下您的 HEAD 当前所在的提交,我们称它为 <OLD_HEAD> 以取乐。这可以从日志中获取,并使用以下命令查看最近提交的 sha1:

git log

2) 将 repo A 中的更改拉入您的分支(这将包括您可能不想要的任何内容):

git pull <repo A> <branch_name>

3) 现在是使用&lt;OLD_HEAD&gt; 的时候了(以一种非粗俗的方式)...这是通过重置来完成的

git reset --mixed <OLD_HEAD>

4) 完成所有操作后,您的 HEAD 又回到了 &lt;OLD_HEAD&gt;,您的索引也是如此,但是在您的工作目录中,您现在拥有了您一直在寻找的来自 repo A 的更改,如以及 wireless_dir 文件夹之外的文件的可能性。以交互方式将工作目录中的这些文件合并到您的索引中(如果您想要的话,仅在 wireless_dir 中的文件上):

git add --patch <filename>

5) 最后:

git commit -m “Selectively merged my files”

注意:如果您不想搞砸您的分支,请在尝试上述方法之前创建一个新分支。

【讨论】:

  • @Karl 仍然没有足够的代表来评论其他答案,但你描述的是我已经在明确的步骤中回答的内容,除了你不必手动复制树外的文件夹。
  • Argh,cmets 中没有空格的换行符...@Karl 再次;)这是关于依赖关系的一个好点,但是做一个樱桃选择并不能保证引入依赖关系,特别是如果提交组织得不好。此外,由于提问者询问是否拉入特定的 wireless_dir 文件夹而不拉入任何其他内容,那么我的猜测是他在该 wireless_dir 文件夹之外进行了更改,当从 wireless_dir 中提取更改时他不想被修改,用cherry-pick 抓取的提交可以合并到他的更改中。
【解决方案2】:

最简单的方法是合并整个分支,将该文件夹复制到 git 树之外,撤消或中止合并,然后将文件夹复制回来。

但是,如果任何更改在该文件夹之外具有依赖关系,您就会遇到问题。您可能希望cherry-pick 涉及到该文件夹​​(来自git log subdir)的所有内容的全部提交以引入依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2014-10-02
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多