Git Merge分支冲突标记解决方案

时间:2017-03-16 14:56:57

标签: git merge

我正在将一个名为temp-fix的分支合并到master分支中。目前,我正致力于解决合并冲突。我想接受来自temp-fix的所有更改。

考虑到下面的冲突标记,我怎么能这样做? 也就是说,我应该删除哪些代码以及哪些代码可以按计划运行?

<<<<<<< HEAD
/**
 * fetch  count(order_no) need to disable/grey out the departmental membership.
 */
function personify_count_departmental_membership($masterid) {
  $pdb = new PersonifyDB();
  $sql = "select count(order_no)
                  from ORDER_DETAIL (nolock)
                  where subsystem = 'MBR'
                  and ship_master_customer_id = '$masterid'
                  and cycle_begin_date <= getdate() and grace_date >= getdate()
                  and line_status_code in ('A','P')
                  and parent_product = '';

  $results = $pdb->p_query($sql);
||||||| merged common ancestors
=======
/**
 * fetch  count(order_no) need to disable/grey out the departmental membership.
 */
function personify_count_departmental_membership($masterid) {
  $pdb = new PersonifyDB();
  $sql = "select count(order_no)
                  from ORDER_DETAIL (nolock)
                  where subsystem = 'MBR'
                  and ship_master_customer_id = '$masterid'
                  and cycle_begin_date <= getdate() and grace_date >= getdate()
                  and line_status_code in ('A','P')
                  and parent_product = '';
>>>>>>> temp-fix

<<<<<<< HEAD
  return $results;
}
||||||| merged common ancestors
=======
  $results = $pdb->p_query($sql);

  return $results;
}
>>>>>>> temp-fix

3 个答案:

答案 0 :(得分:2)

合并时接受他们的。在这里,temp-fix 他们的master我们的。你可以在合并时使用他们的/我们的旗帜。

$ git checkout master
$ git reset --hard HEAD

$ git pull origin temp-fix -s recursive -X theirs # accept 'temp-fix' branch changes if conflict occurs
Or,
$ git pull origin temp-fix
$ git checkout --theirs -- .                      # checkout the files to 'temp-fix' changes

答案 1 :(得分:2)

由于您要将 temp-fix 分支合并到分支,并希望保留所有temp-fix更改,请删除&LT;&LT;&LT;&LT;&LT;&LT;&LT; HEAD 和 =======

删除以下代码:

<<<<<<< HEAD
/**
 * fetch  count(order_no) need to disable/grey out the departmental 
membership.
*/
function personify_count_departmental_membership($masterid) {
  $pdb = new PersonifyDB();
  $sql = "select count(order_no)
              from ORDER_DETAIL (nolock)
              where subsystem = 'MBR'
              and ship_master_customer_id = '$masterid'
              and cycle_begin_date <= getdate() and grace_date >= getdate()
              and line_status_code in ('A','P')
              and parent_product = '';

  $results = $pdb->p_query($sql);
||||||| merged common ancestors
=======



<<<<<<< HEAD
  return $results;
}
||||||| merged common ancestors
=======

>>>>>>> temp-fix

答案 2 :(得分:1)

解决不同的变化

当你运行git merge时,你至少在最常见的情况下 1 -telling Git尽力结合两个不同的集合变化。也就是说,无论是你,疯狂物理学家还是其他人 - 我都会从同一个代码中称他为Joe- 启动,但从那时起你们两个都做了改动。

Git的作用实质上是运行两个git diff

  1. 找出你们从哪个版本开始。我们说这是版本ba5eba5
  2. 找出您现在拥有的版本。让我们说HEAD,因为它是。temp-fix。 :-) HEAD转换为一些难以理解的哈希ID,但我们可以说&#34; HEAD&#34;。
  3. 找出 Joe 现在的版本。那个HEAD,与temp-fix一样,变成了一些难以理解的哈希ID,但我们只能说git diff ba5eba5 HEAD
  4. 运行git diff ba5eba5 temp-fix更改的内容。
  5. 运行merge.conflictStyle Joe 已更改的内容。
  6. 尝试合并更改。
  7. 他们重叠的地方 - 例如,如果您从第42行开始删除了五行,而Joe从第127行开始添加了三行 - Git只是假设正确答案是取两个更改:删除相同的五行,并将相同的三行添加到基本版本。

    他们重叠的地方,你会得到一个&#34;合并冲突&#34;。 Git使用标记将两个组的更改写入文件。如果您将diff3设置为ba5eba5,Git也会写入原始基本文件中的内容,以及&#34;合并的共同祖先&#34;。设置这个是一个好主意,因为它告诉你什么是冲突的。

    在这种情况下,您和Joe 都添加了代码,而根本没有删除任何内容。 &#34;合并共同的祖先&#34;因此,部分为空

    如果您想要使用Joe的版本,只需删除您的添加的代码和合并的共同祖先部分,并保留Joe的版本(然后删除冲突标记) 。如果您认为您的版本更好,请删除Joe并保留您的版本。

    1 在许多相当常见的情况下,要么你做了改变而Joe没有做,要么乔做了改变而你没有改变。在这种情况下,Git只需要你的版本,或Joe的版本,并称之为完成。如果-s 公共基础本身与您的HEAD版本相同,或者与Joe的临时修复程序相同,则一切都变得非常简单。在一个案例中(base = Joe,所以你领先)没有什么可以合并,而在另一个案例中(base =你,但Joe领先)Git可以做一个所谓的&#34;快进&# 34;然后直接转到Joe的哈希ID。

    自动化部分或全部

    开始合并时,您可以提供-X-s(或两者)参数。在我看来,Git用于这些的名称并不是很好(太混乱):-X选择策略-X传递策略选项< / em>到所选策略(通常默认为正确的策略,所以通常只需要X)。我想说ours代表 eXtenteded选项,这不是更好,但至少避免说&#34;策略&#34;再一次。

    有一个ours 策略,这不是您想要的,并且theirs-X theirs 扩展了选项,有时候你想要的。所以git checkout --ours -- somefile.pl 是有道理的:它意味着如果存在冲突,支持Joe超过我的。但请注意粗体部分! 如果则存在冲突。如果没有冲突 - 如果您删除了顶部附近的五行,而Joe没有触及这些行 - Git 仍然会进行两项更改。只有在发生冲突时,Git才会自动支持Joe。

    一旦Git因文件中的冲突而停止,您可以使用相同的我们/他们的符号检查您的版本或Joe的版本:

    git checkout --theirs -- somefile.pl
    

    或:

    --

    -f.pl保护您,如果由于某种原因,该文件被命名为git checkout --theirs:它只是一个很好的习惯,但这并不是必需的。)但这意味着从HEAD或Joe的提交中提取整个事物,删除其他人的更改。如果您删除了五行,并且它们应该保持删除状态,但是您-X theirs要获得Joe的版本,则这五行返回

    当然,如果 all 所做的更改与Joe所做的更改有冲突,那么然后提取Joe的版本会得到与{{{ 1}}会。但那是一个非常大的&#34; if&#34;。

    要重建合并冲突,您可以:

    git checkout -m -- somefile.pl
    

    然后手动合并。 (但请参阅下一节。)

    准备好文件的最终版本后,必须git add告诉Git将工作树版本复制到索引中。该索引目前在三个额外的插槽中具有所有三个(基本,我们的,他们的)版本,其中&#34;已解决&#34;文件的槽位未被占用。添加已解析的文件将填充正常的已解析文件的插槽零,并清除保留未解析文件的插槽1-3。

    使用-X选项

    重新合并一个特定文件

    您可以让Git重新合并一个特定文件,而无需使用相应的扩展选项再次启动整个合并。但是,这很烦人。 (这是Mercurial让Git击败所有空洞的一个案例:我即将展示的内容都是预包装的。)

    如果您提取该文件的所有三个版本,您现在可以对它们运行git merge-file,获得-X theirs的效果:

    git checkout -- :1:somefile.pl
    mv somefile.pl somefile.pl.base
    git checkout --theirs somefile.pl
    mv somefile.pl somefile.pl.theirs
    git checkout --ours somefile.pl
    git merge-file --theirs somefile.pl somefile.pl.base somefile.pl.theirs
    

    要获得-X ours的效果(如果存在冲突,请支持我们的更改),请使用git merge-file --ours。完成后,请删除该文件的.base.theirs版本。

    (像往常一样,一旦解决了冲突,你必须git add将文件复制回索引,在插槽0处,将其标记为已完成。)