我有一些非常混乱的git回购,我想直截了当。
在我的本地机器,bitbucket以及除一台生产机器之外的所有机器中,我都有以下历史记录:
(本地和bitbucket)
* 1a84374 (HEAD, master) message
*
*
|\
| *
| *
* |
* | ea2d82c message
|/
* ccd87f7 message
*
*
最近出现了一个问题,我不得不ssh到我的一台生产机器上并快速编写代码。想象一下非常时间关键的东西。我想因为我很仓促,我一定在那个回购中打破了一些东西。我记得做了一些改变,我猜这是错误的地方。无论如何,我将新代码保存到新分支中。在这台生产机器中,历史现在突然变得像
* db19412 (HEAD, quickfix) message
* 57f8865 (origin/master, master) Merge branch 'master' of https://bitbucket.org etc etc
|\
| * 1a84374 message
| *
| *
| |\
| | *
| | *
| * |
| * | ea2d82c message
| |/
* | 39052e5 Merge branch 'master' of https://bitbucket.org etc etc
|\ \
| |/
| * ccd87f7 message
* |
你会注意到现在有一个额外的行连接新的提交和一些更旧的提交。我想我一定是犯了一些错误。我想摆脱它,但我仍然想保留我添加的新代码(在分支quickfix中)并最终将其推送到bitbucket。即,提交db19412
应直接连接到1a84374
。
那么我如何摆脱仅仅使回购过于复杂的额外线呢?
编辑:因为这个问题围绕着撤消某些事情,我正在尝试这种方式。我尝试的一件事是经典的“撤消最后提交”。我将自己置于57f8865
并使用了git reset --hard HEAD~1
命令,希望作为第一步,我至少可以将master
带回1a84374
。这是由此产生的历史:
* db19412 (quickfix) message
* 57f8865 (origin/master) Merge branch 'master' of https://bitbucket.org etc etc
|\
| * 1a84374 message
| *
| *
| |\
| | *
| | *
| * |
| * | ea2d82c message
| |/
* | 39052e5 (HEAD, master) Merge branch 'master' of https://bitbucket.org etc etc
|\ \
| |/
| * ccd87f7 message
* |
我完全失去了。
EDIT2:我想我可以做的一件事就是将quickfix中的更改复制到我本地计算机中的新分支中,将其推送到bitbucket,然后在该生产计算机上查看搞砸的repo,以及他们从bitbucket重新克隆。但后来我什么都学不到:D
答案 0 :(得分:5)
git checkout 1a84374
git cherry-pick db19412
这会将您的quickfix添加到您想要的提交的顶部。现在这段历史可以与来自1a84374的其他作品合并。
git checkout -b branch_name
或git push HEAD:remote_branch