web-dev-qa-db-fra.com

git rebase "supprimé par nous" et "supprimé par eux"

Supposons que je rebase expérience branche sur master et qu'il y a des conflits dans les fichiers. Et bien sûr, des fichiers sont supprimés dans les deux branches. Donc, quand je résous les conflits, dans git status Je vois deleted by us et deleted by them. C'est très déroutant. Existe-t-il un moyen de comprendre ce qu'ils signifient? Qui est eux et qui est nous?

Ou pendant le rebasage, existe-t-il un autre moyen de savoir quel fichier a été supprimé par quelle branche? Vous aimez imprimer le nom de la succursale?

48
Milind Dumbare

Documentation de référence

Notez qu'une fusion de rebase fonctionne en relisant chaque commit à partir de la branche de travail en haut de <upstream> branche. Pour cette raison, lorsqu'un conflit de fusion se produit, le côté signalé comme le nôtre est la série rebasée jusqu'à présent, commençant par <upstream>, et la leur est la branche de travail. En d'autres termes, les côtés sont échangés.

https://git-scm.com/docs/git-rebase/2.17. (dernière: https://git-scm.com/docs/git-rebase =)

Par conséquent, les fichiers "supprimés par nous" sont ceux qui ont été supprimés sur la branche sur laquelle vous rebasez sur (la branche finale), et les fichiers "supprimés par eux "sont des fichiers qui ont été supprimés dans la branche que vous rebasez (celle qui sera supprimée).

Manifestation

$ ls
a
$ git log --oneline --graph --decorate --all
* d055cdd (HEAD -> y) Write baz in a-file
| * 487dc8c (x) Write bar in a-file
|/  
* 3fa0da5 (master) Write foo in a-file
$ git rebase x
First, rewinding head to replay your work on top of it...
Applying: Write baz in a-file
Using index info to reconstruct a base tree...
M   a
Falling back to patching base and 3-way merge...
Auto-merging a
CONFLICT (content): Merge conflict in a
error: Failed to merge in the changes.
Patch failed at 0001 Write baz in a-file
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
$ cat a
<<<<<<< HEAD
bar
=======
baz
>>>>>>> Write baz in a-file
$ git checkout --ours a
$ cat a
bar
$ git checkout --theirs a
$ cat a
baz

AFAIK il n'y a pas de commutateur pour afficher explicitement les noms spécifiques des branches avec les outils officiels. À moins que je ne me trompe, ce n'est qu'une de ces choses que vous devez apprendre pour surmonter la confusion initiale.

À leur crédit, cela a beaucoup de sens si vous y réfléchissez.

Analyse plus pédante

Le texte de la page de manuel est un peu ambigu car il pourrait être interprété comme pertinent uniquement lors de l'utilisation de --merge option. Ceci est exacerbé par une deuxième mention du comportement dans --strategy: "Notez l'inversion de la nôtre et la leur comme indiqué ci-dessus pour l'option -m." .

Cependant, je pense que cela ne contraste pas avec le comportement de git-rebase lorsque --merge est utilisé avec quand il ne l'est pas; je crois plutôt qu'il contraste le comportement de git-rebase avec git-merge. La section MERGE STRATEGIES est clairement extraite de la page de manuel git-merge, il est donc assez facile d'imaginer que l'auteur a ressenti le besoin de mettre l'accent sur l'échange lors de l'utilisation de rebase car il n'est pas mentionné dans cette section. La phrase suivante, pour moi, confirme cette interprétation: "[...] git rebase rejoue chaque commit de la branche de travail au-dessus de la branche en utilisant la stratégie donnée [...]" .

Bien que nous comprenions maintenant que la stratégie de fusion ne devrait pas avoir d'impact sur les côtés (seul le choix de git-merge vs git-rebase devrait), je noterai --merge est impliqué par la stratégie par défaut (ce qui rend le comportement par défaut complètement non ambigu).

48
tne

Ci-dessous, une copie de réponse de SzG sur une question similaire:

Lorsque vous fusionnez , us fait référence à la branche dans laquelle vous fusionnez, par opposition à them, la branche à fusionner.

Lorsque vous rebase , us fait référence à la branche en amont et them est la branche sur laquelle vous vous déplacez. C'est un peu contre-intuitif en cas de rebase.

La raison en est que git utilise le même moteur de fusion pour le rebase, et qu'il sélectionne en fait vos trucs dans la branche en amont. us = dans, them = à partir de.

19
Maxim Suslov