Git 提交的回购范围内的重新基准

Git 提交的回购范围内的重新基准,git,commit,rebase,git-amend,Git,Commit,Rebase,Git Amend,考虑这一行提交 foo: a => b => c => d \bar: => e => f => g 我从分支foo开始,偶尔从foo创建新的分支bar。现在,当我在branchbar中进行commith时,我意识到我在commitc中犯了一个错误。因此,我运行git-rebase并打开commitc进行编辑。我进行更改,将其暂存并运行git-rebase——继续 现在,我的bar分支已更新。但是,foo分支仍然指

考虑这一行提交

foo: a => b => c => d
                      \bar: => e => f => g
我从分支
foo
开始,偶尔从
foo
创建新的分支
bar
。现在,当我在branch
bar
中进行commit
h
时,我意识到我在commit
c
中犯了一个错误。因此,我运行
git-rebase
并打开commit
c
进行编辑。我进行更改,将其暂存并运行
git-rebase——继续

现在,我的
bar
分支已更新。但是,
foo
分支仍然指向commit
c
的原始缺陷版本

是否有一种运行repo范围的重基的方法,在这种方法中,所有包含指向特定提交的指针的分支都被标识并重基,一次一个


我知道手动方法——重新设置foo的基址并插入/选择新的SHA,但这需要我知道哪些分支引用提交。而且它需要人工。

我认为您误解了git中分支的工作方式。它们不是完整的历史记录,只是指向单个提交的指针。也就是说,
foo
实际上只是
d
的同义词,
bar
g
的同义词。对
bar
重定基址不会以任何方式影响
foo

如果要将foo设置为新的
d
(我们称之为
d'
),只需执行以下操作:

git checkout foo
git reset --hard d'
以下是一个基于您的示例:

a <- b <- c <- d <- e <- f <- g
               ^              ^
               |              |
              foo            bar
您只需使用上述
reset
命令将
foo
指向
d'

  a <- b <- c' <- d' <- e' <- f' <- g'
                  ^                 ^
                  |                 |
                 foo               bar

a我不一定要这么做,也许我同时在
foo
中添加了commit
I
。如果分支只是指向某些提交的指针,为什么两个分支可以有不同的提交字符串?考虑分支1 <代码> A->B-> C1->D < /代码>和分支2 <代码> A- > B-> C2-> D < /代码>。在本例中,branch1和branch2指向同一个提交,
d
,但在branch1中,上一次提交是
c1
,由于重新基址,branch2将
c2
作为上一次提交。如果您将
i
添加到
foo
,则需要如您所述重新基址。每个提交都有一个对其父提交的引用-箭头的方式是向后的。让我在回答中解决这个问题,它可能更有意义。不可能有
a条提交
d'
与foo提交
d
完全相同-你是说它们会成为不同的提交吗?是的。它们成为单独的一部分。这就是重定基址所做的——编辑历史。您会注意到提交散列发生了变化
d'
d
不同-它有不同的父项。我刚刚做了一个测试,你是对的。我以前从未注意到这一点。谢谢你的解释。但我想这也意味着,即使commit d和d'在更改方面相同,它们的哈希值也不同,因此git无法推断编辑
d'
也意味着编辑
d
  a <- b <- c' <- d' <- e' <- f' <- g'
                  ^                 ^
                  |                 |
                 foo               bar