环顾四周后,我很惊讶这个问题已经解决了我的具体问题。
我有一个包含两个分支的存储库,其中一个分支是master
分支,它也发布到远程存储库。
我的第二个分支叫preparation
,我过去检查过这个分支,并做了一些提交。不幸的是,我提交了一个我不想公开宣布的子目录
但是,有一些变化,有意义被拉入掌握。这些更改仅属于preparation
分支的子目录。
这是提交历史的图片。我基本上犯了错误,将更改提交到我现在不希望在preparation
中拥有的分支master
的子目录,也根本没有提交到远程存储库。
如何获取提交历史记录,而不是错误提交?
谢谢!
答案 0 :(得分:2)
我不确定,但也许你只想删除一个标记为"新谈话"来自您计划合并的历史。
如果是这样,您可以使用交互式变基。要在交互式rebase期间跳过一次提交,只需将其从提交列表中删除即可。
我认为提交"新谈话"运行git log
时提交号为5。
我还假设你的回购是干净的。
这是程序。
首先创建一个名为new-preparation
的新分支(以防出现问题):
git checkout -b new-preparation preparation
现在运行交互式变基:
git rebase -i HEAD~5
Git应该在显示的最后五个修订版本中启动vim(你要放弃的版本应该位于最顶层):
pick SHA-1 - oldest of five commits - the one labelled "New talk"
pick SHA-1
pick SHA-1
pick SHA-1
pick SHA-1 - newest of five commits
删除第一行。 vim的内容应如下所示:
pick SHA-1
pick SHA-1
pick SHA-1
pick SHA-1 - newest of five commits
保存文件并退出。
Git应该修改剩下的四个提交。
你现在应该没有提交你的分支"新谈话"。
答案 1 :(得分:1)
我不认为你理解git
是如何运作的。而这正是你所描述的可怕的阴云密布。
您无法对目录或子目录进行更改。跟我说这个:改变是提交给分支机构的。
您犯的错误是将分支的使用与不相关的提交混合在一起。 git
中的分支很便宜。最佳做法是为您处理的每个功能创建branch
。
除此之外,让我们说你确实需要先前的工作才能发现需要做出这个改变,并希望它在两个地方得到修复。
这很常见,并且已经以许多不同的方式得到了解答。你需要做一个rebase-onto提交。 看看关于rebase的git book文档:http://git-scm.com/book/ch3-6.html
简而言之,您希望从某些方面提交提交,但跳过分支的共同祖先和您要合并到的地点之间的一堆提交。
在这种情况下,假设它只是一次提交,您将需要执行以下操作:
git rebase --onto origin/master HEAD~ preparation
那就是说,我建议先阅读材料,然后了解你在做什么。