1

私はgitの重要なポイントを見逃していると思います。開発プロセスに PhpStorm IDE を使用し、VCS として GIT を使用しています。開発者ブランチの 1 つから変更をプルするたびに、他の開発者のコ​​ミットのリストを取得しますが、これはまったく正常なことです。しかし、変更をプッシュするときは、ローカルで行われたコミットだけでなく、プルで取得されたコミットもプッシュします。

しかし、なぜこれが起こっているのですか?他の開発者のコ​​ミットが私のプッシュにあるのはなぜですか? GIT がそれらの開発者のコ​​ミットをリモート ブランチに保存している限り、それらは既にプッシュされています。何か不足していますか?

GIT コマンド (IDE 履歴による):

git pull --no-stat -v --progress origin trunk

git push origin trunk:trunk

GIT バージョン: 1.7.4.4、OS: Mac OS X 10.7

4

2 に答える 2

3

Vonc が言ったように、 を実行するgit pull origin trunkと、git は最初に fetch( git fetch origin trunk) を実行します。これは、リモートの「origin」からブランチ「trunk」を取得し、FETCH_HEAD に格納します。

これは潜在的に予期しない動作であり、「4 引数」形式のandを使用しない十分な理由であることに注意してください。git-pullgit-fetch

とにかく、フェッチを実行した後、 git runs git merge FETCH_HEAD. これにより、新しくフェッチされたリモート ブランチが取得され、ローカル ブランチにマージされます。ローカル ブランチと、'origin' からの 'trunk' ブランチを取得し、それらをマージしました。

これを視覚化するのに問題がある場合は、実行するgitkgit log --graph --oneline --decorate、履歴をグラフィカルに表示してみてください。2 行の履歴 (自分の履歴とリモートの履歴) がマージされていることがわかるはずです。git log、なし--graph、または--first-parentなどは、現在のブランチから到達可能なすべてのコミットを表示しますが、実際にどのブランチにあるかを区別しません。

当然のことながら、 を実行するgit pushと、git はこのマージされた履歴を受け取り、それをプッシュします。

おそらくgit fetchorgit fetch originではなくor を実行するつもりgit pull origin trunkでした。これにより、更新されたブランチが「origin」から取得され、リモート追跡ブランチ (「origin/trunk」など) に保存されます。次に、これを調べることができますgit log origin/trunk。その後、'origin/trunk' をローカル ブランチにマージする場合は、git merge origin/trunk.

于 2012-07-09T23:16:45.017 に答える
1

本当に変更をプルしている場合 ( git pull)、現在のブランチでそれらをフェッチしてマージします。

プッシュ時に他のすべての開発者のコ​​ミットが表示される場合は、最初にリベースを実行するようにプルが構成されている可能性があります ( git pull --rebase)。
構成設定branch.autosetuprebaseまたはを確認してくださいbranch.<name>.rebase

于 2012-07-02T07:19:18.467 に答える