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 é:
- Apague o seu fork do osprogramadores no github.
- Crie um novo fork.
- Copie o arquivo do desafio pra um diretório FORA do seu repo.
- Remova o diretório do seu repo.
- Faça o git clone do seu novo fork pro seu computador.
- Crie o diretório, copie o arquivo de volta e mande o commit/push/PR.
Mantenha sempre em mente as instruções acima.