Push valide dans une autre branche

385

Est-il possible de valider et de pousser des modifications d'une branche à une autre?

Supposons que j'ai validé les modifications dans BRANCH1 et que je souhaite les transférer vers BRANCH2 .

Depuis BRANCH1 , est-il valable de faire:

git push origin **BRANCH2**

Et puis réinitialiser BRANCH1?

jviotti
la source

Réponses:

712

Cela fonctionnera presque.

Lorsque vous passez à une branche non par défaut, vous devez spécifier la référence source et la référence cible:

git push origin branch1:branch2

Ou

git push <remote> <branch with new changes>:<branch you are pushing to> 
SLaks
la source
26
Les deux branch1et branch2doivent-ils être sur la télécommande? Et si vous voulez passer du local branch1à la télécommande origin branch2?
2015
11
@orad: Non. La première partie n'est en fait qu'un identifiant pour une validation locale; il n'a même pas besoin d'être une succursale.
SLaks
6
@abhisekp: utilisez la même syntaxe. Pour faire référence à la branche source, utilisez<remote>/<branch>
SLaks
4
@abhisekp: Faites exactement ce que je viens de dire. La branche actuelle est complètement hors de propos.
SLaks
21
Soyez conscient que quiconque est tenté (comme moi) de courir en git push origin :branch2pensant qu'il ne ferait que pousser la branche locale actuelle vers la télécommande branch2, qu'il supprimera plutôt la télécommande branch2! La bonne façon est git push origin HEAD:branch2.
Helder Pereira
72

Certes, cela ne fonctionnera que si c'est une avance rapide de BRANCH2 ou si vous le forcez. La syntaxe correcte pour faire une telle chose est

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

Voir la description d'une "refspec" sur la page de manuel de git push pour plus de détails sur son fonctionnement. Notez également qu'une poussée forcée et une réinitialisation sont des opérations qui "réécrivent l'historique", et ne devraient pas être tentées par les faibles de cœur à moins que vous ne soyez absolument sûr de savoir ce que vous faites en ce qui concerne les référentiels distants et autres les gens qui ont des fourches / clones du même projet.

Ryan Stewart
la source
6
Merci! J'ajouterai simplement que vous pouvez forcer avec git push --force remote local-branch:remote-branch.
Ferran Maylinch
16

C'est très simple. Supposons que vous avez apporté des modifications à votre branche A qui réside à la fois localement et à distance, mais que vous souhaitez transmettre ces modifications à la branche B qui n'existe nulle part.

Étape 01: créer et basculer vers la nouvelle branche B

git checkout -b B

Étape 02: ajouter des modifications dans la nouvelle branche locale

git add. // ou fichier (s) spécifique (s)

Étape 03: valider les modifications

git commit -m "commit_message"

Etape-04: Poussez des modifications à la nouvelle branche B . La commande ci-dessous créera également une nouvelle branche B à distance

git push origine B

Maintenant, vous pouvez vérifier à partir bitbucket que la branche B aura une plus commettras que la branche A . Et quand vous checkout la branche A ces changements ne seront pas là car ils ont été poussés dans la branche B .

Remarque: Si vous avez validé vos modifications dans la branche A et que vous souhaitez ensuite les déplacer dans la nouvelle branche B, vous devrez d'abord réinitialiser ces modifications. #Bon apprentissage

Bilal Ahmed Yaseen
la source
2

Dans mon cas, j'avais un commit local, qui n'a pas été poussé vers origin\master, mais engagé dans ma masterbranche locale . Ce commit local doit maintenant être poussé vers une autre branche.

Avec Git Extensions, vous pouvez faire quelque chose comme ceci:

  • (Créer s'il n'existe pas et) extraire une nouvelle branche, où vous souhaitez pousser votre commit.
  • Sélectionnez le commit dans l'historique, qui devrait être validé et envoyé à cette branche.
  • Faites un clic droit et sélectionnez Cerise duite engager .
  • Appuyez ensuite sur le bouton Cherry pick .
  • Le get de validation sélectionné est appliqué à votre branche extraite. Maintenant, engagez-vous et poussez-le.
  • Vérifiez votre ancienne branche, avec le commit défectueux.
  • Réinitialisez cette branche à l'avant-dernier commit, où tout était ok (sachez ce que vous faites ici!). Vous pouvez le faire via un clic droit sur l'avant-dernier commit et sélectionnez Réinitialiser la branche actuelle ici . Confirmez l'opération, si vous savez ce que vous faites.

Vous pouvez également le faire sur la ligne de commande GIT . Exemple copié de David Christensen :

Je pense que vous trouverez git cherry-pick+ git resetpour être un flux de travail beaucoup plus rapide:

En utilisant votre même scénario, avec "feature" étant la branche avec le commit le plus haut étant incorrect, il serait beaucoup plus facile de faire ceci:

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

Économise pas mal de travail, et c'est le scénario qui a git cherry-pick été conçu pour être géré.

Je noterai également que cela fonctionnera également si ce n'est pas le commit le plus haut; vous avez juste besoin d'un commit pour l'argument à sélectionner, via:

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

essai
la source
2

J'ai obtenu un mauvais résultat avec la git push origin branch1:branch2commande:

Dans mon cas, branch2est supprimé et branch1a été mis à jour avec de nouvelles modifications.

Par conséquent, si vous souhaitez uniquement que les modifications soient activées à branch2partir de la branch1, essayez les procédures ci-dessous:

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

  • Le branch2:git pull origin branch1

  • On branch1: revenir à la validation précédente.

Benyamin Jafari
la source
0

vous pouvez le faire facilement

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
la source
-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
la source
1
Veuillez ajouter quelques explications sur le code.
Nakx
-4

Vous vous êtes engagé sur BRANCH1 et souhaitez vous débarrasser de ce commit sans perdre les modifications? git reset est ce dont vous avez besoin. Faire:

git branch BRANCH2

si vous voulez que BRANCH2 soit une nouvelle branche. Vous pouvez également fusionner cela à la fin avec une autre branche si vous le souhaitez. Si BRANCH2 existe déjà, ignorez cette étape.

Alors fais:

git reset --hard HEAD~3

si vous souhaitez réinitialiser la validation sur la branche que vous avez validée. Cela prend les changements des trois derniers commits.

Procédez ensuite comme suit pour apporter les validations réinitialisées à BRANCH2

git checkout BRANCH2

Cette source a été utile: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

Sasa
la source