使用git pull跟踪远程分支而不进行合并

4
我正在使用git来跟踪一些人更改的内容,并与其他人共享“只读”内容。 “读者”可能需要不时进行更改,但大多数情况下不需要。
我希望允许git“作者”在必要时重新设置已推送的分支,并确保“读者”永远不会意外地合并。这通常很容易实现。
git pull origin +master

有一种情况似乎会导致问题。如果读者进行了本地更改,上述命令将进行合并。如果读者没有进行本地更改,我希望拉取是完全自动化的,而如果他们进行了本地更改,则应停止并要求输入。我想追踪任何上游更改,同时小心合并下游更改。
某种程度上,我并不想拉取。我想准确地跟踪主分支。
**(我知道这不是最佳实践,但在我们的情况下似乎是必要的:我们有一个包含大部分工作的主分支和一些专门为特定客户提供的主题分支,需要隔离一些较小的更改。频繁地变基似乎是最简单的方法来保持主题分支的最新状态。)

用户会如何处理他们的修改?将它们提交到本地分支吗? - Seamus Connor
使用Git 2.0,您可以尝试(很快)git config push.ff only。请参见下面的答案 - VonC
6个回答

7
你正在寻找命令 git-fetch

很抱歉,git-fetch只会更新远程分支remotes/origin/master的本地副本,但不会更新master分支本身。我希望“读者”能够获取上游所做更改的副本。 - J Barlow

6

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

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


正是我正在寻找的! - aandis

2
如何呢:
  git pull --ff-only origin master

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

[alias]
pull = pull --ff-only

3
很遗憾,该别名无法使用。根据git help config所述:“为了避免脚本使用时造成混淆和问题,隐藏现有的git命令的别名将被忽略。” - Richard Hansen
@RichardHansen你找到了解决办法吗,还是说这个无法配置? - Andy Hayden
1
从Git 2.0开始,可以使用“git config --global pull.ff only”来使“git pull”的行为像“git pull --ff-only”。 - Richard Hansen
@RichardHansen 不错!值得注意的是,如果你使用了rebase=True,那么你需要删除该条目(因为它具有优先权)! - Andy Hayden
那个2.0配置很有趣,但对我没有帮助。我想自己决定何时使用“--ff-only”,所以我使用bash别名而不是git别名。 - cdunn2001

0
我觉得你想要一个使用两个分支的工作流程。一个合并了本地分支(主分支)和一个远程的“只读”跟踪分支(远程分支)。
在主分支上使用双重远程仓库可以让你继续工作,并保持与远程项目的最新状态。你的本地修改和合并的远程修改可以推送到你的本地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双重远程涉及编辑.git/config,并在其他地方进行解释)


0

Git 2.0(2014年第二季度)将在提交b814da8中添加一个配置项 push.ff

pull.ff::

默认情况下,当合并一个当前提交的后代提交时,Git 不会创建额外的合并提交。相反,当前分支的尖端将被快进。当设置为 false 时,此变量告诉 Git 在这种情况下创建额外的合并提交(相当于从命令行中使用 --no-ff 选项)。当设置为 only 时,只允许这样的快进合并(相当于从命令行中使用 --ff-only 选项)。

0

既然你不想让读者手动合并,那么你可以编写一个钩子来检查下传内容并提示用户:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接