まず、図を再描画します。
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