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

StackOverflow https://stackoverflow.com/questions/1840898

  •  12-09-2019
  •  | 
  •  

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?)

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top