6

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

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

  • 将顶部提交(“已删除无关...”)移动到分支关闭之前(在“修复 #226”的正上方)。
  • 合并“twist/main”分支中的两个提交。“逗号”和“已加载...”应该是同一个提交,我根本不需要“逗号”的提交信息。
  • 将新组合的“移动加载”提交合并到“备份”分支,并摆脱“扭曲”。
  • 将“master”移动到现在显示“backup”的位置。
  • “远程/起源/主”标签是什么意思?

在此处输入图像描述

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

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

4

3 回答 3

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

在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将分支合并到backup中,移除扭曲分支。

git checkout backup
git merge twist
git branch -d twist

移动master。有多种花哨的方法,但这是最简单的。我假设您要master指向已编辑的backup位置,而不是原来的位置。

git checkout master
git reset --hard backup

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

于 2010-01-17T09:26:37.697 回答
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".

并保存。

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

$ 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

并保存。

现在从 master 中挑选合并的“已移动加载”提交到当前分支(“备份”)

$git cherry-pick master

使 master 指向与“备份”相同的提交

$git checkout master
$git reset --hard backup

摆脱扭曲分支

$git branch -D twist
于 2010-01-17T09:30:39.857 回答
0

您在这里尝试实现许多目标,从提供的图表中不清楚需要什么,但以下指针可能会有所帮助:

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

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

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

希望这些技巧能让您走上实现目标的道路。

于 2010-01-17T09:31:22.583 回答