您可以dev
使用自定义合并驱动程序“ keepTheirs”将上游分支合并到分支:
请参阅所需的“ git merge -s theirs
”,但我知道它不存在“。
在您的情况下,只.gitattributes
需要一个,keepTheirs
脚本如下:
mv -f $3 $2
exit 0
git merge --strategy=theirs
模拟#1
显示为合并,上游为第一父级。
Jefromimerge -s ours
通过在上游(或从上游开始的临时分支)上合并您的工作,然后将分支快速前进到该合并的结果来提及(在注释中)。
git checkout -b tmp origin/upstream
git merge -s ours downstream # ignoring all changes from downstream
git checkout downstream
git merge tmp # fast-forward to tmp HEAD
git branch -D tmp # deleting tmp
这具有将上游祖先记录为第一父代的好处,因此合并的意思是“吸收这个过期的主题分支”,而不是“销毁这个主题分支并将其替换为上游”。
(编辑2011):
OP在此博客文章中报告了此工作流程:
为什么我要再次?
只要我的存储库与公共版本无关,那都很好,但是从现在起,我希望能够与其他团队成员和外部贡献者一起在WIP上进行合谋,所以我想确保我的公共分支机构是对于其他人来说,可以可靠地分支和退出,即不再需要重新设置和重置我推送到远程备份的内容,因为它现在已在GitHub和Public上发布。
这样,我就可以继续进行下去了。
99%的时间我的副本将进入上游母版,因此我想工作我的母版并大部分时间推入上游。
但是每隔一段时间,wip
进入上游的资源将使我拥有的资源失效,并且我将放弃我的部分资产wip
。
那时,我想使我的主服务器与上游保持同步,但不破坏公开推送的主服务器上的任何提交点。即我想要与上游合并,最后合并更改集,使我的副本与上游相同。
那就是git merge --strategy=theirs
应该做的。
git merge --strategy=theirs
模拟#2
显示为合并,我们的为第一父级。
(由jcwenger提出)
git checkout -b tmp upstream
git merge -s ours thebranch # ignoring all changes from downstream
git checkout downstream
git merge --squash tmp # apply changes from tmp but not as merge.
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head
git commit -m "rebaselined thebranch from upstream" # make the commit.
git branch -D tmp # deleting tmp
git merge --strategy=theirs
模拟#3
这篇博客文章提到:
git merge -s ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply -R --index
git commit -F .git/COMMIT_EDITMSG --amend
有时您确实想这样做,不是因为您的历史记录中有“废话”,而是因为您想更改公共存储库中的开发基准,应避免重新基准化。
git merge --strategy=theirs
模拟#4
(同一篇博客文章)
或者,如果您想使本地上游分支保持可快速转发,则潜在的折衷办法是了解以下情况:对于sid / unstable,上游分支可以不时地进行重置/重新设置(基于最终发生的事件)您在上游项目方面的控制权)。
这没什么大不了的,使用该假设意味着将本地上游分支保持在仅需要快速更新的状态很容易。
git branch -m upstream-unstable upstream-unstable-save
git branch upstream-unstable upstream-remote/master
git merge -s ours upstream-unstable
git diff --binary ref-to-be-merged | git apply -R --index --exclude="debian/*"
git commit -F .git/COMMIT_EDITMSG --amend
git merge --strategy=theirs
模拟#5
(由Barak A. Pearlmutter提出):
git checkout MINE
git merge --no-commit -s ours HERS
git rm -rf .
git checkout HERS -- .
git checkout MINE -- debian # or whatever, as appropriate
git gui # edit commit message & click commit button
git merge --strategy=theirs
模拟#6
(由同一位Michael Gebetsroither提出):
Michael Gebetsroither吹嘘说我在“作弊”;)并给出了另一种使用较低级管道命令的解决方案:
(如果仅使用git命令不可能,则不会是git,git中带有diff / patch / apply的所有内容都不是真正的解决方案;)。
# get the contents of another branch
git read-tree -u --reset <ID>
# selectivly merge subdirectories
# e.g superseed upstream source with that from another branch
git merge -s ours --no-commit other_upstream
git read-tree --reset -u other_upstream # or use --prefix=foo/
git checkout HEAD -- debian/
git checkout HEAD -- .gitignore
git commit -m 'superseed upstream source' -a
git merge --strategy=theirs
模拟#7
必要步骤可以描述为:
- 用上游替换您的工作树
- 将更改应用到索引
- 将上游添加为第二父级
- 承诺
该命令git read-tree
用另一棵树覆盖索引,从而完成第二步,并具有更新工作树的标志,从而完成第一步。提交时,git使用.git / MERGE_HEAD中的SHA1作为第二个父提交,因此我们可以填充它以创建合并提交。因此,可以使用以下方法完成此操作:
git read-tree -u --reset upstream # update files and stage changes
git rev-parse upstream > .git/MERGE_HEAD # setup merge commit
git commit -m "Merge branch 'upstream' into mine" # commit