git命令使得一个分支像另一个分支
我试图让一个分支有所变化,并将它带回与它分离的上游相同。 这些更改都是本地的,并且已经推送到github,所以git reset
或git rebase
都不是真正可行的,因为它们改变了历史,这对于已经推出的分支来说是一件坏事。
我也尝试过使用各种策略进行git merge
,但没有一个撤消本地更改,即如果我添加了文件,合并可能会将其他文件重新排列,但我仍然会拥有该文件,即上游不会没有。
我可以在上游创建一个新的分支,但我真的很喜欢一个合并,就修订历史而言,它适用于所有更改,以使我的分支再次与上游相同,以便我可以安全地推动该更改没有破坏历史。 有没有这样的命令或一系列命令?
您可以将您的上游分支合并到您的dev
分支,并使用自定义合并驱动程序“keepTheirs” :
请参阅“” git merge -s theirs
“需要 - 但我知道它不存在”。
在你的情况下,只需要一个.gitattributes
,而keepTheirs
脚本就像:
mv -f $3 $2
exit 0
git merge --strategy=theirs
模拟#1
显示为合并,上游为第一个父级。
Jefromi提到(在评论中) merge -s ours
的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
这有利于将上游祖先记录为第一个父代,以便合并意味着“吸收这个过时的主题分支”,而不是“销毁该主题分支并将其替换为上游” 。
(编辑2011):
OP在此博客文章中报告了此工作流程:
为什么我要再次想要这个?
只要我的回购与公共版本无关,这一切都很好,但是现在我希望能够与其他团队成员和外部贡献者合作在WIP上,我想确保我的公共分支机构因为它现在已经在GitHub上并且已经公开发布,所以可以让其他人可以分支并从中拉出来,也就是说不会再发生重置并重置我已经推送到远程备份的东西。
所以这给我留下了我应该如何继续。
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提出):
迈克尔Gebetsroither插话,声称我是“作弊”;)并提供了另一个解决方案与低级管道命令:
(它不会是混帐,如果它不可能使用git only命令,那么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 reset --hard origin/master
如果没有改变推动上游,你只是想上游分支是你当前的分支,这将做到这一点。 在本地进行此操作并不会造成伤害, 但是您将失去任何尚未推向主人的本地更改**。
**实际上,如果您在本地提交了更改,那么更改仍然存在,因为提交仍将保留在您的git reflog
,通常至少需要30天。
你现在可以很容易地做到这一点:
$ git fetch origin
$ git merge origin/master -s recursive -Xtheirs
这会让您的本地回购与原点同步,并保留历史记录。
链接地址: http://www.djcxy.com/p/41709.html上一篇: git command for making one branch like another
下一篇: How do I tell git to always select my local version for conflicted merges on a specific file?