23

作为我们重基化工作流程的一部分,我希望在主分支上使用合并。特别是,我只想在主题分支重新基于最近的主提交时才合并,从而使任何合并成为快进合并。我可以通过使用来实现:

git merge --ff-only

此外,我想记录主题分支与空提交的集成,这就是为什么我想使用 --no-ff 来强制这种行为:

git merge --no-ff

不过,我真正想要的是两者的结合:仅在微不足道时才合并,但无论如何让我记录一下。吉特认为

fatal: You cannot combine --no-ff with --ff-only.

这在某些人看来是不言而喻的。

git merge --edit --no-ff topicbranch

也没有达到我想要的行为。那么,如果有问题的主题分支重新基于最新的主提交,我如何与 --no-ff 选项合并?


更新:似乎查尔斯·贝利的回答可以解决问题。如果你想把它变成一个 git 别名,你可以在这里发出这个:

git config --global alias.integrate '!test "$(git merge-base HEAD "$1")" = "$(git rev-parse HEAD)" && git merge --no-ff --edit $1 || echo >&2 "Not up-to-date; refusing to merge, rebase first!"'

有点拗口但有效。请注意使用选项编辑提交消息的力量--edit

4

3 回答 3

13

您不想要--ff-only,因为您确实想要进行--ff-only会抑制的合并提交。

您可以在运行合并命令之前将所需的检查作为单独的检查进行。您可以将其打包成一个简单的 shell 函数。

例如

merge_if_ahead () {
  if test "$(git merge-base HEAD "$1")" = "$(git rev-parse HEAD)"; then
      git merge --no-ff "$1"
  else
      echo >&2 "Not up to date; refusing to merge"
      return 1
  fi
}
于 2013-03-27T07:02:52.367 回答
2

我创建了一个适用于我的简单测试的别名

git config --global alias.ffmerge '!sh -c "git merge --ff-only $1 && git reset --hard HEAD@{1} && git merge --no-ff $1" -'

它由 3 个命令组成,一个接一个,一旦第一个失败,它们就会失败。逐一解释:

git merge --ff-only $1

如果合并不能作为快进合并继续,将失败。($1 是作为参数传入的分支名称)

git reset --hard HEAD@{1}

如果第一个命令成功,则意味着我们可以进行快进合并,但是当我们想要进行合并提交时,我们将回到我们(成功)合并之前的 HEAD 状态。HEAD@{1} 是一个引用日志指针。

git merge --no-ff $1

现在我们将通过合并提交进行真正的合并,即使合并可以作为快进进行。

一个简单的调用git ffmerge将为我们完成整个事情,唯一可能失败的步骤是第一步,这将使我们像以前一样处于未更改的工作副本中。

与往常一样,git reset --hard工作副本应该是干净的。

于 2013-03-26T10:37:14.753 回答
2
git config alias.mff '!mff() { git merge --ff-only "$1" && git reset --hard HEAD@{1} && git merge --no-ff "$1"; }; mff'

从那时起

git mff other-branch
于 2017-03-10T12:04:36.533 回答