4

私たちのプロジェクトでは、誰かがコードのコピーを取りました。彼らは自分たちのディレクトリで新しいgitリポジトリを開始し、そこで作業を続けました。その間、メインのプロジェクトリポジトリでの作業も継続されました。これで、共通のSHA1がない2つのgitリポジトリが残ります。

A --- B --- C --- D
      |
      | Copy of code to new directory
      |
      E --- F --- G

BとEは、まったく同じファイル、フォルダーなどです。

私たちの目標は、Gitを使用して変更FとGをメインブランチ(現在はD)にマージすることです。

4

2 に答える 2

9

まず、図を再描画します。

A --- B --- C---Dマスター

         E --- F---Gコピー

まず、これらの両方を同じリポジトリに入れましょう。これには特別な手順はありませんgit fetch。両方を同じリポジトリに入れるだけです。

次に、グラフトを作成します。編集.git/info/grafts..。

<E-sha1> <B-sha1>

次に、実行git filter-branchして永続化します。

git filter-branch --tag-name-filter cat -- --all

これにより、新しい履歴、「正しい」履歴が作成されます。

A --- B --- C---Dマスター
        \
         E --- F---Gコピー

その後、マージするだけです。

デモの実施

ダイアグラムに一致する2つのリポジトリを作成し、コミットBからコピーしてコミットEを作成しました。

  • EにはSHA-1があります3aa6b69127d20ac42746c39be3c273a9d80fb706
  • BはSHA-1を持っています95b0fc836dbea7eaa0d043390df841d184af7cd5
$ git init 
$ git remote add master ../gittest 
$ git remote add copy ../gittest2 
$ git fetch master ..
リモート:オブジェクトのカウント:12、完了。
リモート:オブジェクトの圧縮:100%(7/7)、完了。
リモート:合計12(デルタ2)、再利用0(デルタ0)
オブジェクトの解凍:100%(12/12)、完了。
../gittestから
 *[新しいブランチ]マスター->マスター/マスター
$ gitcheckout-bマスターマスター/マスター
マスターからリモートブランチマスターを追跡するように設定されたブランチマスター。
すでに「マスター」に
$ gitフェッチコピー
警告:一般的なコミットはありません
リモート:オブジェクトのカウント:9、完了。
リモート:オブジェクトの圧縮:100%(6/6)、完了。
リモート:合計9(デルタ0)、再利用0(デルタ0)
オブジェクトの解凍:100%(9/9)、完了。
../gittest2から
 *[新しいブランチ]マスター->コピー/マスター
$ git log --format = oneline copy / master | テール-n1
3aa6b69127d20ac42746c39be3c273a9d80fb706 E
$ git log --format = oneline master / master
1532332fe705931babe9db04c8d84051867b52c9 D
90903c0ac8dc26649b875ee00ea39bfd7571b1fb C
95b0fc836dbea7eaa0d043390df841d184af7cd5 B
e9de90c82a32041cff3a19f8e40d4358bc4ec2caコミットA
$ git log --format = oneline master / master
bec0e7af9374e4c57cb87f3fd5b2fb2b6a3f431b G
a61e01d096e81c36bcc450afd98ca94cff909622 F
3aa6b69127d20ac42746c39be3c273a9d80fb706 E

今マージするとどうなりますか?

自動解決したいマージの競合が発生しました。

$ gitマージコピー/マスター
test.txtの自動マージ
CONFLICT(追加/追加):test.txtの競合をマージします
自動マージに失敗しました。競合を修正してから、結果をコミットします。

動作中の移植片

$ echo 3aa6b69127d20ac42746c39be3c273a9d80fb706 \
    95b0fc836dbea7eaa0d043390df841d184af7cd5> .git / info /grafts 
$ git filter-branch --tag-name-filter cat --- all
bec0e7af9374e4c57cb87f3fd5b2fb2b6a3f431b(7/7)を書き換えます
警告:Ref'refs / heads/master'は変更されていません
Ref'refs / remotes / copy/master'が書き直されました
警告:Ref'refs / remotes / master/master'は変更されていません
$ gitマージコピー/マスター
test.txtの自動マージ
「再帰的」戦略によって作成されたマージ。
 test.txt | 5 +++++
 1つのファイルが変更され、5つの挿入(+)

最終結果

$ git log --graph --oneline | 猫
*4dadb0aリモート追跡ブランチのマージ'コピー/マスター'
| \  
| * bb2fc85 G
| * be88bc5 F
| * 0816baf E
* | 1532332 D
* | 90903c0 C
| /  
* 95b0fc8 B
*e9de90cコミットA
于 2013-01-10T09:05:29.293 に答える
0

現在レポ include にいるとしますA---B---C---D

コマンドを使用して、最初に他のリポジトリをこのリポジトリに追加する必要があります。

$git remote add another_repo <git repo path>
$git fetch another_repo

次に、マージして使用できます

$git merge another_repo/master
于 2013-01-10T08:50:38.020 に答える