2016-06-24 26 views
1

私たちのプロジェクトが始まったとき、gitをよく知らないところでリポジトリを再起動することにしました。これは、すべてのファイルを新しいリポジトリにインポートし、すべての履歴を失うことを意味しました。分割されたリポジトリからgitの履歴を復元する

今日、私はこれらの2つのリポジトリを再結合する方法があるかどうかを知りたいと思います。 "old-repo"内のファイルの履歴は、基本的に "new-repo"内のそのファイルの履歴に追加する必要があります。

これをどのように使い始めることができますか?

答えて

4

古いリポジトリからコミットを取り出し、git rebaseを使用して古いリポジトリの上に新しいリポジトリの履歴を再生することで、これを簡単に行うことができます。

まず、古いリポジトリからコミットを取得します。

git remote add old_repo <url-for-old-repo> # Add old repository as a remote 
git fetch old_repo # Fetch commits from old repo 

次に、新しいリポジトリのルートコミットと一致する古いリポジトリのコミットを見つけます。この目的にはgit logが役立ちます。 git diff <commit in old repo> <commit in new repo>を実行し、そのコマンドの出力がないことを確認することによって、コミットの内容が一致していることを確認できます。そのコマンドからの出力がある場合、その出力を生成しない古いリポジトリでコミットを見つけるまで、または古いリポジトリで同様のコミットをチェックアウトして、作業に必要な変更を加えることによって、ディレクトリ、およびコミット)。

このコミットが見つかったら、即時新しいコミットのコミットを見つけてください。これは、古いリポジトリにはない新しいの変更を導入する新しいリポジトリの最初のコミットでなければなりません。このコミットは、以前のリポジトリで見つかったコミットとともに、次のコマンドで使用します。

ラン:

git checkout master 
git rebase --onto <commit from old repo> <commit from new repo> --preserve-merges 

これは古いレポに新しいリポジトリからコミットを再生する必要があります。以前のgit diffの出力が空白だったと仮定すると、マージの競合は発生しません。コマンドが完了したら、masterブランチには古いリポジトリの履歴が含まれている必要があります。

この手順ではリポジトリの履歴を変更する必要があるため、次にリモートブランチにマスターブランチをプッシュするときは、--forceオプションを使用する必要があります。

あなたがマスター以外の他の支店を持っている場合は、新しいリポジトリにそれらを上に移動するには、上記1と同様の手順に従う必要があります:

git checkout branchname 
git rebase --onto <base on new master branch> <first commit in branch> --preserve-merges 

タグは、おそらく彼らのように、移動しないでください不変であることを意味する。タグを新しい履歴に実際に移動する場合は、How can I move a tag on a git branch to a different commit?をご覧ください。

+0

偉大な答えのためにねえ、Thx! –

関連する問題