23

リベースを多用するワークフローの一環として、マスターブランチでマージを使用したいと考えています。特に、トピックブランチが最新のマスターコミットにリベースされた場合にのみマージしたいので、マージを早送りします。私はそれを使用することによってそれを達成することができます:

git merge --ff-only

さらに、トピックブランチと空のコミットの統合を記録したいので、その動作を強制する--no-ffを使用したいと思います。

git merge --no-ff

しかし、私が本当に望んでいるのは、両方の組み合わせです。些細な場合にのみマージしますが、とにかく記録させてください。Gitはそれを考えています

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

必要なチェックは、mergeコマンドを実行する前に個別のチェックとして行うことができます。これを単純なシェル関数にパッケージ化できます。

例えば

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}はreflogポインタです。

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 に答える