如何修复和合并这个git树?

时间:2012-02-09 22:03:05

标签: git git-branch

这是我的gitk(我想从这个问题改进,谢谢@amber:Merging commits from branch to master -> odd-looking tree):

分支frontend位于左侧。您可以在右下方以黄色显示masterremotes/origin/master的提示。

gitk --all git tree
我需要做两件事,我经历过36小时的麻烦:

  1. 如何开始将frontend的提交添加到master(逐个'先添加延迟')以便我可以推送它们?我不想合并整个分支,因为涉及很多代码,并且两个分支都有工作树,我不想打扰。
  2. 我似乎在frontend周围有两个相同的“批量更新”条目,顶部/左侧没有分支。我怎样才能摆脱顶部的无分支bulk update东西,这样就有2个干净的分支?我希望看起来像这样:

    |  # frontend
    |  # Bulk update.
    |  # ...commits...
    |  # move this frontend commit to master
    |  |  #master's changes
    |  |  #master, remotes/origin/master, remotes/staging/master
    
  3. 我真的很想自己这样做,但最后一天半的挣扎表明,我输入的最微小的不准确经常会导致更多的麻烦。

1 个答案:

答案 0 :(得分:0)

您应该将问题分成两个单独的SO问题,以遵循Q& A格式。话虽如此:

  1. 结帐母版并使用git cherry-pick -e <sha>其中<sha>是您要添加到frontend的{​​{1}}中每个结帐的参考。所以你先使用master。您可以按照您想要的任何顺序进行挑选,这样您就可以按照git cherry-pick -e <sha of 'adding delay'>的不同顺序安排所需的签到frontend。请参阅http://technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches

    另一种方法是改变,但如果你不习惯这种机制,这可能比使用cherry-pick更令人困惑。我建议你首先在repo的克隆上试验这种方法。你可以随时撤消我所说的内容,但如果你已经按时间,你不想浪费时间搞清楚如何做到这一点。

    首先结帐master,然后创建一个新的分支frontend(因为您不想实际删除前端)。

    然后做tmp。这将打开一个编辑器,删除并重新排列将在主要签入后以您希望的前端分支中的任何顺序提交的签入。

    完成后git rebase -i --onto master master tmp将是您想要掌握的位置,因此结帐tmp并执行master并删除git reset --hard tmp分支tmp。< / p>

    Pro Git书中提供了有关rebase的良好信息,但我已将这些概念应用于您的用例。 http://progit.org/book/ch3-6.html

  2. 首先确保列出的批量更改实际上是重复的。您可以git branch -d tmp查看差异。如果它是相同的,那么从列表中删除它的关键是删除你在某些时候给git的存储。如果不是重复,请确保在删除存储之前决定如何处理差异。

    在分支中git diff <sha of bulk1> <sha of bulk2>,如果你真的不想要你在藏匿处保存的内容git stash pop。那时如果你重新运行你的gitk(刷新不会显示这个),你会看到左上角的那些条目被删除了。你的gitk图表显示stash已经被master索引了,所以这就是我使用stash的地方,但你最了解哪个分支git reset --hard HEADmaster,你可能想要使用它就开始了。

    您也可以使用frontend并提交您正在保存的更改,它将会消失。在你的gitk中有一个分支历史记录的唯一原因是显示git如何知道如何重新创建存储区中的差异。一旦你弹出那个藏匿处,它就会忘记藏匿的任何祖先,这就像将藏匿点重新定位到你弹出它的位置。

    如果你不需要任何东西,@ Jefromi有一个更清洁的方法来删除藏匿处,这些不是他的确切的话,但他建议:

    使用git stash pop删除所有藏匿处。你可以使用git stash clear删除那个。使用git stash drop stash@{n}查看n应该是什么。