1. ホーム
  2. git

[解決済み] masterブランチと'origin/master'が分岐している、'undiverge'ブランチの方法は?

2022-01-18 14:15:53

質問

なぜか私の master と私の origin/master ブランチが分岐しています。
実は、分岐してほしくないんです。

これらの違いをどのように捉えればよいのか、また マージ ということです。

解決方法は?

あなたは 違いを確認する を使っています。

git log HEAD..origin/master

以前 引っ張る (フェッチ + マージ) (参照) "gitに常に特定のブランチからpullするようにするにはどうしたらいいですか? )


というようなメッセージがある場合。

"あなたのブランチと 'origin/master' が分岐し、 # それぞれ 1 つと 1 つの異なるコミットが存在します "。

を確認します。 更新の必要性 origin . もし origin が最新であれば、いくつかのコミットが origin ローカルで自分のコミットをしている間に、他のリポジトリから自分のコミットが行われました。

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \
                    C  master (your work)

コミットCをコミットAに基づかせたのは、それがその時点で上流から取ってきた最新の作業だったからです。

しかし、あなたがオリジンにプッシュバックしようとする前に、他の誰かがコミットBをプッシュしました。
開発履歴が別経路に分岐してしまった。

その後、マージまたはリベースを行うことができます。参照 プロGit。Git のブランチング - リベース をご覧ください。

マージ

git mergeコマンドを使用します。

$ git merge origin/master

の変更を統合するよう Git に伝えます。 origin/master を作成し、マージコミットを行います。
履歴のグラフは今、このようになっています。

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \      \
                    C ---- M  master (your work)

新しいマージ、コミット M は 2 つの親を持ち、それぞれがそのコミットに格納されたコンテンツに至る開発の 1 パスを表しています。

Mの背後にある歴史は、現在では非線形であることに注意してください。

リベース

git rebaseコマンドを使用します。

$ git rebase origin/master

これは、コミット C (あなたの作業) を、コミット A ではなくコミット B を基にしているかのように再生するように Git に指示します。
CVS や Subversion のユーザーは、コミット前に更新する際に、ローカルの変更を上流の作業の上にリベースすることが日常的になっています。
Gitは、コミットとリベースのステップを明示的に分離しているだけです。

履歴のグラフはこのようになりました。

... o ---- o ---- A ---- B  origin/master (upstream work)
                          \
                           C'  master (your work)

コミットC'は、git rebaseコマンドによって作成された新しいコミットです。
Cとは2つの点で異なります。

  1. 歴史が違う。AではなくBである。
  2. その内容は、BとCの両方の変更を考慮したもので、マージの例のMと同じです。

C'の背後にある歴史はまだ線形であることに注意してください。
では、(今のところ)線形履歴のみを許可することにしました。 cmake.org/cmake.git .
この方法は、以前使用していたCVSベースのワークフローを維持し、移行を容易にする可能性があります。
C' を私たちのリポジトリにプッシュする試みはうまくいきます (あなたにパーミッションがあり、あなたがリベースしている間に誰もプッシュしていないと仮定しています)。

git pull コマンドは、オリジンから取得したデータをローカルでリベースするための省略記法を提供します。

$ git pull --rebase

これは、上記のフェッチとリベースのステップを1つのコマンドにまとめたものです。