【问题标题】:git: updating vender branchgit:更新供应商分支
【发布时间】:2012-08-20 15:41:28
【问题描述】:

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

【问题讨论】:

    标签: git


    【解决方案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. 在日志中找到您已签出开发人员的点,这可能是您在第 3 步中找到的 SHA 之前的那个点。
    9. 在其上运行 git reset --hard <SHA> 以将 dev 放回原来的位置。
    10. git merge vendervender 正确合并到dev

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

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

    p>

    【讨论】:

    • 谢谢 - 我不完全理解你的描述,但会尝试一步一步来。我不明白的一件事是为什么我们需要重置dev 分支?另外,由于我多次将dev 合并到vender 中,因此我需要多次执行这些步骤——对吧?
    • 您需要重置 dev,因为您将 vendor 合并到 dev 中,并且此时 vendor 是基于 dev。基本上是撤销和重做你最后的`git merge vender` 行。你是什​​么意思你多次合并devvender?您只在您的命令行中显示了它。另请注意,您正在更改此处的历史记录,因此,如果您将其中任何内容推送到服务器并且其他人正在处理它,则不应执行任何此操作。
    • 不,我没有在服务器上推送,所以我可以更改历史记录。多次我的意思是,每次我想更新vender 中的第三方代码时,我都将dev 合并到vender 中。也就是我先把dev合并成vender,然后更新第三方代码。
    • @good_computer 那么,您执行了一组命令git merge dev,进行了库更改,然后多次执行git commit -am "stuff",然后返回开发并合并vender?只要您在所有这些之前重置,那可能就可以了。从那以后你有没有做其他的改变?就像对 dev 的真正提交,还是其他什么?我假设您的命令列表正是您运行的内容,如果您没有提到其他内容,事情可能要复杂得多。
    【解决方案2】:

    你做了合并而不是变基,对吗?要清理供应商分支,您应该能够执行git reset <commit>。如果是穿插的(听起来有点像),那会很头疼。

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

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2010-11-26
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2018-04-15
      • 1970-01-01
      相关资源
      最近更新 更多