用于使一个分支与另一个分支相似的git命令
我试着把一个有变化的分支带回来,使它与它所偏离的上游相同。这些更改都是本地的,并且已经推送到github,因此无论是用于使一个分支与另一个分支相似的git命令,git,github,branching-and-merging,Git,Github,Branching And Merging,我试着把一个有变化的分支带回来,使它与它所偏离的上游相同。这些更改都是本地的,并且已经推送到github,因此无论是git reset还是git rebase都不是真正可行的,因为它们更改了历史记录,这对于已经推送的分支来说都是一件坏事 我也尝试过使用各种策略git merge,但没有一种策略可以撤销本地更改,也就是说,如果我添加了一个文件,合并可能会使其他文件恢复正常,但我仍然拥有上游没有的文件 我可以在上游创建一个新的分支,但我真的希望合并,在修订历史方面应用所有更改,使我的分支再次与上游相
git reset
还是git rebase
都不是真正可行的,因为它们更改了历史记录,这对于已经推送的分支来说都是一件坏事
我也尝试过使用各种策略git merge
,但没有一种策略可以撤销本地更改,也就是说,如果我添加了一个文件,合并可能会使其他文件恢复正常,但我仍然拥有上游没有的文件
我可以在上游创建一个新的分支,但我真的希望合并,在修订历史方面应用所有更改,使我的分支再次与上游相同,这样我就可以安全地推动更改,而不会破坏历史。有这样一个命令或一系列命令吗?切换到远程上游分支,执行
git merge
,合并策略设置为ours
git checkout origin/master
git merge dev --strategy=ours
git commit ...
git push
所有历史记录仍将存在,但您将有一个额外的合并提交。这里最重要的是从您想要的版本开始,并将我们的
与github实际所在的分支合并。您可以使用自定义合并驱动程序“keepTheirs”
将上游分支合并到您的dev
分支
请参阅“”。
在您的情况下,只需要一个.gittattributes
,还有一个keepTheirs
脚本,如:
mv -f $3 $2
exit 0
git merge--strategy=theres
Simulation#1
显示为合并,上游为第一个父级。
(在评论中)通过将您在上游(或从上游开始的临时分支)上的工作合并,然后将您的分支快速转发到该合并的结果,提到了合并-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年编辑):
此工作流已在以下文档中报告:
为什么我还要这个
只要我的回购协议与公共版本无关,这一切都很好,但既然现在我希望能够与其他团队成员和外部贡献者就WIP进行协作,我希望确保我的公共分支是可靠的,其他人可以从中分出分支,也就是说,不再对我推送到远程备份的东西重新设置基础和重置,因为它现在在GitHub和public上
因此,这就留给我该如何继续下去。
99%的时间我的副本都会进入上游母版,所以我想在大部分时间使用我的母版并推进上游。
但是每隔一段时间,我在wip
中的东西就会因为进入上游的东西而失效,我会放弃我的wip
在这一点上,我想让我的主机恢复与上游主机的同步,但不破坏我公开推送的主机上的任何提交点。也就是说,我希望与上游合并,最终得到的变更集使我的副本与上游相同
这就是git merge--strategy=他们的
应该做的
git merge--strategy=theres
Simulation#2
显示为合并,我们作为第一个父项。
(提议人)
git merge--strategy=theres
Simulation#3
这:
有时您确实想这样做,不是因为您的历史记录中有“垃圾”,而是可能是因为您想更改公共存储库中的开发基线,在公共存储库中应该避免重定基址
git merge--strategy=theres
Simulation#4
(同一篇博文)
或者,如果您希望保持本地上游分支的快进性,一个潜在的折衷方案是,对于sid/不稳定,上游分支可以随时重置/重设基础(基于最终超出您对上游项目控制范围的事件)。这没什么大不了的,按照这个假设工作意味着很容易将本地上游分支保持在只需要快进更新的状态
git merge--strategy=theres
Simulation#5
(提议人):
git merge--strategy=theres
Simulation#6
(该委员会提议):
迈克尔·格贝特罗伊瑟插嘴说,我在“作弊”;)并给出了另一个使用低级管道命令的解决方案:
(如果只使用git命令是不可能的,那么它就不是git了,git中使用diff/patch/apply的一切都不是真正的解决方案;)
我觉得你只需要做:
$ git reset --hard origin/master
如果没有向上游推进的变化,而您只是希望上游分支成为您当前的分支,那么这将实现这一点。在本地执行此操作无害,但您将丢失所有未推送到主控的本地更改**
**实际上,如果您在本地提交了更改,这些更改仍然存在,因为提交仍将在您的
git reflog
中,通常至少持续30天。还有一种方法几乎不需要管道命令的帮助-IMHO是最简单的方法。假设您想在两种情况下模仿“他们的”:
head1=$(git show --pretty=format:"%H" -s foo)
head2=$(git show --pretty=format:"%H" -s bar)
tree=$(git show --pretty=format:"%T" -s bar)
newhead=$(git commit-tree $tree -p $head1 -p $head2 <<<"merge commit message")
git reset --hard $newhead
head1=$(git show--pretty=格式:“%H”-s foo)
head2=$(git show--pretty=格式:“%H”-s条)
tree=$(git show--pretty=格式:“%T”-s条)
newhead=$(git commit tree$tree-p$head1-p$head2您现在可以很容易地做到这一点:
$ git fetch origin
$ git merge origin/master -s recursive -Xtheirs
这将使您的本地回购协议与原始协议同步,并保留历史记录。另一个模拟将要合并的git merge-s参考:
git merge --no-ff -s ours ref-to-be-merged # enforce a merge commit; content is still wrong
git reset --hard HEAD^2; git reset --soft HEAD@{1} # fix the content
git commit --amend
双重重置的替代方法是应用反向补片:
git diff --binary ref-to-be-merged | git apply -R --index
笨手笨脚的,但见鬼,我们能做什么呢
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
$ git reset --hard origin/master
head1=$(git show --pretty=format:"%H" -s foo)
head2=$(git show --pretty=format:"%H" -s bar)
tree=$(git show --pretty=format:"%T" -s bar)
newhead=$(git commit-tree $tree -p $head1 -p $head2 <<<"merge commit message")
git reset --hard $newhead
$ git fetch origin
$ git merge origin/master -s recursive -Xtheirs
git merge --no-ff -s ours ref-to-be-merged # enforce a merge commit; content is still wrong
git reset --hard HEAD^2; git reset --soft HEAD@{1} # fix the content
git commit --amend
git diff --binary ref-to-be-merged | git apply -R --index
git reset --hard <new>
git reset --mixed <old>
git fetch origin
git reset --hard origin/<branch>
git merge origin/<branch> -s recursive -Xtheirs
git push -f <remote> <branch>