2016-10-07 2 views
0

Cette question s'applique à toute situation dans laquelle on utilise Git avec d'autres coéquipiers. Disons que nous changeons tous deux le même fichier, mais pas de manière à provoquer un conflit.Est-ce que Git écrase tout le fichier quand vous fusionnez, ou cherrypick, ou juste les pièces changées?

Disons que j'ai le code:

#define client_view 500 
#define server_view 1000 
#define client_destroy 750 
#define server_destroy 1250 

on me demande de changer client_view et connexes, mon collègue est invité à changer server_view.

Je le modifie client_view à 570, par ex. Je pense que dans ce scénario hypothétique 570 est une bonne valeur. De même, mon collègue choisit 1066 pour server_view.

Lorsque nous avons tous deux la demande tirer, et le gestionnaire se confond ces à maîtriser,

Que faut-il afficher?

#define client_view 570 
#define server_view 1000 
#define client_destroy 750 
#define server_destroy 1250 

ou

#define client_view 500 
#define server_view 1066 
#define client_destroy 750 
#define server_destroy 1250 

ou

#define client_view 570 
#define server_view 1066 
#define client_destroy 750 
#define server_destroy 1250 

Je demande cela parce que je veux savoir si mes modifications remplacent mes collègues changements. Je n'ai jamais envoyé de demande d'extraction sur le même fichier sur lequel quelqu'un d'autre a travaillé, donc je ne connais pas la réponse, et je ne pouvais pas en trouver une sur SO ou autre.

Répondre

0

Git fait quelque chose qui s'appelle une «fusion à 3 voies». Cela signifie, il y aura trois commits impliqués:

  • A: votre commettras
  • B: leur commettras
  • C: l'ancêtre commun de A et B

Le 3-Way- fusionner maintenant (fondamentalement) trouve tous les changements entre CA et CB. Si un ensemble particulier de lignes n'a été modifié que par A ou B, il les applique. Si des lignes ont été modifiées à la fois dans A et B (par rapport à C), elles sont marquées comme un conflit et vous devez choisir une résolution manuellement.

L'algorithme utilisé dans Git est généralement très, très bon pour vous donner ce que vous attendez intuitivement. Donc, dans votre cas, vos deux changements seraient simplement appliqués (parce qu'ils ne sont pas en conflit les uns avec les autres). Donc, vous obtenez votre troisième résultat. Incidemment, une chose qui confond souvent les gens, c'est que Git ne se soucie pas un peu de ce qui se passe entre C ... A ou C ... B. Par exemple, vous pouvez supprimer et restaurer un fichier entre les deux et cela n'a aucune influence sur l'opération de fusion.

En outre, il va pas en quelque sorte passer par tous les commits intermédiaires, il ne regardera exactement que ces trois commits.Ceci est très utile maintenant, car dans les cas extrêmes de conflits de fusion (par exemple, si un de vos collègues a changé l'indentation de toutes les lignes, rendant le fichier entier un conflit important), vous pouvez vous aider en changeant A ou B leur propre (dans cet exemple, annuler leur indentation, ou appliquer la même indentation à vos fichiers), valider cette modification, et puis essayer de fusionner à nouveau, en espérant obtenir un conflit moins.