2017-07-25 245 views
0

我有一个git项目和稳定版本总是存储在主分支。 有一段时间我在2.0版本的单独分支v20中工作。git复制分支内容到主

现在我决定释放它并再次将所有内容复制到master分支。 我不想合并它,因为有数百个冲突的更改,并且很多文件需要手动干预。

所有我只想做一个v20分支的快照,并把它放在master而不影响旧的历史,没有rebase(所以其他用户也不会受到影响)。只是为了让它看起来像是一个新的提交,它带来了所有的变化。

开始状态:

master branch --------- v20 branch 
     |      | 
master files --------- v20 files 
     |      | 
master_history   v20_history 

目标状态:

master branch --------- v20 branch 
     |      | 
    v20 files -------- v20 files 
     |      | 
master_history   v20_history 
+ commit from v20 

有一个现有的git的方式做到这一点?

+0

@DaveNewton你的意思是'-s递归-X他们'?它不这样工作。它仍然留下很多未解决的冲突,需要人工干预。这不是一个副本。我需要我的分支的状态,但在主人。 – rush

+3

怎么样(当你在v20)'merge -s我们的主人'(而不是'-s递归-X我们'),然后,合并v20到主? – mayo

回答

3

您正在描述结果git merge -s theirswhich does not exist, and one of the main Git authors insists that it should not exist:。从这个链接引用(这些都不是我的话):

嘿,现在你有一些读数做;-)

我试着不让自己声音太消极描述-Xours-Xtheirs 在那里,但实际上我认为“他们的”更糟。这是你 怎么会丢弃你做了什么(也许是因为对方比你的黑客好得多 的解决方案),但可以更容易和更清洁 做有:

$ git reset --hard origin 

也许有人会说“但是,'合并'他们',我可以保持我所做的, 太”。重置只是放弃我所做的。

该逻辑也是有缺陷的。您可以改为:

$ git branch i-was-stupid 
$ git reset --hard origin 

,如果你真的想保持你的不良记录。

与上述“重置原产地, 丢弃或搁置失败的历史记录”相比,一个大问题是“您的进一步开发所依据的历史记录”将保留您的如果你做了“ - 他们的”,那么它就会永远不成功。希望随着时间的推移,你将成为一个更好的程序员,并且你最终可能会在你的主分支的尖端附近与世界共享价值 。但是,当 发生时,您的不能提供您的主分支被上游拉动 ,因为更广泛的世界将不会对您之前的 错误感兴趣。

您可以随时与Git的人不同意去并使用一些答案来Is there a "theirs" version of "git merge -s ours"?注意,接受的答案是不是真正的-s theirs可言。Michael R's answer,使用git read-tree--no-commit合并期间切换索引是正确的。

该方法在mayo's comment也不错,而jthill's answer到另一个SO问题也是正确的。

你的情况与上面描述的有所不同,但实际上,你可以重命名“坏”分支并将“好”分支重命名为master,然后从那里继续。任何来自你的“下游”都需要重新命名,因此需要考虑多个要点。