我开始学习git 1.8.2中的子树合并。我创建了一个简单的示例来测试将第三方repo迁移到主项目中的更改。
我正在遵循6.7 Git工具-子树合并的示例。
'sub'项目包含在'main'项目的子目录中。
在对'sub'项目进行更改后,当我尝试将更改合并到'main'项目中时,git报告冲突。
测试摘要:
1. 创建项目'main'和'sub'的repos(用'sub'代替rack)。 2. 添加名为sub_remote的远程到main,指向sub。 3. 使用sub_branch跟踪sub_remote。 4. 更改并提交'sub'项目中的一行文件。 5. 将更改从sub拉到main/sub_branch。 6. 将main/sub_branch合并到main/master。
合并失败并出现冲突。合并程序不确定要保留哪个版本的更改行。
我正在遵循6.7 Git工具-子树合并的示例。
'sub'项目包含在'main'项目的子目录中。
在对'sub'项目进行更改后,当我尝试将更改合并到'main'项目中时,git报告冲突。
测试摘要:
1. 创建项目'main'和'sub'的repos(用'sub'代替rack)。 2. 添加名为sub_remote的远程到main,指向sub。 3. 使用sub_branch跟踪sub_remote。 4. 更改并提交'sub'项目中的一行文件。 5. 将更改从sub拉到main/sub_branch。 6. 将main/sub_branch合并到main/master。
合并失败并出现冲突。合并程序不确定要保留哪个版本的更改行。
<<<<<<< HEAD
main
=======
main upstream change
>>>>>>> sub_branch
main.git
sub
sub.git
tm
完整的测试脚本
#!/bin/sh
# initialize empty repos
for i in main sub
do
rm -rf $i{,.git}
mkdir $i.git
cd $i.git;
git --bare init;
cd ..;
git clone $i.git
cd $i
echo $i > readme.md
git add readme.md
git commit -a -m "added readme.md"
git push origin master
cd ..
done
# add data to sub
ls > sub/data
cd sub
git add data
git commit -m "Added data"
git push origin master
cd ..
# add sub as a sub-tree in main
cd main
git remote add sub_remote ../sub.git
git fetch sub_remote
git checkout -b sub_branch sub_remote/master
git checkout master
git read-tree --prefix=sub/ -u sub_branch
git commit -m "Added sub"
git push origin master
cd ..
# make change to sub
cd sub
sed -i -e 's/main$/main upstream change/' data
git commit -a -m "upstream change made to data"
git push origin master
cd ..
# merge sub change to main
cd main
git checkout sub_branch
git pull
#merge sub_branch changes into master
git checkout master
git merge -s subtree sub_branch
cat sub/data
git merge -s subtree
命令能够更好地工作。请参见我的下面的答案。 - VonC