1

おそらく「公開リポジトリにプッシュしたコミットをリベースしないでください」という罪を犯して、gitリポジトリをめちゃくちゃにしてしまったようです。

シナリオは次のとおりです。

  • master ブランチのアップストリーム リポジトリからの変更を追跡し、自分の変更を devel というブランチに保持しています。
  • アップストリーム リポジトリに変更があった場合は、これを master ブランチにプルします。
  • 次に、devel をチェックアウトrebase masterしてから、master ブランチに独自の変更を加えます。これにより競合が発生し、いくつかのコミットで次のエラー メッセージが表示されます (例として、以下にそのうちの 1 つだけを含めます)。

パッチ適用ベースと 3 方向マージにフォールバックしています... 自動マージ public/scala/qscript/org/broadinstitute/sting/queue/qscripts/AlignWithBWA.scala CONFLICT (コンテンツ): public/scala/qscript/org でのマージの競合/broadinstitute/sting/queue/qscripts/AlignWithBWA.scala 変更のマージに失敗しました。パッチは 0038 で失敗しました インデックス ファイルのチェックを追加しました。

この問題を解決したら、「git rebase --continue」を実行します。このパッチをスキップしたい場合は、代わりに「git rebase --skip」を実行してください。元のブランチをチェックアウトしてリベースを停止するには、「git rebase --abort」を実行します。

  • 次にgit rebase --skip、問題の原因となっているコミットをスキップするために使用し、最終的に必要なコードに行き着きます。

さて、問題は、リベースするたびに、この手順を実行する必要があることです。将来同じ競合が発生しないようにする方法はありますか? 私の考えはpush --force origin devel、競合を引き起こすコミットなしでリモートリポジトリの履歴を上書きするために使用することです。これは行く方法ですか?または、この問題を解決する他の方法はありますか?

4

3 に答える 3

1

git push --forceここは良い考えではないと思います。いずれにせよ、使用git push --forceする前に、プッシュで追加および削除するものを確認し、他の開発者が警告を受け取り、おそらくリベースして変更を再プッシュする必要があることに注意してgit fetchください。git diff devel origin/master--force

  1. フェッチされたマスターのコミットではなく、開発者のコ​​ミットをスキップしているとgit rebase --skip思います。
  2. 「リベース」の後、「--force」なしでプッシュできるはずです(新しいコミットがすぐに来て、フェッチ/リベースの別のサイクルが必要になる場合を除きます)。

いくつかのメモ:

  • 同じ競合を何度も解決したくない場合は、「git rerere」を使用できます
  • Git はリモート コンテンツを "origin/master" として自動的にミラーリングします。"git fetch" を使用して更新できます。次に、「マスター」ブランチとの間を行き来する必要なく、devel で「git rebase origin/master」を使用できます。
于 2012-09-21T12:52:12.970 に答える
1

アップストリームが公開履歴を書き換えていないと仮定すると、マスターからの最新コードの上で動作するようにコミットを調整する必要があります。代わりに、競合するコミットをスキップしています。git add代わりに、競合を解決してから、 とgit rebase --continue(ではない)を使用して解決済みとしてマークする必要があります--skip

競合が発生し続ける理由は、毎回競合をスキップしているためです。

を行うgit push --forceと、ブランチを使用している他の人の公開履歴が書き換えられます (既にプルダウンして作業しているコミットを削除または並べ替えることができます)。これは避けるのが最善です。

于 2012-09-21T12:17:51.463 に答える
1

プッシュ フォースは、最も悲惨な状況でのみ実行する必要があります。

作業を開始してから、他の誰かがリモート ブランチに変更を加えた場合、文字通り上書きされます。

したがって、競合を手動で解決するのが最善です。

コードの同じ行に変更がある場合は、手動で解決する必要があります。力を行使することは、それらを「解決」する方法ではありません。

それがあなたの経験であるなら、それはあなたが学んでいる間だけであり、あなたがそれをしている間、実験し、学んでいる間、おそらくいくつかのことがオフになっています.

考慮すべき別のオプションは、コードを取得してコピーを作成し、-r .git ディレクトリを削除して、そのための新しい git リポジトリを作成することです (git init)。

于 2012-09-21T12:23:51.207 に答える