web-dev-qa-db-ja.com

あるGitリポジトリを別のGitリポジトリにリベースする方法は?

ある時点までのプロジェクトの開発を含む1つのGitリポジトリ(A)がありました。次に、このリポジトリAがオンになっていたUSBスティックを紛失しました。幸いにも、最新のコミットのバックアップがあったので、後で新しいリポジトリ(B)を作成して、最新のプロジェクトの状態をインポートし、開発を続けることができました。失われたUSBスティックを回復したので、2つのGitリポジトリーがあります。

どういうわけか、リポジトリBをリポジトリAにリベースする必要があると思いますが、その方法がわからないので、おそらくフェッチ/プルとリベースを使用しますか?

57
kroimon

AとBが同じリポジトリではない(最新の作業コピーを使用してBを作成した)場合は、 graft を使用して、それらに共通の履歴があるように見せかける必要があります。

VonCの答え に従ってAをBのリモートとして追加し、レポが次のようになっているとします。1

~/B$ git tnylog 
* 6506232 (HEAD, master) Latest work on B
* 799d6ae Imported backup from USB stick
~/B$ git tnylog A/master
* 33b5b16 (A/master) Head of A
* 6092517 Initial commit

親がAの頭であることをBのルートに伝える接木を作成します。

echo '799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060' \
 >> .git/info/grafts

これで、Bの履歴を要求すると、上記の2つの履歴が1つとして表示されます。移植片を永続化するのは簡単ですgit filter-branch引数なし。ただし、フィルタブランチの後は、どのブランチにもいないので、git branch -D master; git checkout -b master


1 git tnylog = git log --oneline --graph --decorate

62
Josh Lee

AとBが同じリポジトリである場合(最初のSHA1は共通)、次のことができます。

  • aをBのリモートとして宣言します:git remote add A /path/to/A
  • git fetch A to すべてのリモートAブランチを更新 Bリポジトリで
  • git checkout dev(Bで、開発中)
  • git rebase A/devBranchは、A/devBranch(失われた開発)の上にB(つまり、バックアップから開発または再開発したもの)を再生します。このような少し SO質問

最後のステップでは、開発者を失った開発者と同期させることができます。
しかし、実際には、Aからフェッチすると、完了です。Bには、「all」履歴(失われた履歴)が含まれていますそしてあなたの現在の仕事)

29
VonC

まず、レポAの作業用クローンを作成することから始めます。

次に、単純にBからプルしてマージします。新しいブランチを作成してそこにプルし、2つのブランチをマージすることをお勧めします。強制フラグも必要になる場合があります。私はMercurialでこのようなことを行って(明らかに無関係な2つのリポジトリを一緒に移植する)、「-f」が必要です。

2
crazyscot