[解決済み] なぜ「リモート追跡ブランチ 'origin/develop' を develop にマージする」のでしょうか?
質問
私の組織では、次のようなメッセージでコミットしているのは私一人です。
リモートトラッキングブランチ 'origin/develop' を develop にマージする
何をしたらそうなるのかわからないが、やめたい。
このコミットを生成するために私はどのようなコマンドを発行しているのでしょうか。また、このコミットを生成しないために私が使用すべき適切なコマンドは何でしょうか。
どのように解決するのですか?
git pull
がコミットを作成していると思われます。 もしローカルでコミットをしてから
git pull
他の人がリポジトリにコミットをプッシュした後、Git は他の開発者のコミットをダウンロードし、それをあなたのローカルブランチにマージします。
今後、このようなマージコミットを回避する方法
を使用することができます。
git pull --rebase
を使えば、今後このようなことが起こらないようにできますが、リベースには危険が伴いますし、また
を避けることをお勧めします。
pull
まったくもって
.
その代わり、この使用パターンに従うことをお勧めします。
# download the latest commits
git remote update -p
# update the local branch
git merge --ff-only @{u}
# if the above fails with a complaint that the local branch has
# diverged:
git rebase -p @{u}
説明
-
git remote update -p
は、リモートリポジトリのすべてのコミットをダウンロードし、リモート追跡ブランチを更新します (例,origin/master
). 作業ディレクトリやインデックス、ローカルブランチには一切手をつけません。は
-p
引数は、削除された上流ブランチを削除します。 したがって、もしfoo
ブランチが削除されるのはorigin
レポジトリを使用します。git remote update -p
は自動的にorigin/foo
を参照してください。 -
git merge --ff-only @{u}
は、Git に上流ブランチをマージするよう指示します (@{u}
ただし、ローカルブランチを上流ブランチに "早送りできる場合のみです (言い換えると、分岐していない場合です)。 -
git rebase -p @{u}
は、まだプッシュしていないコミットを上流ブランチの先頭に移動させることで、避けようとしていたマージコミットを作成する必要がなくなります。 これにより、開発履歴の線形性が向上し、レビューがしやすくなります。は
-p
オプションは、Git にマージを保持するよう指示します。 これは、Git がリベースされるコミットを線形化するのを防ぎます。 これは、たとえば機能ブランチをmaster
. がなければ-p
を実行すると、feature ブランチのすべてのコミットがmaster
によって行われる線形化の一部としてgit rebase
. これでは、開発履歴の確認が容易になるどころか、難しくなってしまいます。注意事項 :
git rebase
は期待通りの動作をしないことがあるので、押す前に結果を確認してください。 例えばgit log --graph --oneline --decorate --date-order --color --boundary @{u}..
私は、この方法の方が
git pull --rebase
は、以下の理由からです。
- を可能にします。 受信した上流コミットを見る 履歴を修正する前に、その履歴を取り込むことができます。
-
を渡すことができるようになります。
-p
(--preserve-merges
) オプションをgit rebase
意図的にマージしたものをリベースする必要がある場合 (たとえば、すでにプッシュされている機能ブランチのマージでmaster
).
速記。
git up
の代わりに
git pull
上記のようなことを簡単に行うために、以下のようなエイリアスを作成することをお勧めします。
up
:
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
これで、ブランチを最新の状態にするために必要なことは、実行することだけです。
git up
の代わりに
git pull
. ローカルブランチが上流ブランチと分岐してしまったためにエラーが発生した場合は、リベースの合図です。
なぜダメなのか
git pull --rebase
?
実行中
git pull --rebase
を実行することと同じです。
git fetch
に続いて
git rebase
. これは新しい上流コミットに早送りしようとするものですが、それが不可能な場合はローカルのコミットを新しい上流コミットにリベースすることになります。 これは通常問題ありませんが、注意が必要です。
- リベースは高度なトピックであり、リベースの前にその意味を理解する必要があります。
-
git pull --rebase
では、コミットを取り込む前に、そのコミットを検証する機会がありません。 上流で何が変わったかにもよりますが、rebase が間違った操作である可能性は十分にあります。rebase --onto
,merge
,reset
またはpush -f
の方がより適切かもしれません。rebase
. -
を渡すことは(現在のところ)できません。
--preserve-merges
そのため、機能ブランチの意図的なマージは線形化され、機能ブランチのすべてのコミットを再生する (つまり複製する) ことになります。
で作成された既存のマージコミットを修正します。
git pull
によって作成されたマージコミットをまだプッシュしていない場合、そのマージコミットは
git pull
であれば、そのマージコミットをリベースすることができます。 意図的なマージ (たとえば、すでにプッシュ済みの機能ブランチを現在のブランチにマージする) をしていないと仮定すれば、次のようにすればよいでしょう。
git rebase @{u}
上記のコマンドは、Git に以下の場所から到達できるすべての非マージコミットを選択するよう指示します。
HEAD
(現在のコミット) から到達可能なすべてのコミットを差し引いたものです。
@{u}
(これは "上流ブランチ" の略語で、つまりは
origin/master
もし
HEAD
は
master
を再生して (チェリーピックして) 上流ブランチの上に置き、現在のブランチの参照を、コミットを再生した結果を指すように移動させるのです。 これにより、マージされないコミットが最新の上流コミットに移動されます。
git pull
.
意図的にマージするコミットがある場合は、以下のように
git rebase @{u}
なぜなら、他のブランチからすべてを再生してしまうからです。 この場合の対処はかなり複雑になります。
git up
を避け
git pull
を完全に削除してください。 おそらく
reset
で作成されたマージを元に戻すには
pull
を実行し、その後
git rebase -p @{u}
. その
-p
引数を
git rebase
を使用する必要があるかもしれません。
reset
を使用して意図的なマージを元に戻すには、ローカルブランチを更新して
@{u}
そして、意図的なマージをやり直します (これは、多くの毛深いマージの衝突があった場合には面倒です)。
関連
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み] まだプッシュされていない Git マージを元に戻す
-
[解決済み] Git のリモートブランチを作成する方法を教えてください。
-
[解決済み] Git フェッチ リモートブランチ
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み】ローカルリポジトリのブランチをリセットして、リモートリポジトリのHEADと同じにする
-
[解決済み】既存のGitブランチをリモートブランチに追従させる?
-
[解決済み] ある範囲のコミットを選んで、別のブランチにマージする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Gitのエラー。リモートリポジトリへの接続時に「Host Key Verification Failed」。
-
[解決済み】なぜ「git commit」は私の変更を保存しないのですか?
-
[解決済み] [Solved] 作業ツリーのディレクトリ 'example.com' を作成できませんでした。パーミッションが拒否されました
-
Gitのプッシュでエラーが発生! [リモート拒否] master -> master (pre-receive hook declined) error: failed to push s...
-
[解決済み] git stashを元に戻す
-
[解決済み] "would clobber existing tag "を取り除くには?
-
[解決済み] 警告: リモート HEAD は存在しない参照元を参照しているため、チェックアウトできません。
-
[解決済み] git rebase: "error: cannot stat 'file': パーミッションが拒否されました"
-
[解決済み] Git を使って、ローカルとリモートの間の変更点を見つけるには?
-
[解決済み】`git pull`が有害なのはどのような場合ですか?