从以前的 git 分支中删除预先提交的提交
Remove prepended commits from previous git branch
在处理一个项目时,我们在分支之间切换时搞砸了同步。起初有一个功能分支 foo
,它被重新设置为 master,但是,本地 master 没有同步,所以当移动到一个新分支时,bar
,所有来自前一个分支的提交都被添加到前面也到新分支。 git 树看起来像这样:
Master => A--B--C--D--E--Merge
\-C--D--E-/-F--G--H <= Bar
Foo
我的目标是完全删除 foo
,因为它已经重新设置为 master,并且有类似的东西:
Master => A--B--C--D--E
\-F--G--H <=Bar
编辑:
看来这比我教的还乱。另外,我对 git 不是那么精通,甚至无法断定到底发生了什么。我现在将尽可能详细地介绍。
我和队友正在做一个项目。为了实现一项功能,我们创建了一个单独的分支 foo
.
A -- B <-- (master)
\
C -- D -- E <-- (foo)
完成功能后,我将 foo
重新设置为 master
。现在树看起来像这样:
A -- B -- C -- D -- E <-- (master)
需要实现新功能,因此新分支 bar
已打开。
A -- B -- C -- D -- E <-- (master)
\
F -- G -- H <-- (bar)
这一切都是我的责任。现在队友推送了他的代码,我猜他没有同步一些分支,还有一些需要合并的冲突,但最后,git 树是这样的:
A -- B -- C -- D -- E <-- (master)
\ | \
C -- D -------- M1 ------ M2 -- I <-- (bar)
\ /
F -- G -- H
其中:
- M1 声明:将
master
合并到 foo
- M2 表示:将
bar
合并到 foo
I
是新队友的提交
此外,我对M2中的消息有点困惑,因为这意味着我们最后剩下foo
,但我们的树只有bar
.
我确实按照@Mark Adelsberger 的建议尝试了 运行 git rebase master bar
,但是我在提交 C
时立即遇到了合并冲突,并且我中止了变基。根据答案,它应该自动确定这两个 C
是同一个提交,并跳过它们,但事实并非如此。
我的目标是尽可能压平树,意思是,在 bar
分支中删除 C
和 D
,并希望合并或放置 F
, G
和 H
与 M1
、M2
和 I
.
在同一行
回到问题上来,我发现我的第一个 post 缺少很多细节。希望这次编辑能澄清我面临的问题。
所以,虽然@Mark Adelsberger 的回答并没有完全解决它,但它确实为我指明了研究的方向。
做一个简单的 git rebase master bar
并没有成功,因为我 运行 在提交 C
时立即陷入冲突。这不应该发生,因为提交是重复的,应该被跳过。
但是,git rebase -i master bar
确实有帮助,因为我可以手动排除提交 C
和 D
。最重要的是,它还去掉了 M1
和 M2
,使日志变得漂亮干净。
在处理一个项目时,我们在分支之间切换时搞砸了同步。起初有一个功能分支 foo
,它被重新设置为 master,但是,本地 master 没有同步,所以当移动到一个新分支时,bar
,所有来自前一个分支的提交都被添加到前面也到新分支。 git 树看起来像这样:
Master => A--B--C--D--E--Merge
\-C--D--E-/-F--G--H <= Bar
Foo
我的目标是完全删除 foo
,因为它已经重新设置为 master,并且有类似的东西:
Master => A--B--C--D--E
\-F--G--H <=Bar
编辑:
看来这比我教的还乱。另外,我对 git 不是那么精通,甚至无法断定到底发生了什么。我现在将尽可能详细地介绍。
我和队友正在做一个项目。为了实现一项功能,我们创建了一个单独的分支 foo
.
A -- B <-- (master)
\
C -- D -- E <-- (foo)
完成功能后,我将 foo
重新设置为 master
。现在树看起来像这样:
A -- B -- C -- D -- E <-- (master)
需要实现新功能,因此新分支 bar
已打开。
A -- B -- C -- D -- E <-- (master)
\
F -- G -- H <-- (bar)
这一切都是我的责任。现在队友推送了他的代码,我猜他没有同步一些分支,还有一些需要合并的冲突,但最后,git 树是这样的:
A -- B -- C -- D -- E <-- (master)
\ | \
C -- D -------- M1 ------ M2 -- I <-- (bar)
\ /
F -- G -- H
其中:
- M1 声明:将
master
合并到foo
- M2 表示:将
bar
合并到foo
I
是新队友的提交
此外,我对M2中的消息有点困惑,因为这意味着我们最后剩下foo
,但我们的树只有bar
.
我确实按照@Mark Adelsberger 的建议尝试了 运行 git rebase master bar
,但是我在提交 C
时立即遇到了合并冲突,并且我中止了变基。根据答案,它应该自动确定这两个 C
是同一个提交,并跳过它们,但事实并非如此。
我的目标是尽可能压平树,意思是,在 bar
分支中删除 C
和 D
,并希望合并或放置 F
, G
和 H
与 M1
、M2
和 I
.
回到问题上来,我发现我的第一个 post 缺少很多细节。希望这次编辑能澄清我面临的问题。
所以,虽然@Mark Adelsberger 的回答并没有完全解决它,但它确实为我指明了研究的方向。
做一个简单的 git rebase master bar
并没有成功,因为我 运行 在提交 C
时立即陷入冲突。这不应该发生,因为提交是重复的,应该被跳过。
但是,git rebase -i master bar
确实有帮助,因为我可以手动排除提交 C
和 D
。最重要的是,它还去掉了 M1
和 M2
,使日志变得漂亮干净。