Quelque chose à préciser que je pense: les conflits et fusionner les stratégies sont un concept de git lui-même. "Merge request", OTOH, est un concept de gitlab (et d'autres hôtes de repo ont des concepts similaires) mais ne veut rien dire du tout. Il est préférable de répondre à votre question en parlant de git; il suffit donc de savoir qu'une requête de fusion est un workflow par lequel une opération de fusion peut être démarrée dans git. Alors, nous allons prendre votre question en deux parties:
séquentielle Fusionne
Réponse courte: il y aura probablement un conflit.
L'existence d'un conflit dépend de la stratégie de fusion. Mes tests suggèrent qu'il y aurait typiquement un conflit, comme git voit des changements alternatifs dans les lignes 101-150. Puisque les deux ensembles de changements sont des ajouts, je suppose que vous pourriez concevoir les deux ensembles de lignes ajoutées sans conflit - bien que l'ordre irait po. Vous pouvez faire git essayer de le faire en utilisant le pilote de fusion union
; Vous pouvez dire à git de résoudre les fusions de différentes manières via les arguments de la ligne de commande, mais comme ces instructions s'appliquent à la totalité du commit - pas seulement le fichier où cette condition est configurée - vous ne voudriez généralement pas à. Vous pouvez utiliser .gitattributes
pour influencer comment git fusionne juste le fichier, si vous pouvez savoir à l'avance quand cette approche sera correcte pour le fichier (entier). Donc, il y a beaucoup d'options pour changer le comportement de merge
- trop de détails à détailler ici sans connaître un résultat spécifique désiré. Mais généralement, cela fonctionne bien d'utiliser les paramètres de fusion par défaut et de résoudre les conflits quand ils se produisent, dans mon expérience de toute façon.
simultanées Fusionne
Il est pas vraiment possible pour deux fusions de se produire « en même temps » dans un seul repo. Si un hôte fournit un moyen de démarrer une fusion directement sur le repo hébergé (origin
) - ce que je ne sais pas que quiconque le fait, mais pour des raisons d'argument - alors une fusion devrait être complétée en premier, et l'autre voir le résultat de cette fusion comme point de départ; Donc, voir la partie précédente de la réponse pour cela. Cela peut arriver, une personne peut effectuer une fusion sur un dépôt, et une autre personne peut effectuer une autre fusion sur un second dépôt, et il peut y avoir des conflits quand ils essaient tous deux de se synchroniser avec la télécommande. Et voici comment cela pourrait ressembler:
(Notez que tout au long de cet exemple, je suis en supposant vrai fusionne - à savoir ce qui se passerait si vous utilisez l'option no-ff
Les graphiques de fusion pourrait être plus simple, mais les résultats seraient. même aussi loin que les conflits vont, si ont été autorisés se confond rapidement vers l'avant.)
Ainsi, le repo commence avec
B <--(branch_B)
/
x -- x -- O <--(master)
\
A <--(branch_A)
Tous les commits contiennent un seul fichier. Dans O
ce fichier a 100 lignes. A
et B
ajoutent chacun 50 nouvelles lignes à la fin du fichier.
Maintenant Alice fusionne branch_A
et Bob fusionne branch_B
, chacun dans leur dépôt local. Alors Alice a
B <--(branch_B)
/
x -- x -- O -- MA <--(master)
\/
A
^-(branch_A)
et Bob a
v-(branch_B)
B
/\
x -- x -- O -- MB <--(master)
\
A <--(branch_A)
Pour partager leur travail, ils essaient de toujours push
-origin
; et tout comme avec merge
s, l'un terminera le premier avant que l'autre ne commence, même s'il essaie de commencer à pousser exactement au même moment. Alice obtient son push, et origin
est mis à jour pour ressembler à son locale. Lorsque Bob essaie de pousser, il obtient une erreur parce que son master
est derrière le master
sur origin
(ou, on pourrait dire, derrière origin/master
une fois qu'il a été mis à jour, en supposant des mappages typiques). Donc, Bob doit pull
(ou fetch
et merge
) avant de pouvoir le push
. Pour illustrer le plus clairement, supposons qu'il est fetch
es. Maintenant, il a
v-(branch_B)
B
/\
x -- x -- O -- MB <--(master)
|\
| MA <--(origin/master)
|/
A <--(branch_A)
et pour compléter l'effet d'un pull
, il doit fusionner origin/master
dans master
- même si ce cas se résume au scénario « de fusion séquentielle » couverte d'abord. En fait, si vous tracez le même scénario en utilisant des fusions rapides, il sera clair que la "deuxième fusion" nécessaire ici est exactement la même que la "deuxième fusion" si tout a été fait par un utilisateur dans un repo.
Merci pour votre réponse détaillée :) – Ragnarsson