Push se compromete con otra rama

385

¿Es posible confirmar e impulsar cambios de una rama a otra?

Supongamos que he cometido cambios en BRANCH1 y quiero empujarlos a BRANCH2 .

Desde BRANCH1 , ¿es válido hacer:

git push origin **BRANCH2**

¿Y luego restablecer BRANCH1?

jviotti
fuente

Respuestas:

712

Eso casi funcionará.

Al pasar a una rama no predeterminada, debe especificar la referencia de origen y la referencia de destino:

git push origin branch1:branch2

O

git push <remote> <branch with new changes>:<branch you are pushing to> 
SLaks
fuente
26
¿Ambos branch1y branch2necesitan estar en el control remoto? ¿Qué pasa si quieres pasar de local branch1a remoto origin branch2?
Orad
11
@orad: No. La primera parte es en realidad solo un identificador para una confirmación local; Ni siquiera necesita ser una rama.
SLaks
66
@abhisekp: use la misma sintaxis. Para referirse a la rama fuente, use<remote>/<branch>
SLaks
44
@abhisekp: Haz exactamente lo que acabo de decir. La rama actual es completamente irrelevante.
SLaks
21
¡Tenga en cuenta que cualquiera tentado (como yo) a correr git push origin :branch2pensando que simplemente empujaría la rama local actual al control remoto branch2, que en cambio eliminará el control remoto branch2! La forma correcta es git push origin HEAD:branch2.
Helder Pereira
72

Ciertamente, aunque solo funcionará si es un avance rápido de BRANCH2 o si lo fuerza. La sintaxis correcta para hacer tal cosa es

git push <remote> <source branch>:<dest branch> 

Consulte la descripción de un "refspec" en la página de manual de git push para obtener más detalles sobre cómo funciona. También tenga en cuenta que tanto un empuje forzado como un reinicio son operaciones que "reescriben el historial", y no deben intentarse por un corazón débil a menos que esté absolutamente seguro de saber lo que está haciendo con respecto a los repositorios remotos y otros personas que tienen tenedores / clones del mismo proyecto.

Ryan Stewart
fuente
66
¡Gracias! Solo agregaré que puedes forzar git push --force remote local-branch:remote-branch.
Ferran Maylinch
16

Es muy simple. Suponga que ha realizado cambios en su Rama A, que reside tanto en el lugar local como en forma remota, pero desea enviar estos cambios a la Rama B, que no existe en ninguna parte.

Paso 01: crea y cambia a la nueva rama B

git checkout -b B

Paso-02: Agregar cambios en la nueva sucursal local

git add. // o archivos específicos

Paso 03: comprometer los cambios

git commit -m "commit_message"

Paso-04: Empuje cambios en la nueva rama B . El siguiente comando creará una nueva rama B de forma remota

origen de empuje git B

Ahora, se puede verificar de bitbucket que la rama B tendrá una más que comprometen la rama A . Y cuando vas a la comprobación de la rama A estos cambios no estarán allí ya que estos han sido empujados a la rama B .

Nota: Si ha confirmado sus cambios en la rama A y luego desea cambiar esos cambios a la nueva rama B , primero deberá restablecerlos. #Feliz aprendizaje

Bilal Ahmed Yaseen
fuente
2

En mi caso, tuve una confirmación local, que no se presionó origin\master, sino que se comprometió con mi mastersucursal local . Este compromiso local ahora debe ser empujado a otra rama.

Con Git Extensions puedes hacer algo como esto:

  • (Crear si no existe y) pagar una nueva sucursal, donde desea impulsar su confirmación.
  • Seleccione la confirmación del historial, que debe confirmarse y enviarse a esta rama.
  • Haga clic derecho y seleccione Cherry pick commit .
  • Presione el botón de selección Cherry luego.
  • El commit seleccionado se aplica a su rama desprotegida. Ahora comprométete y empújalo.
  • Echa un vistazo a tu antigua rama, con el commit defectuoso.
  • Restablezca esta rama al último último commit, donde todo estaba bien (¡tenga en cuenta lo que está haciendo aquí!). Puede hacerlo haciendo clic derecho en el segundo último commit y seleccione Restablecer la rama actual aquí . Confirme la operación, si sabe lo que está haciendo.

También puede hacerlo en la línea de comando GIT . Ejemplo copiado de David Christensen :

Creo que encontrarás que git cherry-pick+ git resetes un flujo de trabajo mucho más rápido:

Usando su mismo escenario, con "característica" siendo la rama con la confirmación más alta incorrecta, sería mucho más fácil hacer esto:

git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^

Ahorra bastante trabajo, y es el escenario que git cherry-pick fue diseñado para manejar.

También notaré que esto funcionará también si no es la confirmación más importante; solo necesita un compromiso para el argumento de selección de cereza, a través de:

git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... # whack the specific commit from the history

pruebas
fuente
2

Obtuve un mal resultado con el git push origin branch1:branch2comando:

En mi caso, branch2se elimina y branch1se ha actualizado con algunos cambios nuevos.

Por lo tanto, si solo desea que los cambios se envíen branch2desde branch1, intente los siguientes procedimientos:

  • En branch1:git add .
  • En branch1:git commit -m 'comments'
  • En branch1:git push origin branch1

  • En branch2:git pull origin branch1

  • Activado branch1: vuelve al commit anterior.

Benyamin Jafari
fuente
0

puedes hacer esto fácilmente

git status
git add .
git commit -m "any commit"
git pull origin (branch name, master in my case)
git push origin current branch(master):branch 2(development)(in which you want to push changes)
Ramiz Khan
fuente
-1

git init 
#git remote remove origin
git remote add origin  <http://...git>
echo "This is for demo" >> README.md 
git add README.md
git commit -m "Initail Commit" 
git checkout -b branch1 
git branch --list
****add files***
git add -A
git status
git commit -m "Initial - branch1"
git push --set-upstream origin branch1
#git push origin --delete  branch1
#git branch --unset-upstream  

Srinu Mareti
fuente
1
Por favor agregue alguna explicación del código.
Nakx
-4

¿Te has comprometido con BRANCH1 y quieres deshacerte de este compromiso sin perder los cambios? git reset es lo que necesitas. Hacer:

git branch BRANCH2

si quieres que BRANCH2 sea una nueva sucursal. También puede fusionar esto al final con otra rama si lo desea. Si BRANCH2 ya existe, deje este paso fuera.

Entonces hazlo:

git reset --hard HEAD~3

si desea restablecer la confirmación en la rama que ha confirmado. Esto toma los cambios de los últimos tres commits.

Luego haga lo siguiente para llevar los commits restablecidos a BRANCH2

git checkout BRANCH2

Esta fuente fue útil: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

Sasa
fuente