どういうわけか私の主人と私の起源/主支店は分岐しました。私は実際にそれらを分岐させたくありません。どうすればこれらの違いを見てそれらを「マージ」できますか?
あなたがすることができます 違いを確認 で:
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つの点で異なります。
C 'の背後にある履歴はまだ線形であることに注意してください。
(現時点では)cmake.org/cmake.git
の線形履歴のみを許可することを選択しました。
この方法では、以前に使用されていたCVSベースのワークフローが維持され、移行が容易になる可能性があります。
C 'を私たちのリポジトリにプッシュしようとする試みはうまくいきます(あなたが許可を持っていて、あなたがリベースしている間に誰もプッシュしていないと仮定して)。
Git pullコマンドはOriginから取り出してローカル作業をやり直すための簡単な方法を提供します。
$ git pull --rebase
これは上記の取得とリベースのステップを1つのコマンドにまとめます。
私はこれを持っていました、そして、上記の反応を読んだ後でさえ、それが何を引き起こしたかに関して不可解です。私の解決策は
git reset --hard Origin/master
それから、(リモートの)Origin/masterで表されるように、(ローカルの)masterのコピー(正しいものになっていると思います)を正しい位置にリセットするだけです。
_ warning _ :
Origin/master
にまだプッシュされていないすべての変更を失います。
git pull --rebase Origin/master
ほとんどの場合あなたを助けることができる単一のコマンドです。
編集: オリジン/マスターからコミットを引き出し、新しく引っ張ったブランチの履歴にあなたの変更を適用します。
リモートブランチを追跡しているブランチを 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
私の場合、これはdivergedメッセージを引き起こすためにしたことです。私はgit Push
をしましたが、git commit --amend
をしてコミットメッセージに何かを追加しました。その後、別のコミットも行いました。
したがって、私の場合は、単にOrigin/masterが古くなっていたことを意味します。 Origin/masterに誰も触れていないことを知っていたので、修正は簡単でした:git Push -f
(ここで-f
は力を意味します)
私の場合はOrigin/master
に変更をプッシュし、そうしてはいけないことに気付きました:-(ローカルの変更がサブツリーに含まれていたため、これは複雑でした。 (SourceTreeを使用して)ローカルに変更してから、「分岐メッセージ」を受け取りました。
自分の混乱をローカルで修正した後(詳細はここでは重要ではありません)、リモートのOrigin/master
ブランチを「時間的に後退」させて、ローカルのmaster
と再び同期するようにしたいと思いました。私の場合の解決策は次のとおりです。
git Push Origin master -f
-f
(force)スイッチに注意してください。これにより、誤ってOrigin/master
にプッシュされていた「悪い変更」が削除され、現在ローカルブランチとリモートブランチは同期しています。
これは潜在的に破壊的な操作であることに注意してください。したがって、リモートマスタを時間内に "元に戻す"ことが100%確実である場合にのみ実行してください。
ここにはたくさんの答えがあることは知っていますが、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)とともに任意です。また、別のブランチにコミットしたい場合は、目的のブランチに切り替えた後にこの手順を実行する必要があります。
違いを見るには:
git difftool --dir-diff master Origin/master
これにより、2つのブランチ間の変更点または相違点が表示されます。 araxis(私のお気に入り)では、それはフォルダのdiff形式で表示されます。変更された各ファイルを表示しています。ファイルをクリックすると、ファイル内の変更の詳細を見ることができます。
私の場合、これは私の紛争解決を約束しなかったことが原因でした。
問題は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つの方法は、
git checkout -b b Origin/B
最後のコミットメッセージを編集しようとしたときに同じメッセージが表示されていました。すでにコミットをプッシュしていました。git commit --amend -m "New message"
git Push --force-with-lease repo_name branch_name
を使用して変更をプッシュしても問題はありませんでした。