私は、歴史的に多くのコミットが「バグ修正」、「今回は実際のバグ修正」、「最終的なバグ修正」、「最終的に修正」された github リポジトリで作業しています。
これらはマスターに直接コミットされました。どうすればそれらをつぶすことができますか?
1年前の彼の投稿から-基本的にこれは悪いように聞こえます.githubで複数のコミットを押しつぶしたい. この1年で何か変化はありましたか?
私は、歴史的に多くのコミットが「バグ修正」、「今回は実際のバグ修正」、「最終的なバグ修正」、「最終的に修正」された github リポジトリで作業しています。
これらはマスターに直接コミットされました。どうすればそれらをつぶすことができますか?
1年前の彼の投稿から-基本的にこれは悪いように聞こえます.githubで複数のコミットを押しつぶしたい. この1年で何か変化はありましたか?
今日の答えは基本的に同じです。これらのコミットを破棄することは可能ですが、Git では共有履歴を書き換えることを強く避ける必要があります。
あなたと私がそれぞれ、GitHub にも存在するリポジトリのコピーを持っていると想像してください。
A---B---C
B
コミットとが実際には一緒にコミットされるべきであることに気付いたC
ので、ローカル コピーでこれらのコミットを押しつぶします。あなたは今持っています
A---D
whereはとD
の組み合わせですが、GitHub と私はまだ持っていますB
C
A---B---C
この時点で、ファイルの内容はどこでも同じですが、コミット ID は異なります。--force
GitHub のmaster
ブランチには、履歴に存在しなくなった 2 つのコミットが含まれているため、を使用せずに GitHub にプッシュすることはできません。
使用する場合は--force
、GitHub に変更を受け入れさせることができますが、現在、私のリポジトリには上流に存在しないコミット オブジェクトが含まれています。使用せずに GitHub にプッシュすることはできません--force
(これにより変更が無効になります)、または変更を取り込むための比較的ファンキーなマージを実行せずに、おそらく私の作業をリベースするなどです。あなたがしたことを私に。
これは、より多くの開発者 (Linux カーネル リポジトリでこれを行うイメージ!) と、より多くの作業が同時に行われると、さらに厄介になります。
本当に、誘惑に駆られたときはいつでもgit push --force
、座ってちょっと考えてみてください。あなたはおそらく、非常に正当な理由がある場合にのみ行うべきことを行っています。
私のお勧めは、あなたの歴史が少し乱雑であることを受け入れることですが、今後の改善に努めることです. これらのコミットは、GitHub にプッシュする (または他の開発者と共有する) 前に、ローカルでクリーンアップできます。機能ブランチで作業し、必要に応じて 、 などを使用cherry-pick
しrebase
てコミット履歴をクリーンアップしてからプッシュします。