Con Git, ¿cómo puedo enviar algunos cambios en la copia de trabajo a una rama diferente?
Pregunta
Estoy trabajando en una sucursal y obtuve una copia de trabajo que está realmente sucia.Al revisar los cambios a confirmar, quería que se confirmaran algunas correcciones de una sola línea en el master
rama.
En este caso, utilizando git stash
Realmente no ayuda, porque mi copia de trabajo tiene muchos otros cambios que aún no se fusionarán con el maestro.
¿Existe una forma más eficiente de solucionar esta situación?(p.ej.¿hacer un compromiso y mover su padre?)
Solución 5
Según las sugerencias anteriores, esta es la solución que se me ocurrió:
Solución 1 con selección de cereza
Simplemente confirme el cambio único en la propia sucursal:
git add --patch <files> # record every change to move to master
git commit
Pasar al master y seleccionar
git stash
git checkout master
git cherry-pick <commitid>
De vuelta en la rama, se puede cambiar la base.
git checkout <branch>
git rebase master
Por cada confirmación duplicada, se le pedirá que escriba:
git rebase --skip
Las confirmaciones duplicadas se filtran del conjunto de parches en la rama y el historial está limpio.El final git merge
Después de todo, todavía se puede avanzar rápidamente.
Solución 2, sin tener que comprometerse primero en la sucursal
Primero extrae todo para pasar al master:
git add --patch <files> # record every change to move to master
Luego cambie a master 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 rama, se puede volver a basar directamente en la punta del maestro:
git checkout <branchname>
git rebase master # move to branch start to the tip of master.
git stash apply # restore working copy, auto merges the changes
Solución 3, hacer un clon de la rama maestra actual
En caso de que no le importe tener varias copias de trabajo (de hecho, siempre hice esto con SVN), existe 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 configuración del clon se realiza manualmente aquí porque git clone
siempre clona la rama 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 tener más libertad para restablecer todo y volver a intentarlo hasta que haga las cosas bien.
En esta situación, estamos ante una solución de una línea en un archivo que existe en ambas ramas.Esto no generaría ningún conflicto de fusión y permite algunos atajos como checkout -m
.
Otros consejos
Puede utilizar git add -i
utilizar el modo interactivo. No se puede especificar, lo que cometen y qué omitir.
De esta manera puede comprometer sus oneliners como independiente comete. Mediante el uso de git cherry-pick
puede combinarlos a su maestro, más adelante.
Uso git add -i
para elegir lo que quieren comprometerse con esta rama, a continuación, cambiar de dominar y entrega el resto.
Con add -i
puede elegir qué partes de los archivos que desea prepararse para comprometerse y luego comprometerse ellos, mientras que deja otras partes de los mismos archivos de la confirmación.
git add -p
le caerá directamente en el modo de parche para seguir el proceso @ Arkaitz-Jiménez recomienda correctamente.
No sé si esto es lo que quieres, pero yo sólo echa un vistazo a la otra rama (que no pierde cambios no confirmados), y luego selectivamente el registro de entrada los cambios que desea comprometerse.
En lugar de utilizar git add -i
/ git add -p
también se puede utilizar el modo de complemento interactivo de git gui
gratis (interfaces gráficas probablemente otra GIT, que son In cluir cometer herramienta, como por ejemplo QGit, tienen esta característica)