我有以下情况:
clone
(Y),因为有很多人在Y上工作,我们没有rebase
但只有merge
。当我们想要将(push
)Y传递给X时,我们希望做一个rebase
以便让事情变得干净整洁问题在于,在执行rebase
时,我们会被要求执行我们在之前的merge
步骤中已经完成的所有合并。有没有解决方案,除了意味着重新进行合并的那个?
我预计它会非常简单,因为我们已经解决了冲突的合并。
答案 0 :(得分:99)
git merge --squash
现在是我首选的变基方式。如果您正在处理的分支被称为my-branch
,并且您想要从master
进行变基,那么请执行以下操作:
git checkout my-branch
git branch -m my-branch-old
git checkout master
git checkout -b my-branch
git merge --squash my-branch-old
git commit
答案 1 :(得分:79)
重新获得“干净”的历史被高估了。如果要保留历史记录,最好的方法就是进行合并而不是变换。这样,如果您需要返回修订版,它完全与您在开发期间测试的版本完全相同。这也解决了您之前解决的合并冲突的问题。
如果您不关心保留历史记录,可以从master创建一个新分支,检查它,然后执行git read-tree -u -m dev
更新您的工作树以匹配dev
分支。然后,您可以将所有内容提交到一个大提交中,并将其合并到master中。
答案 2 :(得分:10)
两个评论:
git rerere
,则可以避免合并冲突(在rebase期间),这是针对这种情况而做的。git rerere
。答案 3 :(得分:4)
您可以对分支中的所有更改进行处理,并将其放入master
中的新提交中,其中包含以下内容:
git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch
然后暂存你的文件并提交。
答案 4 :(得分:1)
关于重播合并冲突,您可以使用git rerere维护一个数据库,该数据库已解决合并冲突的方式,因此执行导致相同冲突的变基将自动为您完成繁琐的工作。 / p>
https://hackernoon.com/fix-conflicts-only-once-with-git-rerere-7d116b2cec67
git config --global rerere.enabled true
要注意的一件事是,如果您错误地解决了 问题,那么下次它也会自动为您烦恼,您可能并没有真正意识到这一点。
此处提供更多正式文档:https://git-scm.com/docs/git-rerere