Skip to content

Instantly share code, notes, and snippets.

@marcopaganini
Created September 13, 2020 02:24
Show Gist options
  • Save marcopaganini/346aa35aae9fddb2df83d56a0b1157d1 to your computer and use it in GitHub Desktop.
Save marcopaganini/346aa35aae9fddb2df83d56a0b1157d1 to your computer and use it in GitHub Desktop.
Git reset and squash only upstreams

Nota: explicação longa a frente...

O problema não é usar o mesmo branch. O problema é que você não está resetando o branch antes (pra ficar igual ao upstream/master) antes de começar um novo desafio.

Vamos a um exemplo prático: imagine que você faça o clone do osprogramadores/op-desafios (upstream), e que existam apenas dois commits lá:

002 Desafio de outro alguém
001 Desafio de alguém

Quando você faz o git clone, o seu git local fica igualzinho (dica: use git log --oneline --all pra ver):

002 Desafio de outro alguém
001 Desafio de alguém

Nesse momento, você começa a trabalhar num novo desafio (não importa qual o branch, vamos supor que master, para efeito de simplicidade. Depois do commit e uma correção, o seu repo fica:

301 Correção do meu novo desafio.
300 Meu novo desafio
002 Desafio de outro alguém
001 Desafio de alguém

(note que os números de commit acima são só pra simplificar. Eu coloquei 300 em diante pro local pra ficar claro que é local. Na pratica são hashes. Novamente, use git log --oneline --all pra ver).

Nesse momento, você manda o git push origin/master --force e sobe pro seu fork no github. Você cria o PR. Eu vejo o PR e aprovo, só que quando aprovo, eu faço um rebase + squash, ou seja, eu converto os seus dois commits num só. Nesse momento, o upstream/master (osprogramadores/op-desafios) fica assim:

003 Desafio do Gabriel  <-- note que eu mudei o nome
002 Desafio de outro alguém
001 Desafio de alguém

Repare que o commit 003 agora no upstream é a combinação de dois commits seus (300 e 301). O upstream não tem a mínima ideia do que sejam 300 e 301, já que eles não existem lá.

Nesse momento, voce decide fazer OUTRO desafio (e é aqui que comete o erro!). Você faz mais um submit com um novo desafio. O seu repo fica assim:

400 Mais um desafio novinho!
301 Correção do meu novo desafio.
300 Meu novo desafio
002 Desafio de outro alguém
001 Desafio de alguém

Voce faz o git push origin/master --force e o origin fica igualzinho ao seu repo local. Quando você faz o PR, o que acontece? O master só tem os commits 001, 002 e 003, logo ele ignora o 001 e 002 seus (ele já sabe que tem esses), mas agora você mandou o 300, 301, e o 400. O resultado? No PR aparecem os três commits e os dois arquivos que é o que você vê e naturalmente não é o desejado.

Lembra que eu apontei onde foi o erro? Como a gente faz rebase+squash pra manter o repo principal linear, Ele sempre cria um commit novo a partir dos seus. Logo, você sempre tem que resetar pro upstream antes de começar a trabalhar e se possível fazer um rebase em cima do upstream no final.

Como?

Antes de começar a fazer qualquer coisa, faça o seu repo local uma imagem do upstream:

git remote update
git reset upstream/master --hard

Trabalhe normalmente. Antes de enviar o push, faça: git pull -r upstream master. Isso ai fazer um rebase das suas mudanças pra cima do upstream. Basicamente ele le o upstream pra dentro do seu repo e reaplica suas mudanças em cima dele (como se você tivesse feito tudo de novo em cima do upstream/master).

Uma coisa importante é nunca usar merge (você pode usar, mas tem que entender que ele cria um merge commit. No caso, se eu ver isso eu "achato" o negócio, mas o seu repo vai ficar cheio de "caminhos" por causa deles.

Como sair do buraco atual: Existem algumas maneiras, mas o seu repo está SUPER complicado, logo a maneira mais fácil é:

  1. Apague o seu fork do osprogramadores no github.
  2. Crie um novo fork.
  3. Copie o arquivo do desafio pra um diretório FORA do seu repo.
  4. Remova o diretório do seu repo.
  5. Faça o git clone do seu novo fork pro seu computador.
  6. Crie o diretório, copie o arquivo de volta e mande o commit/push/PR.

Mantenha sempre em mente as instruções acima.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment