Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 旧提交编辑后分离的分支_Git - Fatal编程技术网

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 name
ORIG_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之后什么都没做