Push commette su un altro ramo


385

È possibile eseguire il commit e il push delle modifiche da un ramo all'altro.

Supponiamo di aver apportato modifiche a BRANCH1 e di volerle inviare a BRANCH2 .

Da BRANCH1 , è valido fare:

git push origin **BRANCH2**

E quindi resettare BRANCH1?

Risposte:


711

Funzionerà quasi.

Quando si spinge in un ramo non predefinito, è necessario specificare il riferimento di origine e il riferimento di destinazione:

git push origin branch1:branch2

O

git push <remote> <branch with new changes>:<branch you are pushing to> 

26
Entrambi branch1e branch2devono essere sul telecomando? Cosa succede se si desidera passare dal locale branch1al telecomando origin branch2?
orad,

11
@orad: No. La prima parte è in realtà solo un identificatore per un commit locale; non ha nemmeno bisogno di essere un ramo.
SLaks

6
@abhisekp: usa la stessa sintassi. Per fare riferimento al ramo di origine, utilizzare<remote>/<branch>
SLaks

4
@abhisekp: fai esattamente quello che ho appena detto. L'attuale ramo è completamente irrilevante.
SLaks,

21
Fai attenzione a chiunque abbia tentato (come me) di correre git push origin :branch2pensando che avrebbe semplicemente spinto l'attuale ramo locale sul telecomando branch2, che avrebbe invece eliminato il telecomando branch2! Il modo corretto è git push origin HEAD:branch2.
Helder Pereira,

72

Certamente, sebbene funzionerà solo se è un avanzamento veloce di BRANCH2 o se lo forzate. La sintassi corretta per fare una cosa del genere è

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

Vedi la descrizione di un "refspec" nella pagina man di git push per maggiori dettagli su come funziona. Si noti inoltre che sia una spinta forzata che un ripristino sono operazioni che "riscrivono la storia" e non dovrebbero essere tentate dai deboli di cuore a meno che non si sia assolutamente sicuri di sapere cosa si sta facendo rispetto a qualsiasi repository remoto e altro persone che hanno forchette / cloni dello stesso progetto.


6
Grazie! Aggiungo solo che puoi forzare git push --force remote local-branch:remote-branch.
Ferran Maylinch,

16

È molto semplice. Supponiamo di aver apportato modifiche al tuo Branch A che risiede sia localmente che da remoto, ma che desideri inviare queste modifiche al Branch B che non esiste da nessuna parte.

Step-01: crea e passa al nuovo ramo B

git checkout -b B

Step-02: aggiungi le modifiche nel nuovo ramo locale

git add. // o file specifici

Step-03: conferma le modifiche

git commit -m "commit_message"

Step-04: spingere le modifiche al nuovo ramo B . Il comando seguente creerà un nuovo ramo B anche in remoto

git push origine B

Ora, è possibile verificare dalla bitbucket che il ramo B avrà un altro commit di ramo A . E quando si checkout il ramo A questi cambiamenti non saranno lì in quanto questi sono stati spinti nel ramo B .

Nota: se hai apportato le modifiche al ramo A e successivamente desideri spostare tali modifiche nel nuovo ramo B, dovrai prima ripristinare quelle modifiche. #HappyLearning


2

Nel mio caso ho avuto un commit locale, che non è stato spinto a origin\master, ma impegnato nella mia masterfiliale locale . Questo commit locale dovrebbe ora essere spinto in un altro ramo.

Con Git Extensions puoi fare qualcosa del genere:

  • (Crea se non esistente e) verifica il nuovo ramo, dove desideri inviare il commit.
  • Seleziona il commit dalla cronologia, che dovrebbe essere eseguito il commit e il push in questo ramo.
  • Fare clic con il tasto destro e selezionare Cherry pick commit .
  • Premere il pulsante di selezione Cherry in seguito.
  • Il commit selezionato viene applicato al ramo estratto. Ora commetti e spingilo.
  • Dai un'occhiata al tuo vecchio ramo, con il commit difettoso.
  • Ripristina duramente questo ramo al secondo ultimo commit, dove tutto era ok (fai attenzione a cosa ci fai qui!). Puoi farlo facendo clic con il pulsante destro del mouse sull'ultimo ultimo commit e selezionare Reimposta ramo corrente su qui . Conferma l'opposizione, se sai cosa stai facendo.

Puoi farlo anche dalla riga di comando GIT . Esempio copiato da David Christensen :

Penso che troverai git cherry-pick+ git resetun flusso di lavoro molto più veloce:

Utilizzando il tuo stesso scenario, con "feature" che è il ramo con il commit più in alto che è errato, sarebbe molto più facile farlo:

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

Risparmia parecchio lavoro ed è lo scenario che è git cherry-pick stato progettato per gestire.

Noterò anche che funzionerà anche se non è il massimo impegno; hai solo bisogno di un commit per l'argomento da scegliere, tramite:

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


2

Ho ottenuto un brutto risultato con il git push origin branch1:branch2comando:

Nel mio caso, branch2viene eliminato ed branch1è stato aggiornato con alcune nuove modifiche.

Pertanto, se si desidera che solo le modifiche vengano attivate branch2dal branch1, provare le procedure seguenti:

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

  • Su branch2:git pull origin branch1

  • On branch1: ripristina il commit precedente.


0

puoi farlo facilmente

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)

-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  


1
Aggiungi una spiegazione del codice.
Nakx,

-4

Ti sei impegnato con BRANCH1 e vuoi sbarazzarti di questo commit senza perdere le modifiche? git reset è quello che ti serve. Fare:

git branch BRANCH2

se vuoi che BRANCH2 sia un nuovo ramo. Puoi anche unire questo alla fine con un altro ramo se vuoi. Se BRANCH2 esiste già, lasciare questo passaggio.

Quindi fa:

git reset --hard HEAD~3

se si desidera reimpostare il commit sul ramo in cui è stato eseguito il commit. Questo prende le modifiche degli ultimi tre commit.

Quindi, procedi come segue per portare i commit reimpostati su BRANCH2

git checkout BRANCH2

Questa fonte è stata utile: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.