すべてのリポジトリでGitプルがデフォルトでリベースを使用するようにするにはどうすればよいですか?


186

ホストのGitリポジトリを設定して、git pullその(ローカル)クローンから実行されるすべて--rebaseがデフォルトで使用されるようにする方法はありますか?Stack Overflowを検索してbranch.autosetuprebase、について学びましたが、クローンごとに個別に構成する必要があります。

私のプロジェクトフローは、機能ブランチに分岐する前pulldevelop分岐するように設定されmergeています。これはpullほとんど常にを使用する--rebaseので、これがデフォルトになり得るかどうかを考えています。


6
どうしてそんなことしたいの?(アップストリームから行われた変更または期待される変更の大きさに基づいて)どのケースがより適切であるかを積極的に考えるようにユーザーに教える方が合理的だと思います」
JonasSchäfer

4
@JonasWielickiはい、同意します。私のチームメンバーの何人かはGitを初めて使用するだけです。初期段階で問題を回避するためにそれを強制する方法があるかどうかを知りたいです(彼らがそれを知るまで)。また、チームはリモートで別のタイムゾーンで作業します。つまり、問題が発生した場合、チームは数時間スタックします。これが可能かどうか知りたいだけです。
仮面の男

1
特に初期設定に関しては、マージに行くのが良いと思います。コードが実際に分岐している場合、リベースはさらに奇妙なことを行います。あなたがプッシュするまで、何度も何度も同じ紛争を解決する必要があります。そのため、チームメンバーが何らかのコードに取り組みたい場合、常にリベースを使用し、完了するまでプッシュしないでください(新参者は自分でブランチするのではなく、これを行う場合があります)、彼らはすでにX回解決した同じ競合に直面します。 。
JonasSchäfer12年

3
@JonasWielickiチームメンバー、作業する新しい機能ごとに新しいブランチを作成します(これはすでに十分に理解されています)。他の開発者が変更をプッシュする準備ができるまでに、「リモート」開発ブランチにコミットしているため、リベースの必要性が生じます。したがって、変更をプッシュする前に、リモートからプルリベースを実行してもらいたいと思います。プロジェクト自体はかなり成熟していて、チームだけが新しいです。:)だから、それは人々の観点からのみ「初期設定」です。このシナリオに対するあなたのアドバイスは何ですか?
仮面の男

5
新しい機能などを徹底的にテストするにはかなりの時間がかかるため、ほとんどの場合(ほとんどすべて)、最初のコメントに返信してリベースするのが正しい選択です。他の開発者からのたくさんのコミット。
仮面の男

回答:


205

デフォルトのプル動作には、3つの異なる構成レベルがあります。最も一般的なものから最も細かいものまで、次のとおりです。

1。 pull.rebase

これをに設定するtrueと、git pull常にと同等になりますgit pull --rebasebranch.<branchname>.rebase明示的にに設定されている場合を除くfalse)。これは、リポジトリごとまたはグローバルに設定することもできます。

2。 branch.autosetuprebase

これをに設定alwaysすると、追跡ブランチが作成されるたびに、以下のような構成エントリが作成されます。より精密な制御のために、これはまたに設定することができneverlocalまたはremote、グローバルリポジトリまたはごとに設定することができます。詳細についてはgit config --help、を参照してください。

3。 branch.<branchname>.rebase

これをに設定trueすると、git pull --no-rebase明示的に使用しない限り、その特定のブランチは常にリベースを介して上流からプルされます。

結論

したがって、リポジトリの将来のすべてのクローンのデフォルト動作を変更することはできませんが、現在のユーザーの(既存および将来の)すべてのリポジトリのデフォルトをを介して変更できますgit config --global pull.rebase true


4
御返答いただき有難うございます。私は、リポジトリを複製する誰もがデフォルトでそれを有効にするように設定できるかどうかを模索していました。上記の設定はに保存されます~/.gitconfig。つまり、ホストリポジトリのクローンを作成する各開発者がコマンドを実行する必要があります。あなたの解決策について文句を言わない。それは良いことです。あなたの意見を正しく理解したことを確認したいだけです。
仮面の男

答えてくれてありがとう。確かに、これは可能な限り近いように見えます。
マスクされた男

139

いかがですか

git config --global pull.rebase true

これにより、gitは常にリベースでプルするようになります。


3
おかげで、これは既存の追跡ブランチに最適です。
Fls'Zen 2014年

1
削除してください--bool、それが不要である、
diralik

38

答えはいいえだ。

リモートリポジトリを設定して、それを複製するすべてのユーザーがデフォルトの動作をgit pull変更できるようにする方法はありません。

ただし、マージコミットをプッシュしていないことを確認するサーバー側フックを設定することもできます(おそらくこのようなものです)。

興味のある設定オプションもいくつかあります。リモートリポジトリからクローンを作成する開発者はすべて、手動で設定する必要があります。

1.オプション branch.<name>.rebase

次のように、ローカルブランチを常に使用する--rebaseように構成<name>して、ブランチ名に置き換えることができます。

git config branch.<name>.rebase true

でこれを実行するmasterと、masterセクション.git/configは次のようになります。

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2.オプション branch.autosetuprebase

すべてのGitブランチに対して以前のconfigコマンドを実行するのは面倒な場合があるため、Gitを構成して新しいブランチごとに自動的にセットアップすることができます。

git config branch.autosetuprebase always

(指定することもできneverremoteおよびlocal、参照のman git-config詳細については。)

--globalオプションを指定しない場合、構成はに保存され.git/config、現在のリポジトリのみが影響を受けます。を使用する--globalと、設定がに保存され~/.gitconfig、設定されていないすべてのリポジトリが影響を受けます。

このオプションは、既存のブランチには影響しません。

3.オプション pull.rebase

git config --bool pull.rebase true

--globalオプションを指定することもできます。)

このオプションがtrueの場合、がに設定されていない限り、running git pullはと同等です。git pull --rebasebranch.<name>.rebasefalse


3

これにより、 特定のブランチでを--rebase発行するときのオプションがデフォルトになりますgit pull

@Flimm、私はtrueあなたの最初のオプションを機能させるために追加する必要がありました。

したがって、正しい構文は次のとおりです。

git config branch.<branch>.rebase true

このコマンドをdevelopブランチで実行するには:

git config branch.develop.rebase true

これで、developセクションは.git/config次のようになります。

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true

おかげで、私は自分の回答を編集しました。将来的には、自由に回答を編集してください。
Flimm

2
Donwvoter、あなたが誰であれ、あなたの理由を説明してください。コメントなしの反対投票は完全に恣意的で建設的ではないようです。
大師

1

現在、リポジトリのデフォルトポリシーを設定する方法はありません。

自分でそれを使いたい場合で、少なくともgit 1.7.9を使用している場合はpull.rebase、次のようにグローバルに設定できます。

git config --global pull.rebase true

ただし、各マシンで実行する必要があります。1つのオプションは、そのオプションでデフォルトのユーザーホームテンプレート/スケルトンを構成することです。ただし、ユーザーはそのオプションを変更する場合があります。

マージが必要ない場合は、マージを伴うプッシュを拒否するサーバー側フックを定義できます。

参考までに、彼はpull.rebaseのソースドキュメントです。

trueの場合、「git pull」が実行されたときにデフォルトのリモートからデフォルトのブランチをマージするのではなく、フェッチされたブランチの上にブランチをリベースします。これをブランチごとに設定する方法については、「branch..rebase」を参照してください。

マージするときは、-rebase-mergesオプションをgit rebaseに渡して、ローカルマージコミットがリベースに含まれるようにします(詳細はgit-rebase を参照)。

保存する場合は、--preserve-mergesもgit rebaseに渡して、ローカルでコミットされたマージコミットがgit pullを実行してもフラット化されないようにします。

値がインタラクティブの場合、リベースはインタラクティブモードで実行されます。

注:これは危険な操作である可能性があります。意味を理解しない限り、使用しないでください(詳細については、git-rebaseを参照してください)。

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