理清 GIT 混乱 - branch/merge 一些事后提交
Untangling GIT mess - branch/merge some commits after the fact
“不要从这里开始”的经典案例...就像所有事物的方式一样,混乱已经降临到我们的 Git,树看起来像这样:
A-B-C-D master
\
E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T... exciting new stuff
而不幸的事实是,它会更好地反映如下:
P-Q failed idea
/
A-B-C-D K-L-M-N-O U-V... master
\ / \ /
\ / R-S-T oh god fix it fix it arghh
\ /
E-F-G-H-I-J exciting new stuff
为了便于标注,我们使用数字:
P-Q Branch 2
/
A-B-C-D K-L-M-N-O U-V... master
\ / \ /
\ / R-S-T Branch 3
\ /
E-F-G-H-I-J Branch 1
我发现的最接近的是这个问题:
How do I move recent (but not latest) commits to a new branch
但我不太清楚最上面的答案到底做了什么让我想试试看。
如果有帮助,项目很小并且没有多人积极参与,所以假设我们可以摆脱像"changing history"这样的顽皮行为。如果这有所不同,它们都存在于 github 服务器上,所以我们希望最终反映在该服务器上的更改不仅仅是在本地。
编辑:
好的,我会尝试更清楚地了解我想做什么。
我真的应该说:PQ 是一个死胡同的开发,被 有效地回滚了,所以按照你认为最好的方式处理!这个项目遭受了混乱的恐慌和混乱,值得一整卷 Dilbert 条带,因此 Git 树和我自己的精神健康受到了严重影响。
起点当前的树是这样的:
A-B-C-D master
\
E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T... exciting new stuff
第 1 步我想这样结束:
A-B-C-D K-L-M-N-O-P-Q-R-S-T... master
\ /
E-F-G-H-I-J Branch 1
第 2 步然后我想这样做:
P-Q Branch 2
/
A-B-C-D K-L-M-N-O-R-S-T... master
\ /
E-F-G-H-I-J Branch 1
我想如果我能在不把宇宙分成两半的情况下完成这些,我就能从那里解决剩下的问题。
为了澄清,我将分支命名为 exciting
步骤 1
来自
A-B-C-D master
\
E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T... exciting
至
A-B-C-D K-L-M-N-O-P-Q-R-S-T... master
\ /
E-F-G-H-I-J exciting
你可以
$ git checkout master
$ git cherry-pick K
$ git cherry-pick L
$ git cherry-pick M
$ git cherry-pick N
$ git cherry-pick O
$ git cherry-pick P
$ git cherry-pick Q
$ git cherry-pick R
$ git cherry-pick S
$ git cherry-pick T
所有单独的 cherry-picks 看起来都很难看,可能有更简洁的方法,但我从头到尾都不知道。
挑选好你想掌握的一切之后
$ git checkout exciting
$ git reset --hard HEAD^^^^^^^^^^ # Reset back 10 commits, HEAD~10 would also work
步骤 2
来自
A-B-C-D K-L-M-N-O-P-Q-R-S-T... master
\ /
E-F-G-H-I-J exciting
至
P-Q Branch 2
/
A-B-C-D K-L-M-N-O-R-S-T... master
\ /
E-F-G-H-I-J exciting
你可以
$ git checkout -b branch2 Q # make new branch2 at commit Q
$ git checkout master
$ git rebase HEAD~8 --interactive # 8 may not be the correct number. Pick big enough number so that P and Q are included
在弹出的编辑器中,删除代表提交 P 和 Q 的行,以将它们从 master
的历史记录中删除。他们仍然住在branch2
要将其推送到远程,您将不得不重写大部分历史记录,需要 git push --force
才能正常工作。 确保您在本地拥有的回购状态是您在远程上需要的,并且远程不包含您在本地没有的提交。否则他们会丢失。
“不要从这里开始”的经典案例...就像所有事物的方式一样,混乱已经降临到我们的 Git,树看起来像这样:
A-B-C-D master
\
E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T... exciting new stuff
而不幸的事实是,它会更好地反映如下:
P-Q failed idea
/
A-B-C-D K-L-M-N-O U-V... master
\ / \ /
\ / R-S-T oh god fix it fix it arghh
\ /
E-F-G-H-I-J exciting new stuff
为了便于标注,我们使用数字:
P-Q Branch 2
/
A-B-C-D K-L-M-N-O U-V... master
\ / \ /
\ / R-S-T Branch 3
\ /
E-F-G-H-I-J Branch 1
我发现的最接近的是这个问题:
How do I move recent (but not latest) commits to a new branch
但我不太清楚最上面的答案到底做了什么让我想试试看。
如果有帮助,项目很小并且没有多人积极参与,所以假设我们可以摆脱像"changing history"这样的顽皮行为。如果这有所不同,它们都存在于 github 服务器上,所以我们希望最终反映在该服务器上的更改不仅仅是在本地。
编辑:
好的,我会尝试更清楚地了解我想做什么。
我真的应该说:PQ 是一个死胡同的开发,被 有效地回滚了,所以按照你认为最好的方式处理!这个项目遭受了混乱的恐慌和混乱,值得一整卷 Dilbert 条带,因此 Git 树和我自己的精神健康受到了严重影响。
起点当前的树是这样的:
A-B-C-D master
\
E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T... exciting new stuff
第 1 步我想这样结束:
A-B-C-D K-L-M-N-O-P-Q-R-S-T... master
\ /
E-F-G-H-I-J Branch 1
第 2 步然后我想这样做:
P-Q Branch 2
/
A-B-C-D K-L-M-N-O-R-S-T... master
\ /
E-F-G-H-I-J Branch 1
我想如果我能在不把宇宙分成两半的情况下完成这些,我就能从那里解决剩下的问题。
为了澄清,我将分支命名为 exciting
步骤 1
来自
A-B-C-D master
\
E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T... exciting
至
A-B-C-D K-L-M-N-O-P-Q-R-S-T... master
\ /
E-F-G-H-I-J exciting
你可以
$ git checkout master
$ git cherry-pick K
$ git cherry-pick L
$ git cherry-pick M
$ git cherry-pick N
$ git cherry-pick O
$ git cherry-pick P
$ git cherry-pick Q
$ git cherry-pick R
$ git cherry-pick S
$ git cherry-pick T
所有单独的 cherry-picks 看起来都很难看,可能有更简洁的方法,但我从头到尾都不知道。
挑选好你想掌握的一切之后
$ git checkout exciting
$ git reset --hard HEAD^^^^^^^^^^ # Reset back 10 commits, HEAD~10 would also work
步骤 2
来自
A-B-C-D K-L-M-N-O-P-Q-R-S-T... master
\ /
E-F-G-H-I-J exciting
至
P-Q Branch 2
/
A-B-C-D K-L-M-N-O-R-S-T... master
\ /
E-F-G-H-I-J exciting
你可以
$ git checkout -b branch2 Q # make new branch2 at commit Q
$ git checkout master
$ git rebase HEAD~8 --interactive # 8 may not be the correct number. Pick big enough number so that P and Q are included
在弹出的编辑器中,删除代表提交 P 和 Q 的行,以将它们从 master
的历史记录中删除。他们仍然住在branch2
要将其推送到远程,您将不得不重写大部分历史记录,需要 git push --force
才能正常工作。 确保您在本地拥有的回购状态是您在远程上需要的,并且远程不包含您在本地没有的提交。否则他们会丢失。