Git 旧提交编辑后分离的分支
我创建了一个新的分支并开始工作Git 旧提交编辑后分离的分支,git,Git,我创建了一个新的分支并开始工作 Z--A--B--C (master) \-D--E (new-branch) 然后我重新设置了基础,编辑了一个旧的提交(A),同时仍然在new branch上,我的分支被分离了 Z--A--B--C (master) \-A*--B--C--D--E (new-branch) (A* -> edited commit) 如何将它们融合回以下状态 Z--A*--B--C (master) \-D--E (new
Z--A--B--C (master)
\-D--E (new-branch)
然后我重新设置了基础,编辑了一个旧的提交(A
),同时仍然在new branch
上,我的分支被分离了
Z--A--B--C (master)
\-A*--B--C--D--E (new-branch) (A* -> edited commit)
如何将它们融合回以下状态
Z--A*--B--C (master)
\-D--E (new-branch)
在错误的重新基准后,您的实际状态如下:
Z--A--B--C (master)
\-A*--B*--C*--D*--E* (new-branch)
现在,您可以使用reflog来恢复新分支的先前状态,签出正确的分支,并重新设置基础。另一方面,您将得到相同的分叉分支状态,因此
你必须给新的分行重新定基期。很可能就这么简单:
git rebase master
Git将自动跳过应用提交B*和C*,因为它们可能会以空结束(除非提交它们也接触过的代码,在这种情况下,您会遇到冲突)。如果要确保仅重新设置提交D*和E*的基础,请限制哪些提交受重新设置基础的约束,并使用--to
:
git rebase --onto master HEAD~2
HEAD~2表示C*并表示重基操作的边界,即我们将选择D*和e*并将它们应用到master上。重基错误后的实际状态如下:
Z--A--B--C (master)
\-A*--B*--C*--D*--E* (new-branch)
现在,您可以使用reflog来恢复新分支的先前状态,签出正确的分支,并重新设置基础。另一方面,您将得到相同的分叉分支状态,因此
你必须给新的分行重新定基期。很可能就这么简单:
git rebase master
Git将自动跳过应用提交B*和C*,因为它们可能会以空结束(除非提交它们也接触过的代码,在这种情况下,您会遇到冲突)。如果要确保仅重新设置提交D*和E*的基础,请限制哪些提交受重新设置基础的约束,并使用--to
:
git rebase --onto master HEAD~2
HEAD~2表示C*并表示重基操作的边界,即我们将选择D*和e*并将它们应用到master上。实际上,重基后的内容是这样的(我将拼写它们
B'
等,而不是B*
等,因为这似乎是更常见的书写方式):
这也意味着,任何之前看到你“发布”(或“宣传”)你的master
意味着任何SHA-1提交C
的人,都会认为你“重写了历史”:提交C
不再出现在图片中,也不再出现B
或A
。相反,现在master
指向C'
,它指向B'
,它指向A'
,它指向Z
当然,新分支
也是如此:它过去指向E
,但现在指向E'
另一方面,可能您并不真的想更改master
。在这种情况下,您只有两个选择:完全放弃A'
,或者在提交Z
后使用master
和新分支
让我们把每一个都作为一个小组来讨论(除了最后一个选项,这很简单:什么都不做,这就是你现在拥有的!)
要重新指向master
,有两种简单(ish)方法:
- 进入分支,然后使用
git reset
,这(在大多数操作模式下)将更改分支指向的提交:
git checkout master
git reset --hard new-branch~2 # point master to commit C'
(与git reset--hard(git reset--code>一样,在运行它之前要非常小心,因为您位于要重新设置的分支上,并且没有未保存在工作树中的数据。)
- 不在分支上时,使用
git branch-f
强制移动它:
git branch -f master new-branch~2 # point master to commit C'
如果您不想移动master
并且确实想放弃A'
并恢复旧的新分支
,有很多方法。假设您现在在上面,并且自重新基址以来没有做任何事情,那么特殊的ref nameORIG_HEAD
2将指向原始提交E
。换言之,我们可以画出一幅更完整的原始后重定基础情况图,如下所示:
D - E <-- ORIG_HEAD (copied from new-branch before rebase)
/
Z - A - B - C <-- master
\
A'- B'- C'- D'- E' <-- new-branch
D-E事实上,你在rebase后看到的是这样(我将拼写它们B'
etc,而不是B*
etc,因为这似乎是更常见的书写方式):
这也意味着,任何之前看到你“发布”(或“宣传”)你的master
意味着任何SHA-1提交C
的人,都会认为你“重写了历史”:提交C
不再出现在图片中,也不再出现B
或A
。相反,现在master
指向C'
,它指向B'
,它指向A'
,它指向Z
当然,新分支
也是如此:它过去指向E
,但现在指向E'
另一方面,可能您并不真的想更改master
。在这种情况下,您只有两个选择:完全放弃A'
,或者在提交Z
后使用master
和新分支
让我们把每一个都作为一个小组来讨论(除了最后一个选项,这很简单:什么都不做,这就是你现在拥有的!)
要重新指向master
,有两种简单(ish)方法:
- 进入分支,然后使用
git reset
,这(在大多数操作模式下)将更改分支指向的提交:
git checkout master
git reset --hard new-branch~2 # point master to commit C'
(与git reset--hard(git reset--code>一样,在运行它之前要非常小心,因为您位于要重新设置的分支上,并且没有未保存在工作树中的数据。)
- 不在分支上时,使用
git branch-f
强制移动它:
git branch -f master new-branch~2 # point master to commit C'
如果您不想移动master
并且确实想放弃A'
并恢复旧的新分支
,有很多方法。假设你现在就在这上面,而且自从rebas之后什么都没做