¿Cómo y por qué "git checkout HEAD" produce resultados diferentes para "–theirs" y "–ours"?

Cuando estoy en medio de un conflicto de rebase , me gustaría ver los cambios que serían instituidos por --ours , --theirs y HEAD .

Entonces, los reviso a todos (literalmente):

git checkout --ours <new_file>

vim <new_file>

… examino el file …

git checkout --theirs <new_file>

vim <new_file>

… examino el file …

git checkout HEAD <new_file>

vim <new_file>

… examino el file …

Luego, vuelvo y comprobo el theirs y el ours :

git checkout --theirs <new-file>

vim <new-file>

Por alguna razón, --theirs y --ours han sido conforme a la versión cuando revisé HEAD . Entiendo que el git checkout se supone que debe cambiar el directory de trabajo y el índice, pero incluso cuando pago la --theirs nuevo es igual que la versión HEAD .

¿Cómo / por qué es esto? ¿Y hay una forma de recuperar mi original --theirs y --ours versiones? Gracias.

Git utiliza los --ours y --theirs arguments para git checkout para seleccionar qué "lado" de una fusión en conflicto para extraer. Más precisamente, cuando tienes una combinación conflictiva, hay, para cada ruta conflictiva ("no fusionada"), tres inputs de 1 en el área de indexing / estadificación de git para esa ruta. Git numera estos:

:1: path la versión de base de combinación del file
:2: path la versión "nuestra" del file
:3: path la versión "suya" del file

Tenga en count que :0: path es "perdida", aquí: la ranura cero está reservada para la ruta resuelta (fusionada).

Cuando hiciste la git checkout HEAD path , git pensó que estabas resolviendo el conflicto. Dejó las otras tres versiones y llenó la casilla 0. De hecho, si reemplaza HEAD con cualquier especificador de twig o "tree-ish" (por ejemplo, git checkout branch1 path ), también pensará que está resolviendo el conflicto.

Afortunadamente, hay una manera de decirle a git que (re) cree el conflicto de fusión, volviendo a poblar los otros tres espacios (y abandonando la versión en el espacio 0):

$ git checkout -m path

El bash de fusión de Git termina en su directory de trabajo como de costumbre.

Un pequeño inconveniente es que las annotations después de <<<< etc. se pierden (en realidad puedes suministrarlas, ya que provienen de variables de entorno de git especiales, pero rara vez vale la pena molestar, creo). [Editar para agregar nota: me refiero a la información adicional agregada después de los marcadores, por ejemplo:

 <<<<<<< HEAD:more information here 

Es la "información más aquí" que he visto desaparecer.]


1 Más precisamente, hasta tres inputs: las inputs obvias se omiten si el file se elimina en algunas de las confirmaciones que se fusionan.