代码之家  ›  专栏  ›  技术社区  ›  SamGoody

如何使用git-rebase重新排序/合并提交?

  •  6
  • SamGoody  · 技术社区  · 16 年前

    在与Rebase玩了几个小时之后,回购协议看起来仍然不同于我需要的:

    我想完成以下任务:
    [在我开始捣乱钢筋之前,其中一些还行:(]

    • 将顶部提交(“已删除无关内容…”)移动到分支关闭之前(在“修复226”的正上方)。
    • 合并“twist/main”分支中的两个提交。“comma”和“moved loaded…”应该是相同的commit,我根本不需要“comma”的commit消息。
    • 将新组合的“move-loaded”提交合并到“backup”分支中,并去掉“twist”。
    • 将“master”移到它现在显示“backup”的位置。
    • “远程/起源/主控”标签是什么意思?

    我知道这要求很多,但请包括实际的git命令。

    我不介意自己阅读和尝试,但结果与我的预期不符,我有点困惑,我真的不想意外地破坏任何提交。

    我想完成以下任务:
    [在我开始捣乱钢筋之前,其中一些还行:(]

    • 将顶部提交(“已删除无关内容…”)移动到分支关闭之前(正上方的“修复为226”)。
    • 合并“twist/main”分支中的两个提交。“comma”和“moved loaded…”应该是相同的commit,我根本不需要“comma”的commit消息。
    • 将新组合的“move-loaded”提交合并到“backup”分支中,并去掉“twist”。
    • 将“master”移到它现在显示“backup”的位置。
    • “远程/起源/主控”标签是什么意思?

    enter image description here

    我知道这要求很多,但请包括实际的git命令。

    我不介意自己阅读和尝试,但我有点困惑的结果不符合我的预期,我真的不想意外地破坏任何承诺。

    3 回复  |  直到 12 年前
        1
  •  8
  •   CB Bailey    16 年前

    首先,重新订购 backup 承诺。

    # Safety, should be a no-op if your gitk snapshot is accurate
    git checkout backup
    
    # Temporary branch
    git branch backup-save backup
    
    # Move top commit onto 'Fix for #226:
    git rebase --onto origin/master HEAD^
    
    # Go back to saved branch's parent (i.e. without the moved commit)
    git reset --hard backup-save^
    
    # Rebase onto the moved commit (HEAD@{1} is where HEAD was 1 step
    # ago i.e. before the reset.)
    git rebase HEAD@{1}
    
    # Don't need the saved branch any more (although you might want
    # to keep it for a bit just in case). This deletes it:
    git branch -D backup-save
    

    在twist上合并两个提交,忽略顶部提交消息。

    git checkout twist
    
    git reset --soft HEAD^
    
    # Just re-save the commit message, alternatively to skip the
    # editor step do this: git commit --amend -C HEAD
    git commit --amend
    

    合并 twist 分为 备份 ,取下扭枝。

    git checkout backup
    git merge twist
    git branch -d twist
    

    移动 master . 有多种花哨的方式,但这是最简单的。我假设你想要 主人 指向编辑的 备份 位置,而不是它原来的位置。

    git checkout master
    git reset --hard backup
    

    remote/origins/master 是远程跟踪分支,并告诉您 主人 远程存储库中的分支 origin 是,或者更确切地说是你最后一次提、推或拉的时候。

        2
  •  6
  •   BenMorel Manish Pradhan    12 年前

    如何不害怕

    我想告诉你,无论你搞得多么糟糕,承诺永远不会被摧毁,你总能回到你开始的地方。

    我做了一棵人造吉特树,它的形状和你描述的一样:

    我现在要清除“备份”分支的最后三个提交:

    $ git log --oneline
    9b41f46 Removed extraneous whitespace
    981e2e8 Merged the "loadscripts" function
    005bc62 Pick up a few very fringe cases
    07e71d9 Merged "getDepsForScript" function
    ...
    $ git reset --hard HEAD~3
    HEAD is now at 07e71d9 Merged "getDepsForScript" function
    $ git log --oneline
    07e71d9 Merged "getDepsForScript" function
    ...
    

    哦,那太糟糕了。让我们回到我们开始的地方。首先看看我们做了什么:

    $git reflog
    07e71d9 HEAD@{0}: HEAD~3: updating HEAD
    9b41f46 HEAD@{1}: commit: Removed extraneous whitespace
    ...
    

    你可以看到,当我们重新设置时,Git所做的就是指向那个旧的提交。但实际上并没有丢失任何承诺——它们只是成为了孤儿,而不是任何分支的一部分。让我们再次将它们作为“备份”分支的一部分:

    $ git reset --hard 9b41f46
    HEAD is now at 9b41f46 Removed extraneous whitespace
    $ git log --oneline
    9b41f46 Removed extraneous whitespace
    981e2e8 Merged the "loadscripts" function
    005bc62 Pick up a few very fringe cases
    07e71d9 Merged "getDepsForScript" function
    ...
    

    Git意味着不必说对不起。

    *松散的物体最终会被垃圾收集起来,但至少要到两周大。

    如何做你想做的。

    首先,让我们结合master中的两个提交:

    $ git checkout master
    $ git rebase -i HEAD~2
    

    Git会启动你的编辑器。改变这一点:

    pick 6389f4e Moved "loaded" function out of "require".
    pick 41fb646 comma
    

    对此:

    pick 6389f4e Moved "loaded" function out of "require".
    s 41fb646 comma
    

    并保存。Git将再次启动您的编辑器。改变这一点:

    # This is a combination of two commits.
    # The first commit's message is:
    
    Moved "loaded" function out of "require".
    
    # This is the 2nd commit message:
    
    comma
    

    对此:

    Moved "loaded" function out of "require".
    

    并保存。

    现在,让我们重新排序“备份”中的提交:

    $ git checkout backup
    $ git rebase -i remotes/origin/master
    

    当您的编辑器弹出时,请更改:

    pick ec7f71c moved "loaded" function out of "require"
    pick 4a76897 Replaced maploaded event
    pick 07e71d9 Merged "getDepsForScript" function
    pick 005bc62 Pick up a few very fringe cases
    pick 981e2e8 Merged the "loadscripts" function
    pick 9b41f46 Removed extraneous whitespace             <-----
    

    为此:

    pick 9b41f46 Removed extraneous whitespace             <-----
    pick ec7f71c moved "loaded" function out of "require"
    pick 4a76897 Replaced maploaded event
    pick 07e71d9 Merged "getDepsForScript" function
    pick 005bc62 Pick up a few very fringe cases
    pick 981e2e8 Merged the "loadscripts" function
    

    并保存。

    现在,cherry选择合并的“moved loaded”提交从master提交到当前分支(“backup”)。

    $git cherry-pick master
    

    使主控点指向与“备份”相同的提交

    $git checkout master
    $git reset --hard backup
    

    把扭枝去掉

    $git branch -D twist
    
        3
  •  0
  •   jkp    16 年前

    这里有很多你想要实现的事情,但是从图表中我们不清楚你到底需要什么,但是下面的提示可能会有所帮助:

    • 我不想移动您的分支,而是先将您在该分支上所做的提交合并起来,然后将最终提交应用到主分支,因为这最终是您的目标。此时您可能需要解决一些冲突,但无论如何您都必须解决这些冲突。有关如何实现这一点的信息,请参阅下面的两个提示。

    • 要将两个承诺结合起来,您可以执行 interactive rebase .

    • 从一个分支中选择一个提交并将其应用到另一个分支,同时在目标分支上使用 git cherry-pick . 可以使用删除旧分支 git branch -D twist 做完之后。

    希望这些建议能帮助你实现目标。