我有一个包含master
和dev
分支的git存储库。我还使用了一个供应商分支vender
来更新我的第三方库。
现在我已经进入该项目一段时间了,并且已经进行了大量的更改,并且还更新了第三方代码几次。 (我从不将自己的更改添加到第三方库,只需从源代码更新它们)
我以前做的事情是:(可能是错误的)
(dev) $ git checkout vender
(vender) $ git merge dev
(vender) $ ... update third party libraries ...
(vender) $ git commit -am '...'
(vender) $ git checkout dev
(dev) $ git merge vender
这样我首先将整个dev
合并到vender
,然后在更新vender
后,我将其合并回dev
。这样做是因为它将所有历史记录带入了与更新第三方库无关的vender
分支。 我想让我的vender
分支中的日志仅包含有关更新第三方库的提交。
我认为将dev
合并到vender
中是错误的(我假设所有代码都必须在每个分支中 - 因为我是git noob)。
我的第一个问题是:
可以不将dev
合并到vender
并继续更新(我想这样做会显示仅包含第三方更新提交的vender
日志)
现在,在这一点上,我有一个非常脏的vender
分支 - 它包含我在dev
中提交的所有提交,它与第三方代码无关。我现在该怎么办才能使vender
分支正确显示第三方更新相关提交?
答案 0 :(得分:1)
是的,您不应该将dev
合并到vender
,因为不需要。
git stash
您可能拥有的任何未保存的更改,以防万一。git reflog
查看您所做的所有更改的日志,包括更改分支等。此日志显示您已完成的所有事情,及时向后,并且是解决此问题的主要工具。git merge dev
的位置,然后从下面一行(之前)的行中获取SHA,这可能会说checkout: moving from dev to vendor
。vendor
后,运行git reset --hard <SHA>
,这会使vendor
回到原来的所有位置。git cherry-pick <SHA>
以在vender
之上重新应用该提交。vender
已全部修复,但我们仍需要返回并修复dev
。git checkout dev
git reset --hard <SHA>
,将dev放回原来的所有位置之前。git merge vender
正确地将vender
合并到dev
。此时,使用GitX或gitk来确保您的历史记录看起来合理也是一个好主意。请在执行此操作之前进行备份以防万一:)
对于步骤3.
和9.
,您可以运行git reset --hard origin/vender
和git reset --hard origin/dev
,如果尚未将任何这些更改推回服务器,假设你有一台服务器。
答案 1 :(得分:0)
你做了合并而不是转折,对吗?要清理供应商分支,您应该能够git reset <commit>
。如果它穿插(这听起来像是这样),那将是一个令人头痛的问题。
您是否有某种方法可以区分供应商分支提交和开发提交?如果是这样,您可以尝试使用交互式rebase删除错误提交。像git rebase -i <commit>
之类的东西会让你开始。