Git rebase A-B-C-D:父母A有孩子B和孩子C,B& C都是D的父母

时间:2011-12-06 04:47:53

标签: git parent-child rebase

我有一棵看起来如下的树

  B
 / \
A   D
 \ /
  C

B和C不冲突。我想要的是它在我的历史中显示为A-B-C-D。

我怎样才能在git中执行此操作?我搜索过但我找不到一个我认为适用的答案。我担心做出改变,因为我不想让事情变得更糟,我不知道如何撤消它(有没有办法在git中撤消最后一个git命令?)

1 个答案:

答案 0 :(得分:2)

如果您想测试一下,只需克隆您的存储库并在克隆中播放。

$ git clone your_repo test_repo
$ cd test_repo

在您的情况下,D应该只是一个合并提交,如果BC不冲突则不会包含太多。所以一个简单的rebase将起作用

$ git rebase branch_of_B branch_of_C

在空的存储库中尝试:

echo A > file1
git add file1
git commit -m A
git checkout -b B
echo B > file2
git add file2
git commit -m B
git checkout master
git checkout -b C
echo C > file3
git add file3
git commit -m C
git checkout -b merge_branch
git merge B
echo D > file4
git add file4
git commit -m D

您现在拥有此功能(运行gitk --all):

   B
  / \
 A   M - D
  \ /
   C

你在D。你可以发出

$ git rebase B
First, rewinding head to replay your work on top of it...
Applying: C
Applying: D

你离开了:

A - B - C' - D'
 \
  C

C'D'在“内容”方面与CD相同。如果要清理,可以在此示例中删除分支C,但是您必须强制它,因为这将使原始C提交悬挂。

$ git branch -D C