web-dev-qa-db-ja.com

なぜgitはブランチをそれ自体にマージするのですか?

私は今朝目を覚まし、私の開発チームの1つのBitBucket上のプライベートリポジトリのコミット履歴を調べました。これを見た:

匿名コミットfcde879 MERGE

https://bitbucket.org/abc/xyz のブランチ 'develop'を開発にマージします

これは、ええと、やや珍しいです。私の推測では、これはgitが適切に構成されていない新しいマシンからプッシュされたと思います。それでも、なぜこれが行われているのかはわかりませんでした。 BitBucketでは、2つの別々のハッシュがコミットの親として表示されますが、他のコミットの「未加工のコミットを表示」オプションはありません。

そのブランチをチェックアウトし、プルして、ログを手動で確認しました。

sidious@DS-1:/path/to/repo$ git log -1 --format=raw
tree 2931d14f48e61eaf0bbe0660af5b5dd76c07f063
parent 6bb38dee681df7620ffa42b6790641a7873166f2
parent f59c82e19e3e79310a53e273bab78139c49ff063
author root <root@somemachine> 1437069530 +0000
committer root <root@somemachine> 1437069530 +0000

Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop

私の知る限りでは、6bb親は開発ブランチにあり、f59親は別のブランチに属しているようです。何が起こっているのかを言うのはちょっと難しいです。

私は検索しましたが、答えを見つけることができませんでした。Grindに戻る必要があるため、ここにクエリを配置します。なぜgitがブランチを自分自身にマージするのですか?または、むしろ、この命名法がコミットメッセージとして使用されているのはなぜですか?

34
Jonathan Voss

このシナリオは珍しいことではありません。

ここで重要なのは、マージされるブランチが異なるということです。これは、リモートリポジトリのdevelopブランチが、開発者のローカル(動作中)developブランチにマージされることです。

開発者のローカルリポジトリには、2つの異なるブランチがあります。

  • develop =彼/彼女が現在取り組んでいるブランチ。新しいコミットはここに行きます。
  • Origin/develop =これは基本的に、現在のリポジトリがリモートサーバー上のdevelopブランチの状態について保持しているスナップショットです。 fetchまたはpullを実行するとリモートの変更で更新され、Pushが成功するとローカルの変更で更新されます。

ここで、git pullを実行すると、2つのことが起こります。これは、git pullが本質的に他の2つのgit操作のエイリアスであるためです:fetchおよびmerge

  • fetch-リモートリポジトリからローカルのOrigin/developブランチにすべての新しいコミット(存在する場合)をもたらします。
  • merge-新しいコミットを受け取り、ローカルの作業中のdevelop branchに適用します。これは、次の2つの方法のいずれかで発生する可能性があります。
    • ローカルの作業ブランチに分岐履歴が含まれていない場合(リモートが認識しない新しいコミット)、developブランチポインターを先に進めて、Origin/developの最新のコミットを指すようにします。これは早送りマージと呼ばれます。
    • 開発者がリモートリポジトリに存在せず、そのためOrigin/developブランチにもない独自の新しいコミットがある場合、通常のマージが行われます。つまり、両方のブランチからの変更を含む新しいコミットが存在します。デフォルトでは、gitは次のようなメッセージをそのようなコミットに割り当てます:Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop

したがって、シナリオはかなり一般的なものです。

さて、これが頻繁に起こり、今話しているようなコミットを含む非常に複雑なコミット履歴グラフを表示したくない場合は、代わりにrebaseを使用して を調べてみてくださいマージ

これは2つの方法で実行できます(リモートサーバーから変更を取得する場合)。

  • git fetch; git rebase
  • git pull --rebase
66

所有者は開発にコミットせず、プッシュせずに実行したgit pullと、リモートリポジトリにあった開発からの新しいコミットでフェッチ/マージされます。

11
mipadi

次のように、プルする前にこのタイプのマージスタッシュを回避したい場合:

git stash
git pull
git stash pop
2
Dave DeCarlo

同じ種類のメッセージを受け取りました。 Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into developそして、まだ何も壊れていませんlol ...慌てないでください。これは、リモート開発ブランチをローカル開発ブランチにマージするだけです。競合が発生しない限り、あなたは行ってもいいです:)