2

通常の方法で git 機能ブランチを作成しました。

git checkout develop
git checkout -b new_feature_branch

機能をメインの開発ブランチにマージするときが来たとき、マージによって大量の競合が発生しました (メイン ラインはあまり変更されていなかったため、予想をはるかに超えていました)。

調査の結果、機能ブランチが何らかの形で親から孤立したようです。このブランチへの最初の 24 件のコミットは、メイン ラインからの最初のフォークと同様に、履歴から欠落しています。

にリストされているため、正確に 24 個のコミットであることがわかりgit reflog --all | grep new_feature_branchます。

これらの初期のコミットが欠落しているため、ブランチはリポジトリ全体の複製から始まるようになり、開発にマージしようとすると多くの競合が発生します。

どうしてそうなった?

不足しているコミットを回復するにはどうすればよいですか?

4

3 に答える 3

2

どうしてそうなった?

  • 分岐develop元 - これのローカル コピー (とは対照的にorigin/develop) は、分岐したときに最新のものでしたか?
  • developあなたが望んでいた親ブランチは間違いありませんmasterか?
  • develop分岐後にリベースしましたか?これにより、 の履歴developではなく の親コミットが書き換えられた可能性があります。new_feature_branch
  • ある時点でリベースnew_feature_branchし、分岐点の前に誤って親コミットを書き直しましたか?

不足しているコミットを回復するにはどうすればよいですか?

ブランチを目的のブランチ ポイントにリベースするだけです (この質問この本などを参照してください)。

于 2012-11-30T21:20:49.003 に答える
0

さて、これが私がそれを修正するためにしたことです:

  1. 実行git reflog --all | grep <new_feature_branch>して、履歴に欠落していた初期のコミットを含む、機能ブランチのコミットの完全なリストを取得します。
  2. 表示されている最も古いコミットを開い.git/logs/HEADて検索し、元の親の完全なSHAを見つけます(ハットチップ)。
  3. 親コミット(ブランチの履歴から失われたもの)をチェックアウトしてから、このコミットから新しい「リカバリ」ブランチをチェックアウトして、新しいベースを作成します。これを行った後、「失われた」コミットは、開発ブランチから適切にフォークされたリカバリブランチの一部としてツリーに再表示されました。
  4. '孤立した'ブランチからの最も古いコミットで実行git cherry-pick <SHA>して、そのブランチのベースをリカバリブランチの先端にコピーします。マージの競合を解決します。
  5. 孤立したブランチをチェックアウトします。
  6. git rebase --onto <new-parent> <old-parent>ここで実行します。new-parentこれは、リカバリブランチにコピーしたばかりのコミットであり、そのコミットをコピーしold-parentた孤立したブランチで最も古いコミットです。完全なブランチ履歴は、最小限の競合で正常に移植されました。
于 2012-12-01T01:55:27.397 に答える
0

回復するには、孤立したブランチのbase(root)の親を再指定できるagraftまたはaのいずれかを使用するだけです。replace

マージ後に機能ブランチを保持する必要がない場合は、適切な分岐構造を確認するには、単純な1回限りのグラフトで十分な場合があります。

ただし、マージ時の親リンケージは孤立したブランチを保持し、リポジトリには2つのルートコミットがあります[おそらくあなたが望むものではありません]。

単純な改善は、rebase(孤児を適切な分岐点に)またはfilter-branch移植後に行うことです。

ブランチ(ヒント)を作成するのではなく、元のブランチポイントで特定のコミットを誤ってチェックアウトしたため、detached HEAD状況が発生し、エラーメッセージの後に不適切な順序で修正を行ったようです-簡単に実行できます。

于 2012-12-01T11:03:09.487 に答える