我正在将一个名为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
答案 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
:
ba5eba5
。HEAD
,因为它是。temp-fix
。 :-) HEAD转换为一些难以理解的哈希ID,但我们可以说&#34; HEAD&#34;。HEAD
,与temp-fix
一样,变成了一些难以理解的哈希ID,但我们只能说git diff ba5eba5 HEAD
。git diff ba5eba5 temp-fix
:你更改的内容。merge.conflictStyle
: Joe 已更改的内容。他们不重叠的地方 - 例如,如果您从第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。
您可以让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处,将其标记为已完成。)