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 菜鸟(。

我的第一个问题是:

是否可以不dev合并到vender中并不断更新(我想这样做会显示仅包含第三方更新提交的vender日志(

现在,在这一点上,我有一个非常肮脏的vender分支 - 它包含我在dev中所做的所有提交,与第三方代码无关。我现在应该怎么做才能vender分支正确显示与第三方更新相关的提交?

是的,您不应该将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中。

在这一点上,使用 GitX 或 gitk 来确保您的历史记录看起来合理也可能是一个好主意。请在执行此操作之前进行备份,以防万一:)

或者,对于步骤 3.9. ,如果您尚未将这些更改中的任何内容推送回服务器(假设您有服务器(,则可以运行git reset --hard origin/vendergit reset --hard origin/dev

你做了合并而不是变基,对吗? 要清理供应商分支,您应该能够执行git reset <commit>。 如果它是穿插的(听起来有点像(,那么这将是一个令人头疼的问题。

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

最新更新