Git 如何将主控文件合并到项目中,放弃所有项目提交?
我有(或打算有!)这样的回购协议:Git 如何将主控文件合并到项目中,放弃所有项目提交?,git,Git,我有(或打算有!)这样的回购协议: Master *-----*--*----------C--- \ \ Project1 \-*-------A----B----M2---A'--B'--- \ \ \ Project2 \----------*---M1------------M2--- 我希望合并M2,但我希望A和B被完全忽略。然后,如有必要,我将手动(例如,c
Master *-----*--*----------C---
\ \
Project1 \-*-------A----B----M2---A'--B'---
\ \ \
Project2 \----------*---M1------------M2---
我希望合并M2,但我希望A和B被完全忽略。然后,如有必要,我将手动(例如,cherry pick)重新创建A'和B',并将其置于主控器的新更改之上
Project2基于Master,但合并了Project1的更改
预期结果:
git merge-s recursive-X thethers master
问题在于,如果发生冲突,它只会选择thethers
。因此,如果a中的变化不冲突,它将出现在M2,这意味着a'将不完整git还原B..A;git merge C
这会起作用,但会给我留下一段混乱而漫长的历史git merge-s我们的
,但似乎没有git merge-s他们的
我会反对你的计划——你是在愚弄吉特。吉特不喜欢被愚弄。你也在“伪造”你的历史。M2、A'和B'都应该是一个提交—合并 但如果您想继续,请执行以下操作:
git merge --no-commit C
rm -rf *
git checkout C .
git commit
如果要保留任何被忽略的文件,请在rm
之前对其进行备份,然后进行恢复
或者,你也可以这样做(实际上更干净)
这可以通过“管道”命令完成:
$ git checkout Project1
$ git diff HEAD..master | patch -p1
$ git add -A .
$ git commit-tree `git write-tree` -p master -p Project1 \
-m "Merge to clean Master at v1.2"
0c5290081989cc28ff3977fbfe3951db7b7778b0
$ git reset --hard 0c5290081989cc28ff3977fbfe3951db7b7778b0
git diff HEAD..master
将告诉我如何在一个大补丁中从我现在的位置(B)和我想要的位置(C),补丁当然会应用它
git add-A。
将把工作树中的所有更改添加到索引中
然后,我们用下一行为它创建一个合并提交:git write tree
从索引创建一个新的树对象,并将其SHA1作为参数输出到git commit tree
,这将为它创建一个提交,它有两个父级,当前的项目头1(B)和主级(C),给它一个合适的信息
Git将创建提交对象,但不会更新任何分支以使用此提交。最后一行告诉git,我们希望将当前的分支Project2提前(快进)到它生成的commit SHA1
如果需要,您可以从那里重新创建(例如,可以尝试使用cherry pick)修补程序A'和B'。如果您想要“C的相同副本”,为什么不删除您的Project2文件夹,然后
git clone;git checkout C
?我希望分支项目1顶端的树与C处的树相同。我不希望将任何文件复制到新的repo中(克隆就是这样做的)。问题是如何将project1分支中树的状态提升到与主分支中给定提交相同的点。感谢您的回答。我不认为我在愚弄git(它本身就是愚蠢的)。我正在指导它正确的合并方式(由我决定),就像它遇到冲突时一样。你的第一个答案很有魅力(第三次尝试,但以超然的头脑结束)。我已经发布了另一个答案,我认为它避免了.Git忽略文件的问题,并且省去了相当可怕的rm-rf*
。Git确实不关心很多事情。但git希望它的历史是真实的。添加假合并通常会带来麻烦。合并提交应该包含来自两个分支的所有更改,而您的分支没有。
$ git checkout Project1
$ git diff HEAD..master | patch -p1
$ git add -A .
$ git commit-tree `git write-tree` -p master -p Project1 \
-m "Merge to clean Master at v1.2"
0c5290081989cc28ff3977fbfe3951db7b7778b0
$ git reset --hard 0c5290081989cc28ff3977fbfe3951db7b7778b0