繁体   English   中英

git rebase在提交中留下了额外的“分支”

[英]git rebase leaves extra “branch” in the commits

我正在尝试将一些旧的提交重新压缩,这些旧的提交已经被压入高手。 我是唯一的开发人员,因此可以强制更新存储库。 我从这个开始:

% 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 on branch master )是对那些特定提交的唯一引用时,放弃这些提交才能正常工作。 如果对某些或所有原始提交有其他引用,则这些引用不会更改!

即使这些引用在其他某个存储库中,也是如此,甚至可能尤其如此。 如果您已经git push -ed将提交提交到其他存储库,并且让该其他存储库设置了一些引用来记住那些提交,则后者可能发生。 这就是为什么修改或重新设置已经git push ed的提交不是很好的形式的原因。

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

如果每个人都可以的可以做到

如果

  • 确定没有其他人将这些提交哈希存储在其他克隆中,或者
  • 您已经与其他确实保存了这些提交哈希值的其他人进行了预先安排,以便每个人都可以根据需要切换所有引用,

然后(并且只有这样) ,对这样的共享提交进行重新基准化是完全可以的。 为此,在将稍有缺陷的旧提交复制到闪亮的新提交之后,您必须找到所有使用旧提交的引用(在所有存储库副本中!),然后移动它们,以便它们引用闪亮的新提交。

就您而言,我至少算出六(6)个此类引用:

  1. 标签v6.2.0( refs/tags/v6.2.0 );
  2. 标签v6.2.1;
  3. 标签v6.2.3;
  4. 标签v6.2.4;
  5. 标签v6.2.5;
  6. Git在origin上的另一个Git上的分支master ,您的Git为您记住的那是您的origin/master (这是他们的refs/heads/master和您的refs/remotes/origin/master )。

如果您说服他们移动master (例如通过强制推动),则您的refs/remotes/origin/master参照中自己的Git内存将自动更改。 如果您说服他们移动所有其他五个标签,并且移动所有五个标签,则将消除所有这六个旧名称提交。 然后,Git将停止向您显示旧的提交,最终它们将真正过期并被垃圾回收。

要强制推送您的新master您可以git push --force origin master (但请稍等片刻)。 这样一来,您仍然可以逐个重新调整每个标签,以指向闪亮的新复制提交(每个提交都有不同的新的闪亮哈希ID),然后使用git push --force --tags强制推入这些标签 git push --force --tags ,并希望他们(谁“他们”是在origin )允许所有这些力推动。 您可以使用git push --force --tags master一次将其全部git push --force --tags master

更改其他人的参考文献的问题在于获取所有参考文献。 否则,旧的引用以及旧的提交可能会再次困扰您。 但是,如果您的Git和origin Git是此存储库的唯一副本,并且您控制了两者,则可以执行所需的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM