autosetuprebase与autosetupmerge


71

我刚敲完我的全局.gitconfig文件,然后发现我已经设法结束了:

[branch]
  autosetupmerge = always
  autosetuprebase = always

这似乎有点不合常理,但是经过阅读后,我仍然不知道我是否同时需要这两个知识,或者是否足以去除autosetupmerge并保留它autosetuprebase。我正在工作的大多数项目都有一个顺畅的顺流->顺流,因此在处理分支时通常首选重新定级。


请更新接受的答案
vedant

Answers:


112

在这里违反直觉的是这些首选项的命名。它们看起来确实像是在指代相同的功能,但实际上它们不是:

  • autosetupmerge控制是否git branchgit checkout -b暗含该--track选项,即通过设置always
    • git checkout branchname,如果branchname存在于远程但不在本地,则会创建branchname跟踪其远程对应对象
    • git checkout -b newbranchnewbranch在发出此命令之前创建一个新的分支跟踪您已签出的任何分支
  • autosetuprebase控制是否应将新分支设置为要重新建立基础git pull,即您的设置always将导致建立分支,从而git pull始终执行重新基础而不是合并。(请注意,当您更改此选项时,现有分支保留其配置。)

因此,拥有autosetupmerge = always和都是很有意义的autosetuprebase = always。实际上,这也是我所拥有的。


3
非常好的答案。简而言之,要避免两者并重pull。真。如果您从未使用过git,则会了解git的内部工作原理并得到更好的工作流程pull。无论是git remote update; git rebase/merge upstream/mastergit fetch; git rebase upstream/master...混帐拉最终会做你是不是期待着什么。然后您将对内部运作方式了解不足。最好今天多打字然后学习,而不是稍后才知道不知道如何解决:)
gcb 2014年

2
我给人的印象是,这两个(甚至是变基)都可以很好地访问少数项目的有限数量的远程存储库,所有这些项目都要求使用相同的内部工作流程。但是,我想您的建议对于计划通过各种不同的工作流/策略致力于许多项目的人来说将是非常明智的。
laszlok 2014年

2
要更改现有分支机构的此设置,请使用:git config branch.<branchname>.rebase true
verboze

branch.autoSetupMerge=always对于新分支似乎没有意义。意思是,git checkout -b b1将上游设置为master(通常)本地存储库的分支。重点是什么?
x-yuri

@ x-yuri我的工作流通常涉及停留在组织的“主线开发”分支上(在我的本地仓库中,该分支跟踪相应的远程对象),而我创建的任何分支最终都将是该分支(可选,然后根据顶部重新创建)合并进去了 因此,对我来说,这实际上一直是我想要的,并且非常方便。对于其他工作流程,可能不是-这就是为什么它是首选项。
laszlok

32

由于这是第一命中,因此,如果您使用google搜索“ autosetuprebase”,请参考以下建议:

git config --global branch.autosetuprebase always

来源https://mislav.net/2010/07/git-tips/


7
而且由于改基础会导致您失去生活的意愿,这就是您不应该这样做的原因
Elias Van Ootegem 2014年

11
@EliasVanOotegem在您的链接中看不到任何好的论点。
帕维尔·西默达(PavelŠimerda)'16

2
我五年前写了这个答案。我不再使用了。我今天喜欢合并。但是,我并没有与当前的git工作流程结婚。也许将来我会有所不同。如今,“合并与重新设置”主题对我而言并不重要。我喜欢我最喜欢的IDE的“显示历史记录供选择”。我更关心这一点。如果使用“显示选择的历史记录”查看更改,则根本没有关系,如果使用了合并基准。结果很重要,而不是通往成功的道路。
guettli '17

我的个人观点:生活中的某些事情真的很重要:寻找伴侣,养家,有一份很酷的工作,有朋友,保持好奇心,保持健康。我不再参加“ rebase vs merge”讨论。我使用我的团队的建议。这为重要的决策留出了更多的精力。
guettli '20

26

可能值得一提的是,autosetupmerge = always(始终在您的配置中)和autosetupmerge = true(默认值)之间是有区别的。

true将只为远程分支设置合并。总会包括本地分支机构。

您可能想要真实。


24

当我在寻找“ autosetuprebase”的其他可能选项时,花了一些时间才能找到它们,它们是:

branch.autosetuprebase

当使用git branchgit checkout跟踪另一个分支创建新分支时,此变量告诉Git设置拉动以重新设置基数,而不是合并(请参阅“ branch..rebase”)。

  • 如果为never,则rebase永远不会自动设置为true。
  • 如果为local,则将其他本地分支的跟踪分支的rebase设置为true。
  • 如果为remote,则将远程跟踪分支的跟踪分支的rebase设置为true。
  • 如果为always,则所有跟踪分支的rebase都将设置为true。

资料来源:http : //git-scm.com/docs/git-config.html


-15

您可能不需要设置autosetupmerge-默认值为true。


3
正如RyanK在下面说的那样,“始终”和“真实”会导致不同的行为。
laszlok 2014年

见从下面@laszlok答案两者的一个很好的解释autosetupmergeautosetuprebase。见branch.autosetupmergebranch.autosetupconfig在获得更多信息git的帮助:kernel.org/pub/software/scm/git/docs/git-config.html
Olly 2014年

1
对我来说,autosetupmerge = always的主要实用程序是它建立使用git checkout -b创建的新分支的上游关系。我不知道为什么这种行为不是默认行为,但是绝对避免将其设置为“ always”的混乱。
mgiuca
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.