3 回答
TA贡献1836条经验 获得超13个赞
dev
git merge -s theirs
.gitattributes
keepTheirs
mv -f $3 $2 exit 0
git merge --strategy=theirs
模拟#1
显示为合并,上游作为第一个父级。
merge -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
这样做的好处是将上游祖先记录为第一个父级,以便 合并的意思是“吸收这个过时的主题分支”,而不是“摧毁这个主题分支并将其替换为上游的分支”。.
为什么我又想要这个?
只要我的回购与公开版本无关,这一切都很好,但由于现在我想要与其他团队成员和外部贡献者一起整理WIP的能力,我想确保我的公共分支对于其他人来说是可靠的,可以支点和退出,即不再重新建立和重新设置我已经推送到远程备份的东西,因为它现在GitHub和public上。
所以这就给我留下了我该怎么做的问题。 99%的时间,我的拷贝将进入上游的主人,所以我想工作我的主人,并推动上游的大部分时间。 但偶尔,我所拥有的 wip
会因为上游的东西而失效,我会放弃我的一部分 wip
.
在这一点上,我想让我的主人回到与上游同步,但不破坏任何提交点,我的公开推动的主人。也就是说,我想要一个与上游的合并,最终与使我的副本与上游相同的变更集结束。.这就是 git merge --strategy=theirs
应该可以。
git merge --strategy=theirs
模拟#2
显示为合并,我们作为第一个父级。
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/不稳定,上游分支可以不时地被重置/重基(基于最终超出您在上游项目的控制范围内的事件)。 这并不是什么大问题,使用这种假设意味着很容易将本地上游分支保持在一个只需要快速更新的状态。
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
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
MichaelGebetsroither插嘴说我是在“作弊”;)并给出了另一个解决方案,提供了更低级别的管道命令:
(如果只使用git命令是不可能的,那么git就不是git了,使用diff/修补程序/应用的git中的所有东西都不是真正的解决方案;)
# 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
TA贡献2080条经验 获得超4个赞
$ git reset --hard origin/master
git reflog
TA贡献1773条经验 获得超3个赞
$ git fetch origin $ git merge origin/master -s recursive -Xtheirs
- 3 回答
- 0 关注
- 612 浏览
添加回答
举报