git 变基在提交中留下额外的"branch"



我试图将一些已经推送到master的旧提交压缩在一起。我是唯一的开发人员,所以强制更新存储库是可以的。我从这个开始:

% 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标记和Version6.2.0提交之间的所有内容压缩成一个提交,所以我做了一个CCD_ 1表示成功。但现在我只剩下以下内容:

% 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中所说的on branch master)是对这些特定提交的仅引用。如果有对部分或全部原始提交的附加引用,这些引用不会更改!

如果这些引用位于某个其他存储库中,甚至可能特别如此。如果您已经git push将提交提交到其他存储库,并且其他存储库设置了一些引用来记住这些提交,则可能会发生后者。这就是为什么修改或重新建立你已经git push版的承诺通常不是一个好的形式。

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

如果每个人都同意的话,可以

如果

  • 您确信没有其他人将这些提交哈希存储在其他克隆中,或者
  • 你已经与的其他人预先安排好将这些提交哈希存储起来,每个人都会根据需要切换所有引用

然后(并且只有这样)像这样重新建立共享提交的基础是完全可以的。要做到这一点,在将旧的、有轻微缺陷的提交复制到闪亮的新提交之后,您必须找到所有使用旧提交的引用(在所有存储库副本中!),并移动它们,使它们引用闪亮的新的提交。

在你的情况下,我统计了至少六(6)个这样的参考:

  1. 标签v6.2.0(git rebase -i efb33b00)
  2. 标签v6.2.1
  3. 标签v6.2.3
  4. 标签v6.2.4
  5. 标签v6.2.5
  6. origin上的另一个Git上分支master,您的Git将其记为您的origin/master(这是他们的refs/heads/masterrefs/remotes/origin/master)

如果你说服他们移动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是此存储库的唯一副本,并且您同时控制这两个副本,则可以执行您想要的操作。

最新更新