0

我有一个带有分支master的git 存储库。dev还有一个供应商分支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

这样,我首先将整个合并devvender,然后在更新后vender,将其合并回dev. 这样做是将所有历史记录带入vender与更新第三方库无关的分支中。我想让我的vender分支中的日志仅包含有关更新第三方库的提交。

我认为我在合并时是错误的devvender我认为所有代码都必须在每个分支中——因为我是一个 git noob)。

我的第一个问题是:

是否可以不合并devvender继续更新它(我想这样做会显示vender仅包含第三方更新提交的日志)

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

4

2 回答 2

1

是的,你不应该合并devvender因为这不是必需的。

  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 vendervender正确合并dev

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

或者对于 steps3.和,如果您还没有将任何这些更改推送回服务器9.,您可能能够运行git reset --hard origin/vender,假设您有一个服务器。git reset --hard origin/dev

于 2012-08-20T07:41:28.160 回答
0

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

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

于 2012-08-20T07:28:37.883 回答