Con Git, ¿cómo puedo enviar algunos cambios en la copy de trabajo a una twig diferente?

Estoy trabajando en una sucursal, y obtuve una copy de trabajo con ella es muy sucio. Al revisar los cambios para confirmar, quería que se corrigieran algunas correcciones de línea de producción en la twig master .

En este caso, usar git stash realmente no me ayuda, porque mi copy de trabajo tiene muchos otros cambios que aún no se fusionarán con el maestro.

¿Hay una forma más eficiente de solucionar esta situación? (por ejemplo, hacer una confirmación, y mover su padre?)

Puede usar git add -i para usar el modo interactivo. Allí puede especificar qué debe comprometer y qué omitir.

De esta forma, puede comprometer sus oneliners como commits separados. Al usar git cherry-pick puedes unirlos a tu maestro, más tarde.

Use git add -i para elegir lo que quiere comprometer con esta twig, luego cambie a master y git add -i usar el rest.

Con add -i puede elegir qué partes de qué files desea preparar para la confirmación y luego confirmarlas, dejando otras partes de los mismos files fuera de la confirmación.

git add -p llevará directamente al modo de parche para seguir el process que @arkaitz-jimenez recomienda correctamente.

No sé si esto es lo que quieres, pero simplemente verificaría la otra twig (que no pierde los cambios no confirmados), y luego verificaría los cambios que deseas confirmar.

En base a las sugerencias anteriores, esta es la solución que se me ocurrió:

Solución 1 con cherry-pick

Simplemente realice el cambio único en la propia twig:

 git add --patch <files> # record every change to move to master git commit 

Mover a maestro, y seleccionar

 git stash git checkout master git cherry-pick <commitid> 

De vuelta en la twig, se puede volver a establecer.

 git checkout <branch> git rebase master 

Por cada confirmación duplicada, se le pedirá que escriba:

 git rebase --skip 

Las confirmaciones duplicadas se filtran fuera del set de parches en la bifurcación y el historial está limpio. La git merge final de git merge aún puede avanzar rápidamente después de todo.

Solución 2, sin tener que comprometerse en la twig primero

Primero extrae todo para pasar al máster:

 git add --patch <files> # record every change to move to master 

Luego cambie a maestro para confirmar:

 git stash --keep-index # clear the working copy only git checkout master -m # merge the index. git commit 

Y de vuelta en la twig, puede volver a basarse directamente en la punta del maestro:

 git checkout <branchname> git rebase master # move to branch start to the tip of master. git stash apply # restre working copy, auto merges the changes 

Solución 3, haga una copy de la twig maestra actual

En caso de que no te importe tener varias copys de trabajo (siempre lo hice con SVN en realidad), hay una tercera solución:

 mkdir ../newrepos cd ../newrepos git init git remote add origin /path/to/your/repository git fetch master:remotes/origin/master # fetch remote master to local remotes/origin/master git checkout -t origin/master # make new "master" branch, link to remote, checkout. git commit git push origin master # inject the change in the original repository. 

La configuration de clonación se realiza manualmente aquí porque git clone siempre clona la twig actualmente activa.


Para situaciones más complejas, siempre hay una protección adicional con git diff > to-master.patch y git apply to-master.patch . Esto le permite más libertad para reiniciar todo e intentar hasta que haga las cosas bien.

En esta situación, se trata de una corrección de una línea en un file que existe en ambas twigs. Esto no daría ningún conflicto de fusión, y permite algunos accesos directos como checkout -m .

En lugar de usar git add -i / git add -p también puedes usar el modo interactivo de agregar git gui
(Probablemente otras interfaces git graphical, que incluyen la herramienta commit, como por ejemplo QGit, tienen esta característica)