git rebase留有额外的“额外”;“分行”;在未来

git rebase留有额外的“额外”;“分行”;在未来,git,git-rebase,Git,Git Rebase,我试着把一些已经推给大师的旧作品重新组合在一起。但我是唯一的开发人员,所以强制更新存储库是可以的。我从这个开始: % git log --oneline --decorate --graph --all * 4b2fec5 (HEAD -> master, tag: v6.2.5, origin/master, origin/HEAD) Version 6.2.5 - Fixed MegaMillions payout bug * b0ae8a9 (tag: v6.2.4) Version

我试着把一些已经推给大师的旧作品重新组合在一起。但我是唯一的开发人员,所以强制更新存储库是可以的。我从这个开始:

% git log --oneline --decorate --graph --all
* 4b2fec5 (HEAD -> master, tag: v6.2.5, origin/master, origin/HEAD) Version 6.2.5 - Fixed MegaMillions payout bug
* b0ae8a9 (tag: v6.2.4) Version 6.2.4 - Handles large size text
* f4763bd (tag: v6.2.3) 6.2.3
* 3f02a27 (tag: v6.2.1) Version 6.2.1
* 7703d55 (tag: v6.2.0) Updated revision
* a2c6366 Removed legacy NSNotification stuff.
* 1e3b359 Changes UITextFieldTextDidChange to use an onPost  handler.
* 35b910b Turns off the request for app store rating.
* 5c20d46 Put the detail segue back in.
* f90722d Got rid of stack view from MasterViewController
* eb34f07 Removed unnecessary null coalesce operator.
* c969126 Changed for Megamillions new payout structure.
* 2a32838 Version 6.2.0
* efb33b0 Initial commit
* 13a5b0e (tag: v6.0.1) 6.0.1 for app store
* 45ab2ba Downloads new numbers after creating a new ticket now.
* 2d60f30 Cancel button didn't have an exit segue on the master.
* 2185112 Changed to static size text for loser
* 872f408 Initial Commit
现在我想把v6.2.0标记和6.2.0版本提交之间的所有内容压缩成一个提交,所以我做了一个
git-rebase-i efb33b0
说它成功了。但现在我只剩下以下几点:

% git log --oneline --decorate --graph --all
* 0fb2623 (HEAD -> master) Version 6.2.5 - Fixed MegaMillions payout bug
* 81d3553 Version 6.2.4 - Handles large size text
* d7d7578 6.2.3
* eae8973 Version 6.2.1
* ded0fe9 Version 6.2.0
| * 4b2fec5 (tag: v6.2.5, origin/master, origin/HEAD) Version 6.2.5 - Fixed MegaMillions payout bug
| * b0ae8a9 (tag: v6.2.4) Version 6.2.4 - Handles large size text
| * f4763bd (tag: v6.2.3) 6.2.3
| * 3f02a27 (tag: v6.2.1) Version 6.2.1
| * 7703d55 (tag: v6.2.0) Updated revision
| * a2c6366 Removed legacy NSNotification stuff.
| * 1e3b359 Changes UITextFieldTextDidChange to use an onPost  handler.
| * 35b910b Turns off the request for app store rating.
| * 5c20d46 Put the detail segue back in.
| * f90722d Got rid of stack view from MasterViewController
| * eb34f07 Removed unnecessary null coalesce operator.
| * c969126 Changed for Megamillions new payout structure.
| * 2a32838 Version 6.2.0
|/
* efb33b0 Initial commit
* 13a5b0e (tag: v6.0.1) 6.0.1 for app store
* 45ab2ba Downloads new numbers after creating a new ticket now.
* 2d60f30 Cancel button didn't have an exit segue on the master.
* 2185112 Changed to static size text for loser
* 872f408 Initial Commit

我该如何摆脱那多余的“树枝”呢?基本上,看起来右边的整个分支只需要离开,这样它就只沿着主路径…并且以某种方式改变标记。

简单的回答是你不可以。(但请参见下面的例外情况。)

git rebase所做的是复制一些提交以进行新的、不同的提交,然后放弃原来的提交集,转而进行新的和改进的提交

此时出现的问题是,只有当且仅当您“在上”的分支(如
git status
中所说的
在分支主节点上
)是对这些特定提交的唯一引用时,放弃这些提交才行。如果对某些或所有原始提交有其他引用,则这些引用不会更改

如果这些引用位于其他存储库中,甚至可能尤其如此。如果您将提交推送到另一个存储库,并让另一个存储库设置它的一些引用来记住这些提交,则会发生后一种情况。这就是为什么修改或重设已经提交的git push的提交通常不是一个好的形式

(小注:引用是Git对分支和标记名的概括。有更多种类,但这两种是最常见的。分支名只是一个全名以
refs/heads/
开头的引用:名称的其余部分是分支名。因此
refs/heads/master
是分支的完整引用名。)e
master

如果大家都同意的话,这是可以做到的 如果

  • 您确定没有其他人将这些提交哈希存储在其他克隆中,或者
  • 您已经与存储了这些提交散列的其他人预先安排好,每个人都将根据需要切换所有引用
然后(并且只有那时)像这样重新设置共享提交的基础是完全可以的。要做到这一点,在将旧的、稍有缺陷的提交复制到闪亮的新提交之后,您必须找到使用旧提交的所有引用(在所有存储库副本中!),并移动它们,以便它们引用闪亮的新提交

在您的情况下,我至少计算了六(6)个此类参考:

  • 标签v6.2.0(
    refs/tags/v6.2.0
  • 标签v6.2.1
  • 标签v6.2.3
  • 标签v6.2.4
  • 标签v6.2.5
  • master
    分支到另一个Git上的
    origin
    ,您的Git将其记为您的
    origin/master
    (这是他们的
    refs/heads/master
    和您的
    refs/remotes/origin/master
  • 如果您说服他们移动其
    主机
    (例如通过强制推送),您自己的Git在
    refs/remotes/origin/master
    引用中的内存将自动更改。如果您说服他们移动所有其他五个标记,并且您移动了所有五个标记,这将消除旧提交中的所有六个名称。Git将停止向您显示旧提交,最终它们将真正执行把皮雷和垃圾收集起来

    要强制推送新的
    master
    ,您只需
    git-push--force-origin-master
    (但请稍等片刻)。这仍然使您需要逐个重新调整每个标记,以指向闪亮的新标记。每个标记都有一个不同的闪亮的新哈希ID,然后使用git push--force--tags来强制推送这些标记,并希望它们(无论“它们”在
    origin
    上的是谁)允许所有这些强制推送。您可以使用
    git push--force--tags master
    一次性推送它们


    更改其他人的引用的问题在于获取所有引用。否则,旧引用以及旧提交可能会再次困扰您。但是,如果您的Git和
    origin
    上的Git是此存储库的唯一副本,并且您可以控制这两个副本,那么您可以做任何您想做的事情。

    启动后您会得到什么ly do
    git log--oneline
    。您看到您的提交被挤压了吗?