如何使用Git rebase重新排序/组合提交?

时间:2010-01-17 08:43:08

标签: git rebase

在使用rebase玩了好几个小时后,回购仍然看起来与我需要的不同:

我想完成以下任务:
[在我开始搞乱rebase之前,其中一些是好的:(]

  • 将最高提交(“删除无关......”)移至分支关闭之前(右上方“修复#226”)。
  • 合并'twist / main'分支中的两个提交。 “逗号”和“已移动加载...”应该是同一个提交,我根本不需要提交“逗号”的提交消息。
  • 将新组合的“Move loaded”提交合并到“备份”分支中,并摆脱“扭曲”。
  • 将'master'移动到现在称为'backup'的位置。
  • “remote / origin / master”标签是什么意思?

enter image description here

我意识到这很多,但请包含实际的GIT命令。

我不介意自己阅读和尝试,但我对结果不符合我的预期感到困惑,而且我真的不想意外破坏任何提交。

3 个答案:

答案 0 :(得分:8)

首先,重新排序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

将两个提交组合在一起,忽略顶部提交消息。

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分支合并到backup,删除扭曲分支。

git checkout backup
git merge twist
git branch -d twist

移动master。有多种奇特的方式,但这是最简单的。我假设您希望master指向已编辑的backup位置,而不是原来位置。

git checkout master
git reset --hard backup

remote/origins/master是远程跟踪分支,它告诉您远程存储库masterorigin分支的分支指针在哪里,或者更确切地说是上次获取,推送或拉取的时间

答案 1 :(得分:6)

如何不害怕

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

我制作了一个与你说明的形状相同的人造git树:

我现在要从'备份'分支中删除最后三个提交:

$ 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所做的就是让HEAD指向那个旧的提交。但实际上没有任何提交丢失 - 他们只是成为孤儿,而不是任何分支的一部分。让我们再次将它们作为“备份”分支的一部分:

$ 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".

并保存。

现在让我们重新排序'backup'中的提交:

$ 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

并保存。

现在,选择合并后的“Moved loaded”提交,关闭master并进入当前分支(“backup”)

$git cherry-pick master

让master指向与“backup”相同的提交

$git checkout master
$git reset --hard backup

摆脱扭曲分支

$git branch -D twist

答案 2 :(得分:0)

您在这里尝试实现的目标很多,而且从图表中可以清楚地了解到所需要的内容,但以下指示可能有所帮助:

  • 我不会尝试移动你的分支,而是首先将你在该分支上完成的提交组合起来,然后将最终提交应用于主分支,因为这最终是你的目标。此时您可能必须解决一些冲突,但无论如何您都必须这样做。有关如何实现此目的的信息,请参阅接下来的两个提示。

  • 要合并两个提交,您可以执行interactive rebase

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

希望这些提示可以帮助您实现目标。