私は今朝目を覚まし、私の開発チームの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がブランチを自分自身にマージするのですか?または、むしろ、この命名法がコミットメッセージとして使用されているのはなぜですか?
このシナリオは珍しいことではありません。
ここで重要なのは、マージされるブランチが異なるということです。これは、リモートリポジトリの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
所有者は開発にコミットせず、プッシュせずに実行したgit pull
と、リモートリポジトリにあった開発からの新しいコミットでフェッチ/マージされます。
次のように、プルする前にこのタイプのマージスタッシュを回避したい場合:
git stash
git pull
git stash pop
同じ種類のメッセージを受け取りました。 Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into develop
そして、まだ何も壊れていませんlol ...慌てないでください。これは、リモート開発ブランチをローカル開発ブランチにマージするだけです。競合が発生しない限り、あなたは行ってもいいです:)