我通常的工作流程是创建一个专门的分支来跟踪上游项目。您可以在该分支上挑选您想要的内容并创建拉取请求,而不会使模板与您的项目细节混淆。
首先,继续 fork aurelia/skeleton-navigation,这样您就可以通过 Github 的 GUI 轻松发出拉取请求。
在名为skeleton-typescript的新文件夹中使用名为upstream 的远程项目克隆您的项目分支
git clone -o upstream git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git skeleton-typescript
cd skeleton-typescript
重命名主分支。
git branch -m asmaster
为skeleton-typescript 创建一个新的存储库
提示:您可以在命令行中使用Github's API 和curl 之类的东西直接执行此操作
curl --data '{"name":"skeleton-typescript"}' -u YOUR_GITHUB_USERNAME https://api.github.com/user/repos
添加遥控器。
git remote add origin git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git
将 repo 拆分为一个子树 (see source code for man page),其中将包含一个新树,其中包含 prefix 目录中文件的所有提交历史记录。
git subtree split --prefix=skeleton-typescript
这将打印出一个提交 ID,即子树的 HEAD。
539d913a8cf9b34b644273b5cdb480359553247c
从该提交创建您的主分支。
git checkout -b master 539d913a8cf9b34b644273b5cdb480359553247c
推送并跟踪您的新存储库。
git push -u origin master
向后移植
在skeleton-typescript上提交一些工作
echo "notable contribution" >> file.txt
git add .
git commit -m "backport test commit"
git push origin master
检查上游超级项目分支,并挑选子树提交。
git checkout asmaster
git cherry-pick -x --strategy=subtree master
git push upstream asmaster:master
现在您可以从上游分支YOUR_GITHUB_USERNAME/skeleton-navigation:master 分支向他们的aurelia/skeleton-navigation:master 分支发出拉取请求。
更新中
现在,毫无疑问,您的上游 (aurelia/skeleton-navigation:master) 将会更新,其中将包括对子树的 skeleton-typescript 文件夹的更新。
添加另一个遥控器以跟踪原始项目。
git remote add upupstream git@github.com:aurelia/skeleton-navigation.git
请注意,您现在在本地存储库中有 3 个遥控器。
git remote -v
origin git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git (fetch)
origin git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git (push)
upstream git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git (fetch)
upstream git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git (push)
upupstream git@github.com:aurelia/skeleton-navigation.git (fetch)
upupstream git@github.com:aurelia/skeleton-navigation.git (push)
下拉更新。
git checkout asmaster
git pull upupstream master
再次拆分子树并获取 HEAD 提交。
git subtree split --prefix=skeleton-typescript
095c0c9f7ed06726e9413030eca4050a969ad0af
切换回子项目。
git checkout master
如果您从未向后移植更改,那么git subtree split 的一个显着属性是您将拥有完全相同的哈希提交历史记录,因此您可以在不重写历史记录的情况下快速向前合并。来自the docs:
完全相同的历史记录的重复拆分保证是相同的(即产生相同的提交 ID)。因此,如果您添加新提交然后重新拆分,新提交将作为提交附加到您上次生成的历史记录之上,因此 git merge 和朋友将按预期工作。
git merge 095c0c9f7ed06726e9413030eca4050a969ad0af
但是,如果您已经反向移植了精心挑选的更新,或对子树历史的任何其他更改,那么您需要重新设置更改,否则您将有重复的提交。
git rebase 095c0c9f7ed06726e9413030eca4050a969ad0af