30

私は誰かと共同でプロジェクトに取り組んでいるので、gitを使用することにしました。残念ながら、インターネットのない場所でコーディングすることが多いため、次のようになります。

origin/master: A---B---C
                        \
mylocalmaster:           D---E---F
                        \
hismaster:               G---H---I

さて、彼がコミットをプッシュしてこれを取得したとしましょう:

origin/master: A---B---C---G---H---I
                        \
master (local):          D---E---F

私がやりたいのは、ローカルリポジトリとオンラインリポジトリの両方でこれを取得するためにコミットをプッシュすることです。

A---B---C---D---E---F---G---H---I

やるとうまくいくようですが、やるとgit pushトラブルが発生します。私がやろうとしているのは、彼のコミットを私のローカルリポジトリに入れることだけですが、最終的には、メッセージのように言っているマージコミットになります。git fetchgit mergeMerge remote-tracking branch 'origin/master'

コミットに競合するコードがないため、この無意味なコミットはしたくありません。私たちは完全に異なるファイルに取り組んでいるので、このコミットをする理由はありません。gitがこのマージコミットを作成しないようにするにはどうすればよいですか?

4

2 に答える 2

31

mergeの代わりにrebaseを使用すると、マージ コミットの作成を省略できます。

@Dougalが言ったように、そうすると、後でgit fetch実行git rebaseして、変更のベースを fetched に変更できますHEAD

通常、リモート リポジトリからプルすることにより、これらの不要なマージ コミットを作成します。その場合、--rebaseオプションを追加できます:

git pull --rebase

または、適切なオプションを Git 構成ファイルに (ローカルで) 追加します。

git config branch.<branch-name-here>.rebase true

またはすべての新しいリポジトリとブランチの場合:

git config branch.autosetuprebase always --global

ただし、リベースにより、よりクリーンでより直線的な履歴が作成されます。両方のブランチに大規模な変更がある場合は、マージ コミットを作成することをお勧めします(そうするために使用git mergeします)。

于 2012-04-14T22:11:25.257 に答える
9

git rebase(after a ) を使用git fetchして、コミットを以前のマスターに対してではなく、彼に対して適用するようにします。つまりABCGHIDEF、あなたの例に行きます。( を実行ABCDEFGHIせずに行うことはできません。は既に含まれており、それをオーバーライドする必要があるためです。push -f)ABCGHIorigin/master

于 2012-04-14T22:00:43.913 に答える