将属于分支子目录的提交合并到master

时间:2014-12-10 23:39:24

标签: git

环顾四周后,我很惊讶这个问题已经解决了我的具体问题。

我有一个包含两个分支的存储库,其中一个分支是master分支,它也发布到远程存储库。

我的第二个分支叫preparation,我过去检查过这个分支,并做了一些提交。不幸的是,我提交了一个我不想公开宣布的子目录 但是,有一些变化,有意义被拉入掌握。这些更改仅属于preparation分支的子目录。

这是提交历史的图片。我基本上犯了错误,将更改提交到我现在不希望在preparation中拥有的分支master的子目录,也根本没有提交到远程存储库。

如何获取提交历史记录,而不是错误提交?

谢谢!

2 个答案:

答案 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

那就是说,我建议先阅读材料,然后了解你在做什么。