假设以下git历史记录(按时间顺序排列):
master [I]------------------------[M2]---[MG]---[RV]---[MG2]
dev \---[D1]----------[D2]----------/ /
release \---[R1]-------------------------------/
I
开始。D1
创建开发分支。R1
从开发分支。D2
)。M2
)。MG
)RV
还原为-m 1
,以指定主要应被视为主线MG2
)哦不!现在,D1
中引入的更改不存在于主数据库中。我希望他们被包括在内(但我不希望D2
的更改存在)。
所以我的问题是:
MG
),是否有一个命令可以代替git revert
使用,这样当我合并释放到master {&#39}时; ll仍然有来自D1
?git merge
使用,这样当我合并释放到master中时我就可以了。仍然会有D1
?我知道我可以通过在主分支上执行git reset --hard M2
来实现此目的,但我希望尽可能避免重写历史记录。如果一个解决方案可以解释额外的“好”的可能性,那也会很棒。提交已添加到MG
和RV
之间或RV
和MG2
之间的主分支。
答案 0 :(得分:1)
建议的解决方案here(搜索ADDENDUM)是重新创建D1
(下面的D1'
)的替代方案,以便以后的合并不会忽略其内容:
git checkout dev
git rebase --no-ff I
这应该导致:
dev /---[D1']---------[D2']
master [I]------------------------[M2]---[MG]---[RV]---[MG2]
\---[D1]----------[D2]----------/ /
release \---[R1]-------------------------------/
您还需要重新创建release
分支,以便从D1'
开始,然后将其合并到master:
git checkout release
git rebase D1'
git checkout master
git merge release
结果:
release /---[R1']---------------------------------\
dev /---[D1']---------[D2'] \
master [I]------------------------[M2]---[MG]--[RV]--[MG2]--[MG3]
\---[D1]----------[D2]----------/ /
\---[R1]-----------------------------/
当然,如果你没有推MG2
,那么之前清理可能是个好主意。这种历史很容易让人们在将来迷惑。
答案 1 :(得分:0)
我认为你可以使用git cherry-pick来解决你的错误> https://git-scm.com/docs/git-cherry-pick