2

私のリポジトリは次のようになります。

X - Y- A - B - C - D - E             branch:master
     \                  \
      \                  \ merge master -> release
       \                  \
        M  ---  BCDE  ---  N         branch:release 

ここで、「M - BCDE - N」は手動で (残念ながら!) 適用された変更であり、個別のコミット「A - B - C - D - E」とほぼ同じです (ただし、GIT はこれらの変更が同じであることを認識していないようです)。次の構造をリベースして取得したいと思います。

X - Y- A - B - C - D - E     branch:master
                        \
                         *   branch:release 

つまり、branch:release を branch:master とまったく同じにして、マスターの HEAD からフォークしたいのです。

しかし、ブランチ リリースで「git rebase master」を実行すると、GIT は多くの競合について報告し、リベースを拒否します。どうすればこれを解決できますか?

これに関するその他の説明: マスターの HEAD からゼロから branch:release を「再作成」したいと思います。あと、branch:release はもう git pull してる方が多いので、git reset + git push -f が使えません。

4

2 に答える 2

1

あなたは人々がすでにリリース ブランチをプルしているので、リセットできないと言っています。これは、リベースできないことも意味します。どちらにしても、参照をマージしない方法で移動し、他のすべての人を動揺させます。

リリース ブランチのすべてを破棄して (私は に少し混乱しています)、 Mmaster と同一にしたい (なぜ を表示するのですか?)と仮定すると、次*のことができます。

git checkout master
git merge --strategy=ours release   # merge in release, but keep master's contents
git checkout release
git merge master                    # fast-forward

あなたはこれで終わるでしょう:

X - Y- A - B - C - D - E ----- Z (master, release)
     \                  \     /
      \                  \   /
       \                  \ /
        M  ---  BCDE  ---  N

マージ コミットZは、リリースからのすべての変更を破棄します。リリースが早送りで移動することを確認するためだけに存在します。ドキュメントから:

私たちのもの

これにより任意の数のヘッドが解決されますが、マージの結果のツリーは常に現在のブランチ ヘッドのツリーになり、他のすべてのブランチからのすべての変更が効果的に無視されます。これは、サイドブランチの古い開発履歴に取って代わるために使用されることを意図しています。

これはまさにあなたの状況です!

--no-commitまた、マージ時にオプションを使用して手動でコミットし、メッセージを編集して何をしたかを記録する機会を得ることも悪い考えではありません。

于 2010-04-21T21:45:42.353 に答える
0

そのリビジョンを完全に破棄するにはgit rebase -i master、 for 行を使用して削除することができます。BCDE本当に と同じならA-B-C-D-E、問題はないはずです。

于 2010-04-21T21:25:41.690 に答える