私は巨大なコード ベースを手に入れました。多くの変更が加えられています。それをブランチして、リモートの新しいブランチにプッシュしたいのですが、先月からの変更セットのみをプッシュするには、その月の最初の変更を作成のように見せます。つまり、以前の変更は気にしません。可能だと確信していますが、それが何と呼ばれ、どのように行うのかわかりません。
4 に答える
まず、約 1 か月前に新しい最初のコミットにしたいコミットを見つけたとしgit show HEAD@{1.month.ago}
ますgit log
。そのコミットがf414f31
. また、あなたが取り組んでいるブランチの名前が と呼ばれているとしましょうdev
。
あなたは、後のコミットがリポジトリの最初のコミットであるように見せたいと言っているので、このブランチを同じリポジトリに保持しても意味がありません。共通の履歴はまったくありません。それでは、白紙の状態から始めるために、新しい空のリポジトリを作成しましょう。
mkdir squashed-repository
cd squashed-repository
git init
次に、古いリポジトリを参照するリモートを追加し、そこからすべてのブランチを新しいリポジトリのリモート追跡ブランチとしてフェッチしましょう。
git remote add previous /home/whoever/original-repository/
git fetch previous
月の初めにコミットから作業ツリーとインデックスを更新します。
git checkout f414f31 .
.
(その行の最後にある に注意してください。)
次に、インデックスの状態からコミットを作成します。
git commit -m 'A new start.'
現在、git rebase
コミットは1 つしかありません。 f414f31
previous/dev
master
git rebase --onto master b1cbc10e84bb2e2 previous/master
そのリベース中にいくつかの競合を修正する必要がある場合があります。デフォルトでは、git rebase
はそれらのコミットによって導入された変更を再適用するときに履歴を線形化します - でそれらを保存しようとするように指示できますが-p
、それはうまくいかない場合があります。
これmaster
で、この新しいリポジトリのブランチが希望どおりになったので、作成したリモートを削除できます。
git remote rm previous
特に元のリポジトリを誰かと共有している場合は特に、この種の履歴の書き換えは避けたいと思います。いずれにせよ、以前の履歴は非常に役立ちます。それをリポジトリに保持するのは本当に悪いことですか?
私があなたのリクエストを正しく受け取った場合、あなたは現在のリポジトリから特定のポイントから始まる新しいリポジトリを作成したいと考えています。なぜですか?あなたはそれをきれいに保ち、その特定のポイントの背後にあるすべての履歴を排除したいからです. さて、それは良い考えである可能性が高く、より良い答えへのリンクがあります。
ここで重要な用語はsquashまたはfilter-branchです。最初にバックアップが必要です。
とりわけ、GitExtensionsで実行する非常に具体的なことを要求しています。それはしません。実のところ、多くのことを行うわけではありません...そのため、コマンドラインへのボタンさえ提供されます。
必要になります。コマンドラインの微調整が必要です。あなたがそれをすることに慣れていないなら、あなたは運が悪い. あなたのためにこの仕事をするgit guiツールを私は知りません。
以下は、彼の真の意図に関するopの新しいコメントの前の、私の以前の(現在はレガシーな)回答の一部です。
そうでない場合は、「コードを取得して分岐し、部分的にプッシュする」という正当な理由があると仮定しましょう。次に、マークの指示に従うだけで、他の回答に表示されます。
または、バックアップ用としましょう。それではやり方がまずい。代わりに、バックアップ ツールを入手して使用してください。そのように簡単です。GIT はバックアップを意図したものではなく、多くの試行にもかかわらず、そのような目的で使用するべきではありません。CrashPlanまたはDropbox (私の紹介リンク)を使用することを強くお勧めします。
git checkout --orphan
同様の方法で使用できる独立したブランチを作成できる方法があり、いくつかのキーストロークを節約できます。
明らかに (?)、他の人が暗示しているように、履歴の単純な直線部分をベースラインとして選択した場合、物事はより単純になります。
編集: クローンの手順は、how-to-clone-a-single-branch-in-git で詳しく説明されています
考えられる解決策の 1 つは、フィルター ブランチクエリを使用して、関連するコミット (1 か月以内) を独自のリポジトリに分離することです。
ただし、これは既存のリポジトリに新しいブランチをプッシュするのではなく、新しいリポジトリにプッシュすることを意味します。
共通の履歴がない、ばらばらのブランチ (新しいルート コミット) を作成しない限り。「古いバージョンのコードを git リポジトリに追加する」を参照してください。その場合、 (レポ履歴を分割し、必要な変更を分離するのに役立つ)
の結果に基づいて、実際に新しいブランチをプッシュします。filter-branch