gitでデフォルトで高速転送をオフにできますか?


263

コミットを表示したくないgit mergeいうよりもgit rebase、使用したいと思う時期を本当に考えることはできません。デフォルトで高速転送をオフにするようにgitを構成する方法はありますか?オプションがあるという事実は、方法があることを意味しているように見えますが、ドキュメントではそれを見つけることができないようです。--ff


3
mergeブランチを早送りするために、リモートからコミットを行っていないブランチでは常に使用します。これを行う最も簡単で安全な方法のようです。私は好奇心旺盛ですが、明らかにユースケースがあります。ブランチの片側にコミットがない場合に、なぜマージコミットを作成したいのですか?
CBベイリー

12
ブランチを使用して、コミットの論理グループを作成します。だから私がマージをするなら、それは基本的に「これらのコミットは一緒に行く」と言う方法です。ほとんどそれを貧しい人のインタラクティブなリベースとスカッシュと考えることができます。:-)
Jason Baker

13
以下のようなモデル以下の場合は特に早送りオフにすると、非常に有用である成功したGitの分岐モデル
steinybot

2
エリックプラトンの回答には、このための受け入れ答えを変更してくださいstackoverflow.com/a/6810687/3408 -私はそれが唯一の愚かである現在のリポジトリ内のマスターブランチのためだったことに気づき、受け入れ答えにステップをしました。
rjmunro 2015年

3
@ jpmc26それぞれ自分に合っていると思います。私はたまたまその記事に同意しません。マージコミットの2つの親を見つけることは難しくなく、変更内容を正確に伝えます。次に、それらの変更を取得して、他のブランチに「リベース」することができます。フラットモデルでは、手動で見つけてチェリーピックする必要があります。分岐を採用することを選択します。確かにツリー全体を見ると複雑ですが、実際には、複数の変更が並行して発生しています。すべてを平坦化すると、実際に起こったことを隠すだけです。
steinybot 2016

回答:


282

はい、あります--no-ff。ブランチごとにマージオプションを設定できます、例えば

git config branch.master.mergeoptions  "--no-ff"

以下を$(REPO)/.git/configファイルに追加します。

[branch "master"]
    mergeoptions = --no-ff

脚注:私の経験について言えば、最終的には早送りをオフに切り替えることがgitの初心者に役立つことがわかりましたが、ワークフローとコンセプトの感覚が沈み始めたら、無意味な「マージされた」大量のロググラフを不鮮明にしたくないはずです。リモートの..blarf 'タイプのコミット。

脚注2、10年後:以下の他の回答はより近代的な構成オプションを提供しますが、空のマージコミットは実際にのみであるため、実際には、この日と年齢のデフォルト(つまり、可能な場合は早送り)を維持する必要があります歴史を推論することをはるかに困難にします。


142
gitの学習は、登山に少し似ています。しかし、小さな崖から始まり、より険しい崖に進む代わりに、gitは何度も何度も同じ山に登ることができます。ライフラインが取り付けられていないことに驚かれるように、毎回異なる高さで落下します。
conny 2010年

12
@トーマス:はい; git pullあるgit fetch+はgit merge
ミシェルティリー2010

9
これは良さそうですが、すべてのブランチに対して設定する代わりに、すべてのブランチに対してグローバルに行う方法はありますか?
bwinton、2011年

33
ドラゴンに注意してください。@Thomasが言ったように、このオプションは危険です...すべてのgitプルはマージコミットを作成します。git pull --ffは、git configのmergeoptions = no-ffをオーバーライドしません。
Dalibor Filus、2011

15
タイピングに飽きたらどうしますgit merge --no-ff (branchname)か?そしてgit pull、いつものように機能したいですか?
Dogweather、2015

341

スレッドにはまだ保留中の質問があるようです:グローバルに(つまり、すべてのブランチに対して)どうやって行うのですか?レコードについては、以下を使用できます。

git config --add merge.ff false

...現在のリポジトリのすべてのブランチに適用するため。オプションなしで実行していないすべてのリポジトリのすべてのブランチに適用するには(ローカル設定がグローバルをオーバーライドする)、次のコマンドを実行します。--global

git config --global --add merge.ff false

ドキュメントから:

merge.ff
デフォルトでは、現在のコミットの子孫であるコミットをマージするときに、gitは追加のマージコミットを作成しません。代わりに、現在のブランチの先端が早送りされます。falseに設定すると、この変数はgitにそのような場合に追加のマージコミットを作成するように指示します(--no-ffコマンドラインからオプションを指定することと同じです)。onlyに設定すると、そのような早送りマージのみが許可されます(--ff-onlyコマンドラインからオプションを指定することと同等)。


18
注:merge.ffはGit 1.7.6で導入されました。古いバージョンでは効果がありません。
Chris Johnsen、2011

2
Git 1.7.6を使用している人にとって、これは最良かつ最も簡単なソリューションです。
ライアンランディ

22
私はこれをエイリアスと一緒に使用していますpuff = "pull --ff --ff-only"
stigi

11
また、(git-scm.com/docs/git-configを参照)オプションpull.ff のみを設定でき、エイリアスと同じように動作します。
jotomo

1
@jotomoさん、ありがとうございます。その機能はGit v2.0.0から利用できます(コミットb814da891e8261b909fc5d9fb07b4e8b13989c2dから)。
Eric Platon、2014

14

答えのスレッドを読む私は次の2つのオプションを使用してしまいました

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

大まかに関連しているだけでも、この設定はプル中のトラブルを回避することがわかりました

git config --global pull.rebase true # set up pull to rebase instead of merge

1
git config --global pull.rebase true#行末で「true」に気づく
zowers

おかげで、私はこれを修正しました@zowers
バスティアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.