我正在使用Aurelia骨架,其中包含用于不同目的的各种项目设置,但它更像是一个关于如何使用git执行某些操作的一般问题,如下所述.
我希望能够将GitHub框架存储库中发布的更新合并到我实际工作的项目中.你会怎么做?
目前我刚刚在skeleton-typescript项目(我正在使用)中初始化了一个新的本地存储库,并将其连接到一个私有远程仓库以推送我的更改.但是通过这种设置,我正在使用我的项目特定更改来污染父存储库(远程指向Github上的aurelia-skeleton).
由于aurelia-skeleton远程存储库通常仅用于提取变化,因此进行某种单向跟踪将是完美的.
作为第二步,如何使用这样的设置创建拉取请求将会很有趣.在这种情况下,我想使用我在子存储库中所做的更改合并到aurelia远程的fork中...
我通常的工作流程是创建一个专用分支来跟踪上游项目.您可以在该分支上挑选您想要的内容并创建拉取请求,而不会使用您的项目细节混淆模板.
首先,继续前进并分叉,aurelia/skeleton-navigation这样您就可以通过Github的GUI轻松发出拉取请求.
使用名为upstream的新文件夹中命名的远程克隆项目的forkskeleton-typescript
git clone -o upstream git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git skeleton-typescript
cd skeleton-typescript
Run Code Online (Sandbox Code Playgroud)
重命名主分支.
git branch -m asmaster
Run Code Online (Sandbox Code Playgroud)
为其创建一个新的存储库 skeleton-typescript
提示:你可以做使用命令行此项权利GitHub的API的东西,如curl
curl --data '{"name":"skeleton-typescript"}' -u YOUR_GITHUB_USERNAME https://api.github.com/user/repos
Run Code Online (Sandbox Code Playgroud)
添加遥控器.
git remote add origin git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git
Run Code Online (Sandbox Code Playgroud)
将repo拆分为子树(参见手册页的源代码),该子树将包含一个新树,其中包含prefix目录中文件的所有提交历史记录.
git subtree split --prefix=skeleton-typescript
Run Code Online (Sandbox Code Playgroud)
这将打印出一个提交ID,该ID是HEAD子树的.
539d913a8cf9b34b644273b5cdb480359553247c
从该提交创建主分支.
git checkout -b master 539d913a8cf9b34b644273b5cdb480359553247c
Run Code Online (Sandbox Code Playgroud)
推送并跟踪您的新回购.
git push -u origin master
Run Code Online (Sandbox Code Playgroud)
做一些工作 skeleton-typescript
echo "notable contribution" >> file.txt
git add .
git commit -m "backport test commit"
git push origin master
Run Code Online (Sandbox Code Playgroud)
检查上游超级项目分支,并挑选子树提交.
git checkout asmaster
git cherry-pick -x --strategy=subtree master
git push upstream asmaster:master
Run Code Online (Sandbox Code Playgroud)
现在,您可以从上游fork YOUR_GITHUB_USERNAME/skeleton-navigation:master分支向其aurelia/skeleton-navigation:master分支发出pull请求.
现在,对于上游的上游(aurelia/skeleton-navigation:master)将会有更新,其中包括对子树skeleton-typescript文件夹的更新.
添加另一个遥控器以跟踪原始项目.
git remote add upupstream git@github.com:aurelia/skeleton-navigation.git
Run Code Online (Sandbox Code Playgroud)
请注意,您现在在本地存储库中有3个遥控器.
git remote -v
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
再次拆分子树并获取HEAD提交.
git subtree split --prefix=skeleton-typescript
Run Code Online (Sandbox Code Playgroud)
095c0c9f7ed06726e9413030eca4050a969ad0af
切换回子项目.
git checkout master
Run Code Online (Sandbox Code Playgroud)
如果您从未向后移植更改,那么一个值得注意的属性git subtree split是您将拥有完全相同的哈希提交历史记录,因此您可以快速转发合并而无需重写历史记录.来自文档:
完全相同历史的重复拆分保证是相同的(即产生相同的提交ID).因此,如果您添加新提交然后重新拆分,新提交将作为提交附加在您上次生成的历史记录之上,因此git merge和friends将按预期工作.
git merge 095c0c9f7ed06726e9413030eca4050a969ad0af
Run Code Online (Sandbox Code Playgroud)
但是,如果您已经向后移植了挑选的更新或子树历史记录的任何其他更改,那么您将需要重新更改,否则您将有重复的提交.
git rebase 095c0c9f7ed06726e9413030eca4050a969ad0af
Run Code Online (Sandbox Code Playgroud)