在使用rebase玩了好几个小时后,回购仍然看起来与我需要的不同:
我想完成以下任务:
[在我开始搞乱rebase之前,其中一些是好的:(]
我意识到这很多,但请包含实际的GIT命令。
我不介意自己阅读和尝试,但我对结果不符合我的预期感到困惑,而且我真的不想意外破坏任何提交。
答案 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
是远程跟踪分支,它告诉您远程存储库master
中origin
分支的分支指针在哪里,或者更确切地说是上次获取,推送或拉取的时间
答案 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
删除旧分支。
希望这些提示可以帮助您实现目标。