Como faço para redefinir o branch master do git para o branch upstream em um repositório bifurcado?

103

Eu baguncei completamente o branch master do meu repositório git bifurcado.

Quero redefinir completamente o branch master que foi enviado ao meu fork com o conteúdo do repositório master upstream. Não tenho interesse em reter quaisquer alterações ou histórico do branch master.

A abordagem mais simples teria sido excluir meu repo e refork bifurcados do projeto upstream. No entanto, tenho trabalho em outras ramificações empurradas que não quero perder.

Assim, como faço para redefinir meu branch master enviado com o master upstream?


git clone https://myrepo.git
cd myrepo
git remote add upstream https://upstream.git
git fetch upstream

Para onde devo ir a partir daqui para redefinir meus branches master locais e remotos com o master upstream?

liberdade de fóssil
fonte

Respostas:

189

Você pode redefinir seu branch master local para a versão upstream e enviá-lo para seu repositório.

Supondo que "upstream" seja o repositório original e "origin" seja seu fork:

# ensures current branch is master
git checkout master

# pulls all new commits made to upstream/master
git pull upstream master

# this will delete all your local changes to master
git reset --hard upstream/master

# take care, this will delete all your changes on your forked master
git push origin master --force

(Você pode definir o repo original como "upstream" com git remote add upstream /url/to/original/repo.)

Johannes Barop
fonte
1
Provavelmente, também deve ser git reset --hard upstream/masterreiniciado o diretório de trabalho. Mas sua resposta está correta, no entanto.
j6t
Não usar "--hard" também funciona, mantendo as alterações locais. Eu faria o hard reset em uma etapa esperada para possivelmente inspecionar o diff.
Johannes Barop
1
Isso foi muito útil.
Aleem S
4
Preciso ligar git fetch upstreamprimeiro
Henry E
3
Como @HenryE observa, deixar de buscar as mudanças upstream primeiro git fetch upstreamnormalmente produz o seguinte erro não legível:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry
5

Isso redefiniria seu branch master com o master upstream e se o branch foi atualizado desde o fork, ele puxaria essas alterações também.

git checkout master 
git reset upstream/master
git pull --rebase upstream master
git push origin master --force

PS: Supondo que Upstream seja o repositório original, enquanto origin é sua cópia.

Bhavesh Gupta
fonte
Parece que você criou seu branch de um commit diferente. O principal motivo para rebase é manter um histórico de projeto linear. Dito isso, você nunca deve rebasear commits uma vez que eles tenham sido publicados em um repositório público porque isso substitui commits antigos por novos. Para obter detalhes, consulte atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167
0

Eu tentei o método assim:

$REPO=<repo>
$ORIGIN=<user>/$REPO
$UPSTREAM=<upstream>/$REPO

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

a saída mostrará um aviso:

fatal: ambiguous argument 'upstream/master': 
unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Portanto, a maneira correta é colocada git pullantes git reset:

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

então a saída será assim:

From github.com:<upstream>/<repo>
 * branch                master     -> FETCH_HEAD
 * [new branch]          master     -> upstream/master
HEAD is now at 7a94b1790 Merge pull request #4237 from <upstream>/...
Current branch master is up to date.
Everything up-to-date.
Chetabahana
fonte