Conflicto de Git durante aplastamiento en rebase interactivo

Tengo el siguiente historial de git

* bee55e9 (HEAD -> WM-290) - Jepessen : Little refactoring. (4 minutes ago) * 1a4470a - Jepessen : Project refactoring (5 minutes ago) * 399f769 - Jepessen : Added some documentation. (15 minutes ago) * cb1055e - Jepessen : Another Test passed. (21 minutes ago) * 549f147 - Jepessen : Another test passed. (24 minutes ago) * b77c862 - Jepessen : First test passed. (29 minutes ago) * d2c9d86 - Jepessen : Integer -> IntegerValue: Failing test added. (31 minutes ago) * 678c0b1 - Jepessen : ExpressionTest added. (2 hours ago) * b65284b - Jepessen : Refactonetworking. (2 hours ago) * 29ccc99 - Jepessen : Solution Refactonetworking. (2 hours ago) * 83f7a45 - Jepessen : Some Refactoring (2 hours ago) * c33b81f - Jepessen : Integer class added. (2 hours ago) * 1415bb4 - Jepessen : Leaf class added. (2 hours ago) * a25da8b - Jepessen : Added Expression project (2 hours ago) * aa9c4e8 (origin/master, origin/HEAD, master) - Jepessen : WMathTest C# solution added. (2 hours ago) * b31dc4d - Jepessen : .gitignore updated. (2 hours ago) * f7285b1 - Jepessen : Removed old files. (2 hours ago) * 8d1213c - Jepessen : .gitignore updated. (23 hours ago) * ed5a67a - Jepessen : WSchool project added. (24 hours ago) 

Quiero aplastar la twig WM-290 en una única confirmación. Yo uso el command

 git rebase -i master 

Y en el rebasamiento interactivo escribo:

 pick a25da8b Added Expression project s 1415bb4 Leaf class added. s c33b81f Integer class added. s 83f7a45 Some Refactoring s 29ccc99 Solution Refactonetworking. s b65284b Refactonetworking. s 678c0b1 ExpressionTest added. s d2c9d86 Integer -> IntegerValue: Failing test added. s b77c862 First test passed. s 549f147 Another test passed. s cb1055e Another Test passed. s 399f769 Added some documentation. s 1a4470a Project refactoring s bee55e9 Little refactoring. 

Durante la rebase, obtengo el siguiente post de error:

 error: Your local changes to the following files would be overwritten by merge: WMathTest/Expression/Expression.csproj Please commit your changes or stash them before you merge. Aborting Could not apply 83f7a45... Some Refactoring 

Pero si uso el command git mergetool , git mergetool el siguiente post:

 $ git mergetool No files need merging 

Lo único que puedo hacer es abortar el rebase.

¿Por qué hay un conflicto, teniendo en count que la sucursal está en la parte superior de la twig master , y cómo puedo resolverlo si no es necesario fusionar los files?

EDITAR:

Durante el conflicto, este es el resultado del git status command git status :

 $ git status interactive rebase in progress; onto aa9c4e8 Last commands done (5 commands done): s 83f7a45 Some Refactoring s c33b81f Integer class added. (see more in file .git/rebase-merge/done) Next commands to do (11 remaining commands): s 83f7a45 Some Refactoring s 29ccc99 Solution Refactonetworking. (use "git rebase --edit-todo" to view and edit) You are currently rebasing branch 'test' on 'aa9c4e8'. (all conflicts fixed: run "git rebase --continue") Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: WMathTest/Expression/Expression.csproj no changes added to commit (use "git add" and/or "git commit -a") 

(Supongo que el fragment de gráfico en la parte superior es la salida de git log --oneline --decorate o similar.)

No tengo claro de inmediato qué te llevó a la situación, pero la situación en sí misma es lo suficientemente clara: 1 en el punto en que falla la database interactiva, el file WMathTest/Expression/Expression.csproj está en tu tree de trabajo, pero no está en tu índice.

Presumiblemente, la confirmación 83f7a45 comprende (o consiste en, o incluye) la adición de un nuevo file WMathTest/Expression/Expression.csproj que no estaba en la instantánea almacenada en la c33b81f Integer class added. commit c33b81f Integer class added. Sin embargo, lo que está en commit 83f7a45 no coincide con lo que está en su tree de trabajo en este momento. Esto, específicamente, cómo este file llegó a su tree de trabajo en el estado que tiene ahora, cuando está en algunos de estos compromisos intermedios, es la parte que me parece un poco confusa. Para que este sea el caso, ese mismo file tampoco debe estar en commit bee55e9 Little refactoring. (Si estuviera en esa confirmación, y no en el a25da8b Added Expression project , Git lo habría eliminado de manera segura al comienzo de la rebase. Si estuviera en ambos bee55e9 y a25da8b , Git habría reemplazado el file del tree de trabajo con el inicio versión, y de nuevo no estaríamos en esta situación. La única posibilidad restante es que no está en commit, no en la sugerencia de bifurcación y no en la pick primera pick , sino que está sentado en este momento en el tree de trabajo para alguna razón. Eso, solo tú puedes explicarlo).

En cualquier caso, la operación git cherry-pick subyacente que usa la database interactiva para seleccionar o aplastar cada compromiso en el índice y el tree de trabajo actuales está fallando debido a este file. No hay conflicto de fusión con este file, ya que no se está fusionando: simplemente está en el path de la rebase.

Una solución sería confirmarla (hacerla seguir) o eliminarla del tree de trabajo, cuando esté en la punta de WM-290 , para que Git la elimine o no esté en el path. .

Otra es omitir todas las cosas de rebase. Si simplemente desea que el contenido del índice actual se convierta en una confirmación única en la punta de la twig WM-290 , con esa confirmación única como su padre, la confirmación que actualmente es la punta del master , puede hacer lo siguiente:

 git reset --soft master git commit 

y escribe un post de confirmación completamente nuevo (ten en count que esto no generará los posts intermedios de confirmación aplastados para ti de la manera en que git rebase -i hace). The --soft le dice a Git que no toque el índice (ni, por supuesto, el tree de trabajo), por lo que el índice continúa conteniendo la misma instantánea que tenía cuando el WM-290 reference a commit bee55e9 . Este reset simplemente mueve la label de la twig hacia atrás, de modo que la siguiente nueva confirmación tenga aa9c4e8 como su elemento primario:

  newnewn <-- WM-290 / ...--b31dc4d--aa9c4e8 <-- master \ a25da8b--1415bb4--...--bee55e9 [was WM-290] 

La instantánea para commit newnewn (cuyo ID aún no conocemos) será la misma que para bee55e9 . La confirmación principal será aa9c4e8 . Eso es lo que hace el git reset --soft : mantiene el índice sin cambios, de modo que un nuevo compromiso lo volverá a usar, pero mueva el nombre de la twig, de modo que la nueva confirmación irá después de alguna otra confirmación.


1 Bueno, claro para alguien que ha pasado años luchando trabajando con Git. 🙂