为了账号安全,请及时绑定邮箱和手机立即绑定

使一个分支类似于另一个分支的git命令

使一个分支类似于另一个分支的git命令

Git
小唯快跑啊 2019-07-09 10:42:45
使一个分支类似于另一个分支的git命令我试图把一个分支的变化,并使它回到相同的上游,它发散。这些更改都是本地的,并且已经被推送到GitHub,所以两者都没有。git reset或git rebase实际上是可行的,因为他们改变了历史,这对已经被推开的分支来说是一件坏事。我也试过git merge使用不同的策略,但它们都不能撤消本地更改,也就是说,如果我添加了一个文件,合并可能会使其他文件恢复正常,但我仍然拥有上游没有的文件。我可以在上游创建一个新的分支,但我真的想要一个合并,在修改历史方面,应用所有的更改,将分支重新与上游完全相同,这样我就可以在不破坏历史的情况下安全地推动这个变化。有这样的命令或一系列的命令吗?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以将您的上游分支合并到您的dev树枝,有一个自定义合并驱动程序“memtheir”:
见“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

这样做的好处是将上游祖先记录为第一个父级,以便合并的意思是“吸收这个过时的主题分支”,而不是“摧毁这个主题分支并将其替换为上游的分支”。.

(编辑2011年):

此工作流已在“行动纲领”的博客文章:

为什么我又想要这个?

只要我的回购与公开版本无关,这一切都很好,但由于现在我想要与其他团队成员和外部贡献者一起整理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/不稳定,上游分支可以不时地被重置/重基(基于最终超出您在上游项目的控制范围内的事件)。
这并不是什么大问题,使用这种假设意味着很容易将本地上游分支保持在一个只需要快速更新的状态。

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


查看完整回答
反对 回复 2019-07-09
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我觉得你只需要做:

$ git reset --hard origin/master

如果没有任何改变来推动上游,而您只是希望上游分支成为您的当前分支,这将做到这一点。在当地这样做是无害的。您将失去任何未被推送到主控的本地更改。

*实际上,如果您已在本地提交更改,则更改仍然存在,因为提交仍在您的git reflog,通常至少30天。


查看完整回答
反对 回复 2019-07-09
?
慕容3067478

TA贡献1773条经验 获得超3个赞

现在您可以很容易地做到这一点:

$ git fetch origin
$ git merge origin/master -s recursive -Xtheirs

这将使您的本地回购与原始同步,并保存历史记录。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 571 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信