Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何将主控文件合并到项目中,放弃所有项目提交?_Git - Fatal编程技术网

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,但我希望AB完全忽略。然后,如有必要,我将手动(例如,cherry pick)重新创建A'B',并将其置于主控器的新更改之上

Project2基于Master,但合并了Project1的更改

预期结果:

  • 我希望点M2在文件方面与C相同

  • 我需要Project1有自己的线性历史,这样Project2就可以从中合并

  • 上下文:Master是Drupal的主要代码库。Project1是我用来维护特定补丁的一个分支,我希望与多个项目共享这些补丁。Project2(以及其他许多项目)与Project1合并

    我曾考虑:

  • git merge-s recursive-X thethers master
    问题在于,如果发生冲突,它只会选择
    thethers
    。因此,如果a中的变化不冲突,它将出现在M2,这意味着a'将不完整

  • git还原B..A;git merge C
    这会起作用,但会给我留下一段混乱而漫长的历史

  • git merge-s我们的
    ,但似乎没有
    git merge-s他们的

  • 我不想重设git--hard C,因为这(我认为)会破坏将Project1合并到Project2的可能性。另一种方法是将Project1重设为C,但这同样意味着我无法合并到Project2中


  • 我会反对你的计划——你是在愚弄吉特。吉特不喜欢被愚弄。你也在“伪造”你的历史。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