【问题标题】:Using git pull to track a remote branch without merging使用 git pull 跟踪远程分支而不合并
【发布时间】:2011-03-04 15:15:16
【问题描述】:

我正在使用 git 来跟踪某些人更改并与其他人共享“只读”的内容。 “读者”可能不时需要做出改变,但大多数情况下他们不会。

如果需要,我想允许 git“作者”重新设置推送的分支**,并确保“读者”永远不会意外获得合并。这通常很容易。

git pull origin +master

有一种情况似乎会引起问题。如果读者进行本地更改,上述命令将合并。如果读者没有进行本地更改,我希望 pull 是全自动的,而如果他们进行了本地更改,它应该停止并要求输入。我想跟踪任何上游更改,同时注意合并下游更改。

在某种程度上,我真的不想拉。我想准确地跟踪 master 分支。


**(我知道这不是最佳实践,但在我们的案例中似乎是必要的:我们有一个包含大部分工作的主分支和一些针对特定客户的主题分支,需要隔离的微小更改。经常变基以使主题保持最新似乎是最容易的。)

【问题讨论】:

  • 用户会如何处理他们的修改?将它们提交到本地分支?
  • 使用 Git 2.0,您可以尝试(很快)git config push.ff only。见my answer below

标签: git git-pull


【解决方案1】:

您正在寻找命令git-fetch

【讨论】:

  • 恐怕不行。 git-fetch 更新分支 remotes/origin/master 的本地副本,但它不更新 master 分支本身。我希望“读者”能够获得上游所做更改的副本。
【解决方案2】:

您可能还会发现git pull --rebase 很有用。

更新: --rebase 可以通过在各个分支上设置 branch.<name>.rebase = true 来成为默认的 pull 行为。默认情况下,设置branch.autosetuprebase = true 将在新分支上设置它,但需要手动更新现有分支。或者,您可以通过全局设置 pull.rebase = true 始终默认为 --rebase

【讨论】:

  • 正是我想要的!
【解决方案3】:

怎么样:

  git pull --ff-only origin master

我经常使用它。不幸的是,正如richard-hansen@ 在下面指出的那样,这不能用作别名:

[alias]
pull = pull --ff-only

【讨论】:

  • 不幸的是,别名不起作用。来自git help config:“为避免在使用脚本时出现混淆和麻烦,隐藏现有 git 命令的别名将被忽略。”
  • @RichardHansen 您是否找到了解决方案,或者这只是无法配置?
  • @AndyHayden:从 Git 2.0 开始,您可以使用 git config --global pull.ff only 使 git pullgit pull --ff-only 一样工作。
  • @RichardHansen 不错!值得注意的是,如果您使用的是 rebase=True,则需要删除该条目(因为它具有优先权)!
  • 那个 2.0 配置很有趣,但对我没有帮助。我想决定何时需要--ff-only,所以我使用 bash 别名而不是 git 别名。
【解决方案4】:

Git 2.0(2014 年第二季度)将添加 commit b814da8 一个配置 push.ff

pull.ff::

默认情况下,Git 在合并作为当前提交的后代的提交时不会创建额外的合并提交。相反,当前分支的尖端是快进的。

  • 当设置为 false 时,此变量告诉 Git 在这种情况下创建一个额外的合并提交(相当于从命令行提供 --no-ff 选项)。
  • 设置为 only 时,仅允许此类快进合并(相当于从命令行提供 --ff-only 选项)。

【讨论】:

    【解决方案5】:

    我认为您想要一个使用两个分支的工作流程。合并的本地分支(主)和远程“只读”跟踪分支(远程)。

    在主分支上使用双遥控器可以让您继续工作,并与远程项目保持同步。您的本地更改和合并的远程更改可以推送到本地 git 服务器。

     git push localserver master
    

    可以在您的远程跟踪分支上创建和完善上游补丁,并提交给项目。

    “只读”远程的单独跟踪分支可让您为远程项目的上游准备补丁和提交。

    # Master branch is merge of local changes, and remote changes
    git checkout master
    git pull -m origin master
    # Set up a local tracking branch for the 'read-only' remote.
    git checkout -b remote remote master
    # Start reviewing changes between the two branches.
    git diff --name-status ..master
    

    当您想要上传补丁时,可以使用 master..remote 的差异来定义您的只读远程分支的补丁。

    git diff master..remote -- files >patch
    git checkout remote
    patch -p1 <patch
    git commit -m "Your patch"
    git format-patch -1
    

    将格式化的补丁文件发送到远程项目。如果您需要为远程项目修改和变基,您可以在远程跟踪分支上执行该工作,直到它获得批准。

    (设置 git dual remote 涉及编辑 .git/config,在别处有说明)

    【讨论】:

      【解决方案6】:

      由于您不希望阅读器获取手动合并,您可以编写一个挂钩来检查出现的内容并提示用户:

      http://git-scm.com/docs/githooks

      我仍然建议在本地获取并让读者管理他们的合并或变基。这是解决您的问题的更简单的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-24
        • 2011-02-05
        • 1970-01-01
        • 2019-09-30
        • 2018-02-12
        • 2014-08-22
        • 2014-02-04
        • 1970-01-01
        相关资源
        最近更新 更多