Enviar por push para outro ramo


385

É possível confirmar e enviar alterações de um ramo para outro.

Suponha que comprometi alterações no BRANCH1 e quero enviá-las para o BRANCH2 .

Do BRANCH1 , é válido fazer:

git push origin **BRANCH2**

E, em seguida, redefinir FILIAL1?

Respostas:


711

Isso quase funcionará.

Ao enviar para uma ramificação não padrão, você precisa especificar a referência de origem e a referência de destino:

git push origin branch1:branch2

Ou

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

26
Faça os dois branch1e branch2precisa estar no controle remoto? E se você quiser enviar do local branch1para o remoto origin branch2?
orad 07/10/2015

11
@orad: Não. A primeira parte é na verdade apenas um identificador para um commit local; nem precisa ser um ramo.
SLaks

6
@abhisekp: Use a mesma sintaxe. Para se referir à ramificação de origem, use<remote>/<branch>
SLaks

4
@abhisekp: Faça exatamente o que eu acabei de dizer. O ramo atual é completamente irrelevante.
Slaks

21
Esteja ciente de que alguém tentado (como eu) a correr git push origin :branch2pensando que apenas enviaria a ramificação local atual para o controle remoto branch2, que, em vez disso, excluiria o controle remoto branch2! A maneira correta é git push origin HEAD:branch2.
Helder Pereira

72

Certamente, embora funcione apenas se for um avanço rápido do BRANCH2 ou se você forçá-lo. A sintaxe correta para fazer isso é

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

Veja a descrição de um "refspec" na página do manual git push para obter mais detalhes sobre como ele funciona. Observe também que um push de força e uma redefinição são operações que "reescrevem o histórico" e não devem ser tentadas pelos fracos de coração, a menos que você tenha certeza absoluta de que sabe o que está fazendo em relação a quaisquer repositórios remotos e outros pessoas que possuem garfos / clones do mesmo projeto.


6
Obrigado! Vou acrescentar que você pode forçar git push --force remote local-branch:remote-branch.
Ferran Maylinch

16

É muito simples. Suponha que você tenha feito alterações em sua Filial A, que residem local e remotamente, mas você deseja enviar essas alterações para a Filial B, que não existe em nenhum lugar.

Etapa 01: criar e alternar para o novo ramo B

git checkout -b B

Etapa 02: adicionar alterações na nova ramificação local

git add. // ou arquivo (s) específico (s)

Etapa 03: confirmar as alterações

git commit -m "commit_message"

Passo-04: Empurre alterações para o novo ramo B . O comando abaixo criará uma nova ramificação B também remotamente

origem git push B

Agora, você pode verificar a partir bitbucket que o ramo B terá mais uma comprometer de ramo A . E quando você vai fazer o checkout do ramo Uma dessas mudanças não vai estar lá como estes têm sido empurrados para o ramo B .

Nota: Se você confirmou suas alterações na ramificação A e depois deseja mudar essas alterações para a nova ramificação B , será necessário redefinir essas alterações primeiro. #HappyLearning


2

No meu caso, eu tinha um commit local, que não foi enviado origin\master, mas confirmado no meu masterramo local . Essa confirmação local agora deve ser enviada para outra ramificação.

Com as extensões Git, você pode fazer algo assim:

  • (Crie se não existir e) faça check-out da nova ramificação, na qual deseja enviar seu commit.
  • Selecione o commit no histórico, que deve ser confirmado e enviado para este ramo.
  • Clique com o botão direito e selecione Cherry pick commit .
  • Pressione o botão de seleção Cherry depois.
  • O commit selecionado selecionado é aplicado ao seu ramo de check-out. Agora confirme e empurre.
  • Confira seu ramo antigo, com o commit defeituoso.
  • Reinicialize este ramo com força para o segundo último commit, onde tudo estava ok (saiba o que você está fazendo aqui!). Você pode fazer isso clicando com o botão direito do mouse no segundo último commit e selecione Redefinir ramo atual para aqui . Confirme a operação, se você souber o que está fazendo.

Você também pode fazer isso na linha de comando do GIT . Exemplo copiado de David Christensen :

Eu acho que você encontrará git cherry-pick + git resetum fluxo de trabalho muito mais rápido:

Usando o mesmo cenário, com "feature" sendo a ramificação com a confirmação mais alta incorreta, seria muito mais fácil fazer isso:

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

Economiza bastante trabalho e é o cenário que git cherry-pick foi projetado para lidar.

Também observarei que isso funcionará bem se não for o commit mais alto; você só precisa de um commit para o argumento escolher, via:

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


2

Eu tive um resultado ruim com git push origin branch1:branch2 comando:

No meu caso, branch2é excluído ebranch1 foi atualizado com algumas novas alterações.

Portanto, se você quiser apenas as alterações pressionadas a branch2partir de branch1, tente os procedimentos abaixo:

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

  • Ativado branch2:git pull origin branch1

  • Ativado branch1: reverta para a confirmação anterior.


0

você pode fazer isso 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  


11
Por favor, adicione algumas explicações do código.
Nakx 14/02

-4

Você se comprometeu com o BRANCH1 e deseja se livrar desse commit sem perder as alterações? git reset é o que você precisa. Faz:

git branch BRANCH2

se você quiser que o BRANCH2 seja um novo ramo. Você também pode mesclar isso no final com outro ramo, se desejar. Se a FILIAL2 já existir, deixe esta etapa fora.

Então faça:

git reset --hard HEAD~3

se você deseja redefinir a confirmação na ramificação que você confirmou. Isso leva as alterações dos três últimos commits.

Em seguida, faça o seguinte para trazer as confirmações redefinidas para BRANCH2

git checkout BRANCH2

Esta fonte foi útil: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.