19

ある種のテンプレートプロジェクトとして使用した自分の別のプロジェクトへのトレースを含むプロジェクトがあります。次に、これらのトレースをリポジトリから完全に削除します。基本的に私は古いジャンクコミットを切り落としたいです。ので、私は持っています

A -- B -- C -- D -- E -- F

のようなものを取得したい

D -- E -- F

A -- B -- Cリポジトリから完全に削除されます。

4

4 に答える 4

32

masterコミット時であると仮定しFます:

 # create a new branch with D's content
$ git checkout --orphan temp <d-sha1>
$ git commit

 # rebase everything else onto the temp branch
$ git rebase --onto temp <d-sha1> master

 # clean up
$ git checkout master
$ git branch -d temp

古い緩いオブジェクト(、、、)を完全に削除するA場合BC最初に必要なものが正確に揃っていることを確認してください。これは、元に戻すことはできません。 必要なものであることを確認したら、次を実行します。

$ git reflog expire --expire=now --all
$ git gc --prune=now
于 2012-07-27T12:46:42.077 に答える
3

Githubには、機密データの削除に関する優れた記事があります(したがって、必要なコミットも):

Gitから機密データを削除する

于 2012-07-27T12:42:51.470 に答える
0

@vergenztの回答をフォローしようとしていましたが、gitは最初のコミットからパッチを適用し始めました。これは私が開始する必要のあるコミットの前に3000以上のコミットでした。

私の目的は、現在のプロジェクトに基づいた新しいプロジェクトの小さなリポジトリを作成することでした。残念ながら、現在のプロジェクト(数か月)から保存するためにいくつかの履歴が必要でした。これが私がついにそれを行うことができた方法です:

競合を解決する必要があるため、コマンドラインツールはこれを行うのにあまり便利ではありませんでした。幸い、TortoiseGitにはリベース機能があり、マスター(左)と温度(右)の2つのバーンを提供する必要があります。次に、コミットを含めるときに一時的に分岐するコミットの前にあるすべてのコミットをスキップします(コミットを選択し、右クリックメニューで[スキップ]を使用します)。リベースが開始された後、リベースGUIで直接解決できるいくつかの競合が発生します。私はいつも右クリックメニューで「マスターブランチバージョンを使用する」を選択しました。これは、CLIに煩わされるよりもはるかに短い時間で済みました。すべてが完了した後、新しいリポジトリ内のファイルに元のリポジトリの最新バージョンからすべてのプロジェクトファイルを追加でコピーし(すべて上書き)、何も失われないようにしました。.gitignoreにあるファイルがいくつかあり、どういうわけか無視されませんでした。

これが誰かに役立つことを願っています。

于 2019-06-25T11:03:27.480 に答える
0

それは古い質問だと思いますが、今日ここに着陸してこのトピックについて検索しました...

大量のコミットの問題については、rebaseコマンドで「-Xtheirs」または「-Xours」を使用してみてください。

git rebase -X theirs -i HEAD〜20

ここで説明されている2つの違い

それが誰かに役立つことを願っています

于 2021-01-21T09:18:15.780 に答える