web-dev-qa-db-ja.com

マスターブランチと 'Origin/master'が分岐していますが、どのように 'ブランチ'を '分岐'するのですか?

どういうわけか私の主人と私の起源/主支店は分岐しました。私は実際にそれらを分岐させたくありません。どうすればこれらの違いを見てそれらを「マージ」できますか?

820
Frank

あなたがすることができます 違いを確認 で:

git log HEAD..Origin/master

before pullして (fetch + merge)( "どのようにしてgitは常に特定のブランチからプルするのですか?" -


次のようなメッセージがあるとします。

「あなたの支店と 'Origin/master'は分岐しています。#それぞれ、1つと1つの異なるコミットを持っています。」

、あなたがいるかどうか確認してください Originを更新する必要がありますOriginが最新のものである場合、あなたがローカルであなた自身のコミットをした間、いくつかのコミットが別のリポジトリからOriginにプッシュされました。

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

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

ただし、Originにプッシュバックしようとする前に、他の誰かがコミットBをプッシュしました。
開発の歴史は別々の道に分岐しました。

その後、マージまたはリベースすることができます。詳細は Pro Git:Git Branch - Rebasing を参照してください。

マージ

Git mergeコマンドを使用してください。

$ git merge Origin/master

これはGitにOrigin/masterからの変更をあなたの仕事に統合してマージコミットを作成するように伝えます。
歴史のグラフはこのようになりました。

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

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

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

リベース

Git rebaseコマンドを使用してください。

$ git rebase Origin/master

これはGitに、あなたがそれをAではなくコミットBに基づいているかのようにコミットC(あなたの仕事)を再生するように伝えます。
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コマンドはOriginから取り出してローカル作業をやり直すための簡単な方法を提供します。

$ git pull --rebase

これは上記の取得とリベースのステップを1つのコマンドにまとめます。

892
VonC

私はこれを持っていました、そして、上記の反応を読んだ後でさえ、それが何を引き起こしたかに関して不可解です。私の解決策は

git reset --hard Origin/master

それから、(リモートの)Origin/masterで表されるように、(ローカルの)masterのコピー(正しいものになっていると思います)を正しい位置にリセットするだけです。

_ warning _ Origin/masterにまだプッシュされていないすべての変更を失います。

588
skiphoppy
git pull --rebase Origin/master 

ほとんどの場合あなたを助けることができる単一のコマンドです。

編集: オリジン/マスターからコミットを引き出し、新しく引っ張ったブランチの履歴にあなたの変更を適用します。

42
asitmoharna

リモートブランチを追跡しているブランチを rebase にしようとしたときにこの状況に陥り、masterでそれをリベースしようとしました。このシナリオでリベースしようとすると、ブランチ が分岐した になる可能性が高くなり、git nubeにはない混乱を引き起こす可能性があります。

マスターから分岐したブランチmy_remote_tracking_branchにいるとしましょう。

$ git status

#支店でmy_remote_tracking_branch

コミットするものがない(作業ディレクトリがクリーン)

そして今、あなたはマスターからリベースしようとしています:

git rebase master

今すぐやめて、トラブルを避けましょう。代わりに、mergeを使ってください。

gitマージマスター

はい、あなたはあなたのブランチで追加のコミットをすることになります。しかし、「分岐のない」ブランチを準備していない限り、これはリベースよりもはるかにスムーズなワークフローになります。もっと詳しい説明は このブログ を見てください。

一方、あなたのブランチが local ブランチだけの場合(つまり、まだどのリモートにもプッシュされていない場合)、間違いなくリベースを実行する必要があります(この場合、ブランチは 分岐 しません)。 ).

このようなリベースが原因で「分岐」シナリオですでに are が指定されているためにこれを読んでいる場合は、次のコマンドを使用してOriginからの最後のコミットに戻ります。

git reset - ハードオリジン/ my_remote_tracking_branch

28
paneer_tikka

私の場合、これはdivergedメッセージを引き起こすためにしたことです。私はgit Pushをしましたが、git commit --amendをしてコミットメッセージに何かを追加しました。その後、別のコミットも行いました。

したがって、私の場合は、単にOrigin/masterが古くなっていたことを意味します。 Origin/masterに誰も触れていないことを知っていたので、修正は簡単でした:git Push -f(ここで-fは力を意味します)

20
Darren Cook

私の場合はOrigin/masterに変更をプッシュし、そうしてはいけないことに気付きました:-(ローカルの変更がサブツリーに含まれていたため、これは複雑でした。 (SourceTreeを使用して)ローカルに変更してから、「分岐メッセージ」を受け取りました。

自分の混乱をローカルで修正した後(詳細はここでは重要ではありません)、リモートのOrigin/masterブランチを「時間的に後退」させて、ローカルのmasterと再び同期するようにしたいと思いました。私の場合の解決策は次のとおりです。

git Push Origin master -f

-f(force)スイッチに注意してください。これにより、誤ってOrigin/masterにプッシュされていた「悪い変更」が削除され、現在ローカルブランチとリモートブランチは同期しています。

これは潜在的に破壊的な操作であることに注意してください。したがって、リモートマスタを時間内に "元に戻す"ことが100%確実である場合にのみ実行してください。

7
Laryx Decidua

ここにはたくさんの答えがあることは知っていますが、git reset --soft HEAD~1は注意を払うに値すると思います。分岐状態を解決しながら、最後のlocal(pushされていない)コミットの変更を維持できるからです。ローカルコミットを見直したり、別のブランチに移動したりすることもできるため、これはrebaseを使用してプルするよりも用途が広いソリューションだと思います。

キーは、厳しい--softの代わりに--hardを使用しています。複数のコミットがある場合は、HEAD~xのバリエーションが機能します。だからここに私の状況を解決したすべてのステップがあります(私は1つのローカルコミットと8つのリモートコミットをコミットしました):

ローカルコミットを元に戻すには1)git reset --soft HEAD~1。次のステップでは、SourceTreeのインターフェースを使用しましたが、次のコマンドも機能するはずです。

1)から変更を隠すための2)git stash。これで、すべての変更は安全になり、分岐はなくなりました。

リモートの変更を取得するための3)git pull

最後に隠した変更を適用するには4)git stash popまたはgit stash applyに続けて、必要に応じて新しいコミットを続けます。ローカルコミットで変更を破棄したい場合、このステップは2)とともに任意です。また、別のブランチにコミットしたい場合は、目的のブランチに切り替えた後にこの手順を実行する必要があります。

4
Bianca D.

違いを見るには:

git difftool --dir-diff master Origin/master

これにより、2つのブランチ間の変更点または相違点が表示されます。 araxis(私のお気に入り)では、それはフォルダのdiff形式で表示されます。変更された各ファイルを表示しています。ファイルをクリックすると、ファイル内の変更の詳細を見ることができます。

4
C Johnson

私の場合、これは私の紛争解決を約束しなかったことが原因でした。

問題はgit pullコマンドの実行によって引き起こされました。原産地の変更は、私が解決した私の地元のレポとの衝突につながりました。しかし、私は彼らをコミットしませんでした。この時点での解決策は変更をコミットすることです(git commit解決されたファイル)

競合を解決してからいくつかのファイルも変更した場合、git statusコマンドはローカルの変更をステージングされていないローカルの変更として表示し、マージ解決を段階的なローカルの変更として表示します。これは、マージからの変更を最初にgit commitでコミットしてから、ステージングされていない変更を通常どおりに追加およびコミットすることで(たとえば、git commit -aで)正しく解決できます。

ブランチAに基づいてブランチを作成したときにこの問題に遭遇しました

git checkout -b a

次に、ブランチaのアップストリームをOriginブランチBに設定します。

git branch -u Origin/B

次に、上記のエラーメッセージが表示されました。

この問題を解決する1つの方法は、

  • ブランチを削除します
  • 新しいブランチbを作成します
git checkout -b b Origin/B
0
Shouheng Wang

最後のコミットメッセージを編集しようとしたときに同じメッセージが表示されていました。すでにコミットをプッシュしていました。git commit --amend -m "New message"git Push --force-with-lease repo_name branch_nameを使用して変更をプッシュしても問題はありませんでした。

0
LoveForDroid