問題タブ [squash]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
git - コミットをスカッシュできません: そこにありません
スカッシュしたい一連のコミットがあります。実行時に、
がまったく表示されないので、問題に対処するために、面倒なコミットに到達したときに何が起こるかを試すことができるように、テールから 1 つずつスカッシュを開始することにしました。これは非常に興味深いことです。私のログが次のように表示されるとき
squashedCommitsHash コミットのスカッシングが面倒 CommitHash 面倒なコミット メッセージ
走る
そして、私は得る
何?!私の面倒なコミットはどこですか?なぜそこにないのですか?そして、2 つだけをつぶしたいと指定したにもかかわらず、他のすべてが表示されたのはなぜですか?
git - それを縮小するために、競合することなく、gitリポジトリの履歴を自動的に押しつぶす方法は?
リポジトリが大きくなりすぎて使用できなくなりました。基本的に、私のリポジトリは 2GB を超えており、複製に時間がかかりすぎます。縮小したいのですが、特定の古いバージョンに戻すことはできます... 縮小には履歴の書き換えが含まれるので、それで問題ありません。クローンを持っている人は、新しいレポクローンの新しいブランチの上にファイルをリベース/チェリーピック/コピーする必要があります。
- このリポジトリにバイナリ ファイルがありますが、そこに必要です (ソフトウェアを実行するための必須のリソースと考えてください)。そのため、過去のコミットに戻すときに必要になる可能性があるため、フィルターブランチまたはBFGを使用して大きなバイナリ ファイルを削除することはできません。
- 以前の古い/既にマージされたブランチ (例: フィーチャー ブランチ) は気にしませんが、いくつかの特定のコミット (過去のリリース ブランチの例のヘッド) は気にします。
- (~多数~) 非常に古いコミットを変更するので、(基本的な rebase/cherrypick で発生する可能性があるように) マージの競合を適切に解決する方法がわかりません。そのため、競合が発生しない解決策を探しています。自動的に解決できる競合のみを生成します。
- 現在のすべてのブランチを保持したいので、クローンで作業を行っている人は、それらの変更をリベース/コピーできます。
- 古いレポの履歴と一致するように、新しいコミット間に関連する履歴が必要です (コミットが押しつぶされたかのように)。現在のブランチの履歴は、これらの古い押しつぶされたコミットの 1 つから始まります。
私はそれを不要な古いリポジトリ履歴のスカッシュと考えています。私の場合の可能なプロセスとしてこれまでに思いついたのは(いくつかの手順を見逃しており、これが私が思うことを行うかどうかまだ確信が持てません)は次のとおりです。
- 既存のリポジトリのミラーをクローンします。
- 保持したい古いコミットから孤立したブランチを作成します。これにより、必要なすべてのファイルを含む、親のない押しつぶされたコミットが作成されます。
- どういうわけかそれらをリンクして古いレポ履歴を再作成します=>どのように? マージ/リベース/リセット+コミットの孤児?
- 各現在のブランチのコミット リストを (間隔を使用して) チェリーピックし、それらを最初の発散コミットの親を押しつぶした最新のコミットに適用する => チェリー ピックされたコミット間隔を適用するコミットを自動的に見つける方法は? それは競合なしで機能しますか?
- タグを新しいツリーに移動します。前のツリーを削除します。gitガベージコレクト。
これは競合なしで実行可能/実行可能ですか? これはどのような場合でも機能しますか (git commit ツリーはかなり複雑になる可能性があります)? 安全かつ自動的に履歴をつぶすためのより良い解決策はありますか?
この種のメンテナンス タスクは、長期にわたるプロジェクトで発生するものであるように思われるため、他の大きなプロジェクトで何らかのソリューションが既に使用されていると思います。しかし、このユースケースの古いレポから新しいレポを作成するために、私が気付いていない git init (または別のコマンド) のオプションがあると思いますか?
更新:ここで解決策の始まりを見つけました: https : //wincent.com/wiki/Editing,_amending,_or_squashing_the_root_commit_in_a_Git_repository .
git - ブランチ内のすべてのマージをスカッシュする方法は?
次のようなブランチがあります。
書き直して次のようにしたいと思います。
つまり、すべてのマージを押しつぶします。
枝がとても長いです。これはどのように自動的に行うことができますか?
編集
これは履歴の線形化ではありません。D や G など、すべてのマージを squash したい。
git - SQUASHED 時に Git ブランチがマスターにマージされたかどうかを確認していますか?
リモート ブランチのクリーニングを自動化したい。ブランチがすでにマスターにマージされているかどうかを確認できるようにしたい。当初、私の計画は git merge-base を使用して最後の共通コミットを確認することでした。
しかし、ブランチを master にマージする際に、すべてのブランチを押しつぶしてしまうことがわかりました。これにより新しいコミット ハッシュが作成されるため、マスターとブランチの間で共通のコミットを見つけることができません。
マージ時にブランチをすべて押しつぶした場合、ブランチがマージされたかどうかを判断するにはどうすればよいですか?
前もって感謝します!
git - Git - ブランチ全体をスカッシュ - 1 行のスカッシュ コマンド
新しいコードに取り組んでいる間、変更を追跡するために多くの小さなコミットを行います。ただし、私の会社では、各機能を 1 回のコミットとしてコミットすることを好みます。したがって、解決策は、(ローカル) ブランチ全体を単一のコミットに押しつぶすことです。
すべてのコミットを使用git rebase --interactive
して変更せずにブランチ全体をスカッシュするにはどうすればよいですか?pick
squash
git - git: 1 つのコミットで 2 人のユーザーが言及されています
既にリモートにプッシュされている git 履歴を正しくリベースしようとしています。私が編集したコミットに謎の「2人のユーザー」が言及されていることを除いて、すべてが期待どおりに機能していsquash
ます。このコミットの差分はtpgmartin
、この画像の場合、 user によって行われた変更の差分と一致します。
これは私がgithubで見たもののスクリーンショットです(私はユーザーですahoskins
):
なぜこのような動作が発生するのですか?