git rebase 在提交中留下额外的 "branch"
git rebase leaves extra "branch" in the commits
我试图将一些旧的提交重新组合在一起,这些已经被推送到 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 标记和版本 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
我如何摆脱里面多余的 "branch"?基本上看起来右边的整个分支都需要离开,所以它只沿着主要路径......并以某种方式改变标签。
简短的回答是你不会/不能。 (但请参阅下面的例外情况。)
git rebase
所做的是复制一些提交以进行新的、不同的提交,然后放弃原来的一组提交支持新的和改进的提交。
此时出现的问题是放弃这些提交工作正常当且仅当你是"on"的分支(如git status
说 on branch master
) 是对那些特定提交的 仅 引用。如果对部分或全部原始提交有其他引用,那些 引用不会改变!
即使这些引用在某些 other 存储库中,这也是正确的,或者尤其如此。如果您将提交 git push
-ed 提交到某个其他存储库并让其他存储库设置其一些引用以记住这些提交,则可能会发生后者。这就是为什么修改或变基您已经 git push
ed 的提交通常不是很好的形式。
(小注:一个reference是Git对branch和tag名称的泛化,种类比较多,不过这两个是大家最熟悉的. 分支名称只是一个引用,其 全 名称以 refs/heads/
开头:名称的其余部分是分支名称。因此 refs/heads/master
是完整的引用名称分支名称 master
.)
可以做,如果大家都可以的话
如果:
- 你确定没有其他人将这些提交哈希存储在其他一些克隆中,或者
- 您已经与其他存储了这些提交哈希的人预先安排好,每个人都将所有他们的引用切换为需要,
然后(并且只有那时) 像这样重新设置共享提交的基准是完全可以的。为此,在将旧的、有轻微缺陷的提交复制到闪亮的新提交后,您必须找到 all 引用(在所有存储库副本中!)使用旧提交,然后移动它们他们指的是闪亮的新提交。
在您的案例中,我算出至少有六 (6) 个这样的引用:
- 标签 v6.2.0 (
refs/tags/v6.2.0
);
- 标签 v6.2.1;
- 标签 v6.2.3;
- 标签 v6.2.4;
- 标签 v6.2.5;
- 分支
master
在 origin
的另一个 Git 上,你的 Git 为你记住了你的 origin/master
(那是他们的 refs/heads/master
和你的 refs/remotes/origin/master
).
如果你说服他们移动他们的 master
(例如通过强制推送),你自己的 Git 在你的 refs/remotes/origin/master
引用中的记忆将自动改变。如果您说服他们移动所有其他五个标签,并且您移动所有五个标签,那么这将消除所有这六个旧名称提交。 Git 然后将停止向您显示旧的提交,最终它们将真正过期并被垃圾收集掉。
要强制推送您的新 master
,您只需 git push --force origin master
(但请稍等片刻)。这仍然让您需要重新调整每个标签,一个一个地调整,以指向闪亮的新复制提交——每个都有一个不同的新的、闪亮的哈希 ID——然后强制推送那些 标签,与 git push --force --tags
,并希望他们("they" 在 origin
上的任何人)允许所有这些强制推动。您可以使用 git push --force --tags master
.
一次推送它们
更改其他人的参考资料的问题在于获得全部。否则旧的引用和旧的提交可能会回来困扰你。但是如果你的 Git 和 origin
上的 Git 是这个存储库的唯一副本,并且你控制了这两个,你 可以 做什么你要。
我试图将一些旧的提交重新组合在一起,这些已经被推送到 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 标记和版本 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
我如何摆脱里面多余的 "branch"?基本上看起来右边的整个分支都需要离开,所以它只沿着主要路径......并以某种方式改变标签。
简短的回答是你不会/不能。 (但请参阅下面的例外情况。)
git rebase
所做的是复制一些提交以进行新的、不同的提交,然后放弃原来的一组提交支持新的和改进的提交。
此时出现的问题是放弃这些提交工作正常当且仅当你是"on"的分支(如git status
说 on branch master
) 是对那些特定提交的 仅 引用。如果对部分或全部原始提交有其他引用,那些 引用不会改变!
即使这些引用在某些 other 存储库中,这也是正确的,或者尤其如此。如果您将提交 git push
-ed 提交到某个其他存储库并让其他存储库设置其一些引用以记住这些提交,则可能会发生后者。这就是为什么修改或变基您已经 git push
ed 的提交通常不是很好的形式。
(小注:一个reference是Git对branch和tag名称的泛化,种类比较多,不过这两个是大家最熟悉的. 分支名称只是一个引用,其 全 名称以 refs/heads/
开头:名称的其余部分是分支名称。因此 refs/heads/master
是完整的引用名称分支名称 master
.)
可以做,如果大家都可以的话
如果:
- 你确定没有其他人将这些提交哈希存储在其他一些克隆中,或者
- 您已经与其他存储了这些提交哈希的人预先安排好,每个人都将所有他们的引用切换为需要,
然后(并且只有那时) 像这样重新设置共享提交的基准是完全可以的。为此,在将旧的、有轻微缺陷的提交复制到闪亮的新提交后,您必须找到 all 引用(在所有存储库副本中!)使用旧提交,然后移动它们他们指的是闪亮的新提交。
在您的案例中,我算出至少有六 (6) 个这样的引用:
- 标签 v6.2.0 (
refs/tags/v6.2.0
); - 标签 v6.2.1;
- 标签 v6.2.3;
- 标签 v6.2.4;
- 标签 v6.2.5;
- 分支
master
在origin
的另一个 Git 上,你的 Git 为你记住了你的origin/master
(那是他们的refs/heads/master
和你的refs/remotes/origin/master
).
如果你说服他们移动他们的 master
(例如通过强制推送),你自己的 Git 在你的 refs/remotes/origin/master
引用中的记忆将自动改变。如果您说服他们移动所有其他五个标签,并且您移动所有五个标签,那么这将消除所有这六个旧名称提交。 Git 然后将停止向您显示旧的提交,最终它们将真正过期并被垃圾收集掉。
要强制推送您的新 master
,您只需 git push --force origin master
(但请稍等片刻)。这仍然让您需要重新调整每个标签,一个一个地调整,以指向闪亮的新复制提交——每个都有一个不同的新的、闪亮的哈希 ID——然后强制推送那些 标签,与 git push --force --tags
,并希望他们("they" 在 origin
上的任何人)允许所有这些强制推动。您可以使用 git push --force --tags master
.
更改其他人的参考资料的问题在于获得全部。否则旧的引用和旧的提交可能会回来困扰你。但是如果你的 Git 和 origin
上的 Git 是这个存储库的唯一副本,并且你控制了这两个,你 可以 做什么你要。