【问题标题】:git proper way to fix topic after branch mergegit在分支合并后修复主题的正确方法
【发布时间】:2014-10-20 19:42:24
【问题描述】:

我是 Git 新手,目前我只使用本地存储库,但我最终会与其他开发人员分享我的工作。我试图弄清楚在将主题分支合并回主分支后修复代码的正确方法是什么。这是我所拥有的:

我的主题是在 C2 中的一个主题分支中实现的,然后合并到主分支上。对于另一个主题,master 上还有另一个提交 C5。现在我刚刚发现在 C2 中实现的功能存在问题。我应该在主题分支中将其修复为 C6,然后在主分支上再次合并吗?或者我应该摆脱主题分支,因为它已经被合并并直接在主分支中修复它?

理想情况下,我希望将 C2 和 C6 保留在一次提交中,这样当我们实现远程存储库时,我可以推送干净的历史记录。但我认为我不能因为合并而压缩 C2 和 C6。有没有办法做到这一点?

在主题合并后修复主题被认为是好的做法?

【问题讨论】:

    标签: git merge git-rewrite-history


    【解决方案1】:

    这将有助于您了解git rebase 以管理您的本地历史。例如,考虑一下这个命令历史,我认为它粗略地重现了您的情况,以及使用git rebase -i 重新排列您的本地历史的可能解决方案:

    mkdir tmpfoo
    cd tmpfoo/
    git init
    touch bar
    git add .
    git commit -am 'c1'
    git checkout -b topic
    touch baz
    git add .
    git commit -am 'c2'
    git checkout master
    touch foo 
    git add .
    git commit -am 'c3'
    git merge topic
    touch quux
    git add .
    git commit -am 'c5'
    git checkout topic 
    echo b >> baz 
    git commit -am 'c6'
    git checkout master
    git merge topic
    git log --oneline --graph --decorate --all
    *   577f974 (HEAD, master) Merge branch 'topic'
    |\
    | * 6750b0d (topic) c6
    * | 08ebbf2 c5
    * |   0cef647 Merge branch 'topic'
    |\ \
    | |/
    | * f1e6882 c2
    * | 0e19228 c3
    |/
    * 90e6149 c1
    19933  git rebase -i 90e6149
    >>edit the sequence of commits to something like the following:
    pick 0e19228 c3
    pick 08ebbf2 c5
    pick f1e6882 c2
    s 6750b0d c6
    19934  git log --oneline --graph --decorate --all
    * 0e3afe0 (HEAD, master) c2
    * 7611fb9 c5
    * 0e19228 c3
    | * 6750b0d (topic) c6
    | * f1e6882 c2
    |/
    * 90e6149 c1
    git diff ORIG_HEAD # no output here, the rebase didn't change the working tree's state
    

    【讨论】:

    • 谢谢@jonderry,这看起来像我需要的。如果我理解正确,您可以使用 rebase 交互从历史记录中删除 c4,而不是合并主题分支,而是将其留在那里,如果需要其他 rebase,以后可能会使用它?
    • 是的,如果您认为您可能需要重新安排之前的旧工作,最好离开分支一段时间,这样您就不必在 reflog 中搜索旧的部分工作。交互式 rebase 可以重新排序提交并将多个提交“压缩”成一个更大的提交。
    • 您可能想要编辑您的答案并替换您的别名为 commitcheckout
    【解决方案2】:

    嗯,我可以想到一个 hack 来做到这一点。只有当主分支包含在远程存储库中并且您始终可以从那里拉取它时,它才有效。然后您应该在本地存储库中执行以下步骤:

    1. git checkout master
    2. git reset --hard <C3> - 重置为合并提交之前的提交
    3. git checkout topic
    4. 在 C6 中做你想做的事
    5. git commit --amend - 这实际上允许您将 C6 保存在 C2 中
    6. git checkout master
    7. git pull origin master - 从远程存储库中提取您已重置的所有提交
    8. git merge topic

    请注意,只有当主分支不是您的本地分支,而是存储在远程存储库中时,您才能执行此操作。此外,这仅在您尚未将工作推送到远程存储库时才有效。

    【讨论】:

    • 听起来他没有远程仓库。
    • 我可以创建此存储库的副本并将其用作远程来实现您描述的“黑客”吗?
    • @ZuoLi,感谢您的回答。我不确定我可以直接应用它。我还更新了我的问题,我想我正在寻找的是如何处理这种情况的最佳实践。我对 Git 的经验不够,不知道我要求的是正确的方法。
    • 在这种情况下,解决方案会更加丑陋:我可以考虑从 master 创建另一个分支,例如,git branch temp,与 master 相同,然后按照我的答案执行所有操作。我们使用来自临时分支的git cherry-pick C5,而不是从原始存储库中提取。最后删除临时分支。
    • @loopkin,我真的认为最好将所有相关的东西放在同一个分支中。您说您现在正在本地存储库中工作,这意味着所有这些技巧都是可能的,并且在推送后它们在远程存储库中不会看起来难看,因为它们无法追踪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多