代码之家  ›  专栏  ›  技术社区  ›  Joe

未使用“git merge-squash master”提取更改`

git
  •  1
  • Joe  · 技术社区  · 6 年前

    我一直在用 git merge -squash master --strategy-option=theirs 在我的发布/登台分支上。它允许我(据我所知)将当前主分支的快照截取到发布分支中,但是没有所有数百个提交(每个提交都是一个新的功能/错误修复),而是将它们汇总到一个提交中(“release 20180624”和“patch 1”等),这样我就可以快速返回到一个不错的如果需要,设置释放点。

    我的问题是, git merge-squash master--strategy选项=他们的 命令,它不会带来所有的更改。我刚执行了命令, stage 分支,在编译时出错。我比较了这两个文件, master 阶段 文件不同:

    主控形状:

    ... loads of imports ...
    import { CommentsModule } from '../comments/comments.module';
    ... loads more imports ...
    import { routing } from './myjobs.router';
    import { CommentsModule } from '../comments/comments.module';
    
    @NgModule({
      imports: [
        ...
    

    这是一个简单的错误, CommentsModule 两次导入。

    阶段:

    ... loads of imports ...
    import { CommentsModule } from '../comments/comments.module';
    ... loads more imports ...
    import { routing } from './myjobs.router';
    
    @NgModule({
      imports: [
        ...
    

    为什么存在这种差异?其他的几乎都是一样的-但现在我觉得我不能真正信任这个过程。我已经注意到这几次了,通常在一个随机文件中有这样一个变化(假设没有遗漏任何东西)。这一次它被提前捕获是因为它是一个很好的编译错误——但是我可以想象还有其他更难发现的更改。我的发布和阶段分支不能准确反映我的代码库。

    我在用吗 merge -squash 不正确?

    1 回复  |  直到 6 年前
        1
  •  3
  •   torek    6 年前

    简短的回答是 git merge _ 合并 合并基础产生的变化组合在面向线的差异上起作用,不足以理解某些东西只应导入一次。没有 -X theirs --strategy-option theirs ,如果更改集不匹配,将出现合并冲突。使用 theirs 告诉Git盲目假设存在冲突的地方,应该使用“他们的”版本,但是 只影响冲突 .即使没有 他们的 这可能会失火。例如,假设您提前添加了导入:

    [your changes near the top of the file]
     some context here
    +import { CommentsModule } from '../comments/comments.module';
    

    假设他们决定在以后将这个模块包括很多行:

     different context here
    +import { CommentsModule } from '../comments/comments.module';
    

    Git现在看到了在不同地方两次添加同一行的指令,所以它做到了这一点。

    常规合并和挤压合并都执行 合并 操作。它们之间的区别就在最后,当您或Git进行最后的提交时。通过常规合并,新提交 父提交:当前提交,另一个提交传递给其ID的提交 合并分支 以下内容:

    ...--o--*--o--o--...--o   <-- yourbranch (HEAD)
             \
              o--o---...---o   <-- theirbranch
    

    变成:

    ...--o--*--o--o--...--o--M   <-- yourbranch (HEAD)
             \              /
              o--o---...---o   <-- theirbranch
    

    没有 --squash ,这变为:

    ...--o--*--o--o--...--o--S   <-- yourbranch (HEAD)
             \
              o--o---...---o   <-- theirbranch
    

    注意,“挤压合并”提交是一个普通(非合并)提交:它根本不是一个合并!常规合并提交 合并提交。(这是一个循环逻辑:合并提交只是一个至少有两个父级的提交。不过,这是这里的关键区别。除此之外,A git merge --squash 是一个普通的合并,尽管它也强制 --no-ff --no-commit (第页)