解开GIT混乱 - 事后

时间:2016-03-16 12:16:49

标签: git git-branch

经典案例" 从这里开始" ...就像所有事情的方式一样,解体已经降临到我们的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

但我还不清楚最终答案实际上最终会让我想要尝试并看到。

如果有帮助,项目规模很小,而且没有多人积极参与,所以假设我们可以摆脱顽皮的行为,例如"改变历史"。如果这会产生影响,那么它们都生活在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

我认为,如果我能够完成这些工作而不会将宇宙劈成两半,我就可以从那里完成其余工作。

1 个答案:

答案 0 :(得分:2)

为了澄清,我将分支命名为令人兴奋的

第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

这看起来相当丑陋所有单独的樱桃选择,可能有一个更清洁的方式,但我不知道它从头顶。

挑选一切你想要掌握的东西

$ 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才能生效。 确保您在本地拥有的repo状态是您在遥控器上所需的状态,并且该遥控器不包含您在本地没有的提交。否则他们将会迷路。