12

2 つの git リポジトリがあり、その間に追跡されていない多くの変更があります。

   ftp -->            C-- (untracked changes) --D
                     /                           \
   git        A--B--C <-- old/master              \
                                                   \
                                                    \
                                  new/master -->     D--E--F 

古いリポジトリを新しいリポジトリにマージして、次のような線形の履歴を作成するにはどうすればよいですか

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

編集:

Git リポジトリを線形履歴に結合するにはどうすればよいですか? に触発されました。

終わったよ:

git clone url://new new
cd new/
git remote add old url://old
git fetch old
git reset --hard origin/master
git filter-branch --parent-filter 'sed "s_^\$_-p old/master_"' HEAD
git push origin master

唯一の問題は、新しい/マスターからのすべてのコミットが2倍になったことです(親の変更によると思います)ので、今は(Mはマージコミットです)

         D---E---F--         
                    \
A--B--C--D'--E'--F'--M 

不要なコミット (D - F およびおそらく M) を簡単に削除するにはどうすればよいですか?

4

4 に答える 4

6

の結果を修正するgit filter-branch

次のようなリポジトリがある場合:

         D---E---F--
                    \
A--B--C--D'--E'--F'--M <-master

結果は次のようになります。

A--B--C--D'--E'--F' <-master

master次に、単にポイントするように強制できますF'

git checkout master
git reset --hard <sha1-of-F'>

これにより、 commit DEF、およびMが到達不能になり、実質的に削除されます (しばらくするとガベージ コレクションされます)。

最初からやり直す

次のような 2 つのリポジトリがあるとします。

  • 年: A--B--C <-master
  • 新着: D--E--F <-master

結果は次のようになります。

  • 結合: A--B--C--D'--E'--F' <- master

その後、次の手順を実行できます。

  1. combinedリポジトリを初期化します。

    git init combined
    cd combined
    git remote add old url:/to/old
    git remote add new url:/to/new
    git remote update
    

    この時点で、combinedリポジトリは次のようになります。

    A--B--C <-old/master
    
    D--E--F <-new/master
    

    2 つのブランチはまったく接続されていないことに注意してください。

  2. masterブランチを次のように設定しますC

    git reset --hard old/master
    

    これで、リポジトリは次のようになります。

          old/master
          |
          v
    A--B--C <-master
    
    D--E--F <-new/master
    
  3. の sha1 を見つけますD:

    d=$(git rev-list --reverse new/master | head -n 1)
    
  4. Dコミットの内容を読み取って、作業ディレクトリとインデックスにインポートします

    git read-tree -u --reset $d
    
  5. D元のコミットと同じコミット メッセージ、作成者、日付などを使用して内容をコミットしますD

    git commit -C $d
    

    これで、リポジトリは次のようになります。

          old/master
          |
          v
    A--B--C--D' <-master
    
    D--E--F <-new/master
    
  6. 残りのコミットをチェリーピックします。

    git cherry-pick $d..new/master
    

    これで、リポジトリは次のようになります。

          old/master
          |
          v
    A--B--C--D'--E'--F' <-master
    
    D--E--F <-new/master
    
  7. 掃除:

    git remote rm old
    git remote rm new
    

    これで、リポジトリは次のようになります。

    A--B--C--D'--E'--F' <-master
    
于 2013-06-15T19:33:13.777 に答える
4

ブランチをチェックアウトして実行するだけです:

  git reset --hard **SHA-OF-F'**

これにより、ブランチからMand D-が削除されます。F

于 2013-06-11T23:59:18.197 に答える