Limpe um garfo e reinicie-o a montante

396

Eu peguei um repositório, fiz algumas alterações e parece que estraguei tudo.

Desejo iniciá-lo novamente do zero, usando o atual upstream / master como base para o meu trabalho.
Devo refazer o meu repositório ou excluí-lo?

tampe125
fonte
4
Respostas muito complexas para uma pergunta simples. Basta excluir tudo e clonar o repositório novamente.
Yaza
11
@Yaza, não, isso pode causar problemas ainda maiores em alguns cenários.
Shimmy Weitzhandler
@ shimmy, não se você quiser começar do zero como o OP pediu.
Yaza

Respostas:

796

A solução mais simples seria (usar ' upstream' como o nome remoto referenciando o repositório original bifurcado):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Semelhante a esta página do GitHub, seção "O que devo fazer se estiver em uma situação ruim?" )

Esteja ciente de que você pode perder as alterações feitas na masterramificação (localmente, por causa do reset --hard, e no lado remoto, por causa do push --force).

Uma alternativa seria, se você deseja preservar seus commits master, repeti-los além dos atuais upstream/master.
Substitua a peça de reposição por a git rebase upstream/master. Você ainda precisará forçar o push.
Consulte também " O que devo fazer se estiver em uma situação ruim? "


Uma solução mais completa, fazendo backup do seu trabalho atual (apenas no caso), está detalhada em " Limpeza da ramificação mestre do git e mova algumas confirmações para a nova ramificação ".

Veja também " Puxe novas atualizações do repositório original do GitHub para o repositório bifurcado do GitHub " para ilustrar o que é " upstream".

rio acima


Nota: repositórios recentes do GitHub protegem o masterramo contra push --force.
Portanto, você terá que se proteger masterprimeiro (veja a figura abaixo) e depois protegê-lo depois de pressionar com força .

insira a descrição da imagem aqui


Nota: especificamente no GitHub, agora (fevereiro de 2019) existe um atalho para excluir repositórios bifurcados para solicitações pull que foram mescladas a montante.

VonC
fonte
4
oi, funcionou muito bem! btw a sintaxe de reset correta égit reset --hard upstream/master
tampe125
11
@ tampe125 Excelente. Corrigi a sintaxe de git resetna resposta.
VonC 11/03/12
fatal: 'a montante' não parece ser um repositório git
Benubird
@Benubird que é o nome do controle remoto que faz referência ao repositório original (o que você bifurcou): veja o gráfico e os git remotecomandos " " em stackoverflow.com/a/3903835/6309 .
VonC 13/08/14
Certo, mas não está claro em sua pergunta como configurá-lo, já que por padrão 'upstream' não está definido na linha de comando, como eu peguei no github.
Benubird
31

Amo a resposta do VonC. Aqui está uma versão fácil para iniciantes.

Existe um git remote chamado do originqual tenho certeza de que todos conhecem. Basicamente, você pode adicionar quantos controles remotos forem necessários em um repositório Git. Então, o que podemos fazer é introduzir um novo controle remoto, que é o repositório original e não o garfo. Eu gosto de chamaroriginal

Vamos adicionar repositórios originais ao nosso fork como um controle remoto.

git remote add original https://git-repo/original/original.git

Agora, vamos buscar o repositório original para garantir que tenhamos o código mais recente

git fetch original

Como sugeriu VonC, verifique se estamos no mestre.

git checkout master

Agora, para atualizar nossa bifurcação com o código mais recente no repositório original, tudo o que precisamos fazer é redefinir com força nossa ramificação principal de acordo com o controle remoto original.

git reset --hard original/master

E você está pronto :)

Ahmad Awais
fonte
2
Estou fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.no passo final. Algum conselho?
TomNorway
Parece que isso deixa o estoque na filial remota original. Suponho que esteja faltando uma etapa para redefinir o seu garfo de volta ao controle remoto correto?
precisa saber é o seguinte
11
originalé melhor do que upstream(usado pelos documentos do Github), assim como origin/master"upstream" do local master. Reduz a ambiguidade. Gostaria de saber se é por isso que você o usa?
55568
11
É exatamente por isso que eu uso!
Ahmad Awais
2
Segui estas instruções e agora o status git diz: No mestre de ramificação Seu ramo e 'origem / mestre' divergiram e têm 52 e 5 confirmações diferentes cada, respectivamente. (use "git pull" para mesclar a ramificação remota na sua) - mas eu quero descartar meus 5 commits. Qual é o próximo passo?
user3562927
6

Seguindo a @VonC ótima resposta. A política da sua empresa GitHub pode não permitir 'forçar push' no mestre.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Se você receber uma mensagem de erro como esta, tente as seguintes etapas.

Para redefinir efetivamente seu fork, você precisa seguir estas etapas:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

Abra seu fork no GitHub, em "Configurações -> Ramos -> Ramificação padrão", escolha 'new_master' como o novo ramificação padrão. Agora você pode forçar push no ramo 'master':

git checkout master
git push --force origin

Então você deve definir 'master' como o ramo padrão nas configurações do GitHub. Para excluir 'tmp_master':

git push origin --delete tmp_master
git branch -D tmp_master

Outras respostas que avisam sobre a perda de sua alteração ainda se aplicam, seja cuidadoso.

Hugodby
fonte
4

Como fazer isso 100% através da GUI do Sourcetree

(Nem todo mundo gosta de fazer coisas através da interface de linha de comando git)

Depois de configurado, você só precisará executar as etapas de 7 a 13 a partir de então.

Buscar> ramo principal do checkout> redefinir para o principal> Enviar alterações ao servidor

Passos

  1. Na barra de ferramentas do menu, na parte superior da tela: "Repositório"> "Configurações do repositório"

"Repositório" destacado na barra de menus superior

  1. "Adicionar"

Botão "Adicionar" na parte inferior da caixa de diálogo

  1. Volte ao GitHub e copie o URL do clone.

Botão "Clonar ou baixar" no site do Github, seguido pelo URL do git

  1. Cole o URL no campo "URL / Caminho" e dê um nome que faça sentido. Eu chamei de "mestre". Não marque a caixa de seleção "Controle remoto padrão" . Você não poderá enviar diretamente para este repositório.

Campos "Nome remoto" e "URL / Caminho" destacados na caixa de diálogo "Detalhes remotos"

  1. Pressione "OK" e você deverá vê-lo na sua lista de repositórios agora.

repositório "master" adicionado à lista de repositórios na caixa de diálogo "Configurações do Repositório"

  1. Pressione "OK" novamente e você deverá vê-lo na sua lista de "Remotos".

Repositório "master" destacado na lista de controles remotos na barra lateral

  1. Clique no botão "Buscar" (canto superior esquerdo da área de cabeçalho da árvore de origem)

Botão "Buscar" na área do cabeçalho

  1. Verifique se a caixa de seleção "Buscar todos os controles remotos" está marcada e pressione "ok"

Caixa de seleção "Buscar em todos os controles remotos" realçada na caixa de diálogo "Buscar"

  1. Clique duas vezes na sua ramificação "master" para verificá-la, caso ainda não esteja registrada.

  2. Encontre o commit que você deseja redefinir, se você chamou o repositório "master", provavelmente encontrará o commit com a tag "master / master".

Exemplo de uma confirmação com uma tag "master / master"

  1. Clique com o botão direito do mouse em commit> "Redefinir ramificação atual para este commit".

  2. Na caixa de diálogo, defina o campo "Modo de uso:" como "Descartar todas as alterações na cópia de trabalho" e pressione "OK" (certifique-se de colocar as alterações que não deseja perder em uma ramificação separada primeiro).

Campo "Usando o modo" realçado na caixa de diálogo "Redefinir para confirmar".  Está definido para "descartar todas as alterações das cópias de trabalho"

  1. Clique no botão "Push" (canto superior esquerdo da área do cabeçalho da árvore de origem) para fazer o upload das alterações na sua cópia do repositório.

Botão "Push" na área do cabeçalho

Seu Feito!

Daniel Tonon
fonte