Suponha que eu tenha 5 confirmações locais. Quero enviar apenas dois deles para um repositório centralizado (usando um fluxo de trabalho no estilo SVN). Como eu faço isso?
Isso não funcionou:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
Isso acaba forçando todos os 5 commits locais.
Suponho que eu poderia fazer o git reset para desfazer meus commits, seguidos por git stash e git push - mas eu já tenho mensagens de commit escritas e arquivos organizados e não quero refazê-los.
Meu sentimento é que alguma bandeira passada para empurrar ou redefinir funcionaria.
Se ajudar, aqui está minha configuração do git
[ramanujan:~/myrepo/.git]$cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://server/git/myrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
fonte
master~3
. Qualquer referência ao commit "até" desejado é igualmente válida, comoHEAD~3
orHEAD~~~
, ou o SHA específico, ou uma tag que rotula esse commit.git push
...)master
para o lado remoto do refspec, comogit push origin tocommit:newbramch
O que faço é trabalhar em uma filial local chamada "trabalho". Este ramo contém todas as confirmações temporárias (como soluções alternativas ou opções de compilação privadas ou qualquer outra coisa) que eu não pretendo enviar ao repositório upstream. Eu trabalho nessa ramificação e, quando quero confirmar, mudo para a ramificação mestre e escolho as confirmações apropriadas que faço querem se comprometer, em seguida, empurre mestre.
Depois de puxar as alterações do montante para o meu ramo principal, eu
git checkout work
egit rebase master
. Isso reescreve todas as minhas alterações locais para estarem no final da história.Na verdade, estou usando
git svn
esse fluxo de trabalho, portanto, minha operação "push" envolvegit svn dcommit
. Eu também uso otig
que é um visualizador de repositório de GUI de modo de texto agradável, para escolher as confirmações apropriadas para dominar.fonte
work
ramificação. Em seguida, você mescla ramificações específicas paramaster
não perder o histórico delas. Ao trabalhar comwork
, você mescla todos os seus ramos nele. É mais caro, mas pode valer a pena em alguns casos.Por padrão, o git-push empurra todas as ramificações. Quando você faz isso:
Você move para um HEAD desanexado (você não está em nenhum ramo) e envia todos os ramos, incluindo o mestre local (que ainda está onde estava) para o mestre remoto.
A solução manual é:
Se você achar que o comportamento padrão de empurrar todos os ramos é confuso (e perigoso!), Adicione isso ao seu ~ / .gitconfig:
Somente o ramo em que você está é enviado. No seu exemplo (um cabeçalho desanexado), você receberia esta mensagem de erro, em vez de enviar acidentalmente os commits errados:
fonte
Resposta curta:
git push <latest commit SHA1 until you want commits to be pushed>
Exemplos:
git push fc47b2
git push HEAD~2
Resposta longa:
As confirmações são vinculadas como uma cadeia com um mecanismo pai / filho. Assim, enviar um commit na verdade também empurra todos os commit pai para esse commit que não são conhecidos pelo controle remoto. Isso é feito implicitamente quando você
git push
efetua o commit atual: todos os commits anteriores também são enviados porque esse comando é equivalente agit push HEAD
.Portanto, a pergunta pode ser reescrita em Como enviar por push um commit específico e esse commit específico pode ser HEAD ~ 2, por exemplo.
Se as confirmações que você deseja enviar não forem consecutivas, basta reordená-las com um
git rebase -i
antes da solicitação específica .fonte
1) Use "git rebase" para reordenar seus commits, se desejar.
Este comando exibirá algo assim no seu editor (estou usando o vim)
2) Reordene seus seus commits de acordo com sua escolha com uma pasta de corte simples. Suponha que o novo pedido seja
escolher 9781434 commitE
escolher c3d4961 commitC
escolha 4791291 commitA
escolha aa1cefc commitD
escolha a2bdfbd commitB
Faça essas alterações no seu editor e pressione ctrl + O (writeOut)
Ou você também pode usar
Você pode verificar a nova sequência com
3) Agora use
Se apenas uma ramificação no controle remoto (origem) e uma no local (mestre), basta usar
Isso empurrará o commitB e o commitD.
fonte