git:更新供应商分支

时间:2012-08-20 07:20:58

标签: git

我有一个包含masterdev分支的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分支正确显示第三方更新相关提交?

2 个答案:

答案 0 :(得分:1)

是的,您不应该将dev合并到vender,因为不需要。

  1. git stash您可能拥有的任何未保存的更改,以防万一。
  2. git reflog查看您所做的所有更改的日志,包括更改分支等。此日志显示您已完成的所有事情,及时向后,并且是解决此问题的主要工具。
  3. 在日志中找到您运行git merge dev的位置,然后从下面一行(之前)的行中获取SHA,这可能会说checkout: moving from dev to vendor
  4. 签出vendor后,运行git reset --hard <SHA>,这会使vendor回到原来的所有位置。
  5. 查找为更新第三方库所做的每次提交的日志行/ SHA,并运行git cherry-pick <SHA>以在vender之上重新应用该提交。
  6. 此时vender已全部修复,但我们仍需要返回并修复dev
  7. git checkout dev
  8. 在日志中找到您签出dev的位置,这可能是您在步骤3中找到的SHA之前的那个点。
  9. 在其上运行git reset --hard <SHA>,将dev放回原来的所有位置之前。
  10. git merge vender正确地将vender合并到dev
  11. 此时,使用GitX或gitk来确保您的历史记录看起来合理也是一个好主意。请在执行此操作之前进行备份以防万一:)

    对于步骤3.9.,您可以运行git reset --hard origin/vendergit reset --hard origin/dev,如果尚未将任何这些更改推回服务器,假设你有一台服务器。

答案 1 :(得分:0)

你做了合并而不是转折,对吗?要清理供应商分支,您应该能够git reset <commit>。如果它穿插(这听起来像是这样),那将是一个令人头痛的问题。

您是否有某种方法可以区分供应商分支提交和开发提交?如果是这样,您可以尝试使用交互式rebase删除错误提交。像git rebase -i <commit>之类的东西会让你开始。