Git pull até um commit particular


106

Eu quero fazer um, git pullmas apenas até um commit específico.

 A->B->C->D->E->F (Remote master HEAD)

então suponha que meu local masterHEAD aponta para B, e eu quero puxar até E. O que devo fazer ?

Isso não está puxando um commit específico, mas sim um commit específico.



3
git fetche git merge E.
cutucar

No momento, estou em B, por exemplo, mas quero apenas puxar C, E e F. Quero remover D. Obrigado!
Frenkey

@Frenkey você pode fazer merge o master e então remover os últimos três commits e então escolher os dois últimos. Você também pode experimentar o rebase -i para uma fusão git mais controlada
Ninja420,

e se eu só quiser buscar as alterações de C, não incluir as alterações de A e B apenas C? Como eu posso fazer isso?
Vikas Chauhan

Respostas:


120

git pullnada mais é que git fetchseguido por git merge. Então o que você pode fazer é

git fetch remote example_branch

git merge <commit_hash>


O que "Referir a isto" deveria ser?
developerbmw

@Brett Esqueceu de postar o link .. removeu-o inteiramente
unrealsoul007

@ unrealsoul007 isso irá mesclar apenas aquele commit específico, certo? Então, para puxar de B para E, o comando seria git merge <commit_hash C> <commit_hash D> <commit_hash E> certo?
Wim Feijen

7
@WimFeijen git merge Eirá mesclar Ejunto com todos os seus ancestrais Ce D(git sabe disso Ae Bnão precisa ser mesclado porque eles já estavam em seu branch). Se você deseja APENAS as mudanças de, Eentão você deve git cherry-pick E.
neXus

Obrigado pessoal pela resposta, eu estava procurando o mesmo problema.
Akash Bisariya

24

Primeiro, busque os últimos commits do repositório remoto. Isso não afetará sua filial local.

git fetch origin

Em seguida, verifique o branch de rastreamento remoto e faça um registro git para ver os commits

git checkout origin/master
git log

Pegue o hash do commit que você deseja mesclar (ou apenas os primeiros 5 caracteres dele) e mescle esse commit no master

git checkout master
git merge <commit hash>

1
Eu votei contra você porque isso não funciona como anunciado. Em primeiro lugar, com seu método "git fetch origin" ele busca todos os branches remotos (isto deve ser apontado explicitamente, especialmente para pessoas que trabalham em projetos com muitos branches grandes). Segundo, com este método, "git merge <commit hash>" não mescla seu histórico local até o commit desejado, se você estiver de volta ao histórico. Exemplo: Você está localmente no commit 100, você deseja obter até 150, obtendo tudo (com o HEAD remoto em 100).
Marcador de posição

8
@Placeholder, você deve ler o manual git fetchantes de escrever tal absurdo. Além disso, você deve ler a pergunta original e minha resposta. Se você seguir minha resposta, você não estará "de volta na história", como instruo explicitamente o usuário a fazer git checkout master. No geral, por favor, não poste coisas se você não tiver pelo menos 50% de clareza sobre o que faz.
developerbmw

1
Caso não seja óbvio para ninguém, git fetch originbusca explicitamente a origem .
Daniel Farrell

2
Isso funciona perfeitamente e é melhor explicado do que a resposta aceita.
walen

1
Melhor resposta, funcionou perfeitamente
Asfandyar Khan

14

Você também pode puxar o último commit e apenas desfazer até o commit que você deseja:

git pull origin master
git reset --hard HEAD~1

Substitua masterpelo ramo desejado.

Use o git log para ver para qual commit você gostaria de reverter:

git log

Pessoalmente, isso funcionou melhor para mim.

Basicamente, o que isso faz é puxar o último commit, e você reverter manualmente os commits um por um. Use git log para ver o histórico de commits.

Pontos positivos : funciona conforme anunciado. Você não tem que usar commit hash ou pull de branches desnecessários.

Pontos ruins: você precisa reverter os commits em um.

AVISO: Faça commit / stash de todas as suas mudanças locais, porque com --hardvocê você vai perdê-las. Use por sua conta e risco!


3
Não sei por que os votos negativos, essa parece a maneira mais limpa, e assim que você quiser se atualizar, basta puxar, ao contrário de algumas das outras respostas
Mauricio Pasquier Juan

Não faça isso porque não mais votos positivos, a única desvantagem é que você precisa ir ao HEADantes de voltar - e eu não sei o que aconteceria se você tivesse que resolver conflitos. Mas esta solução permite git pull --rebase, e ao contrário do que foi dito, você pode redefinir diretamente para os Ncommits anteriores com git reset --hard HEAD~N(ou seja, para 3 commits, git reset --hard HEAD~3).
Stock Overflaw

Você pode fazer git reset --hard SHAe ele irá redefinir para o commit que você deseja, sem necessidade de contar para trás.
Visya

2

Se você mesclar um commit em seu branch, você deve obter todo o histórico entre eles.

Observar:

$ git init ./
Repositório Git vazio inicializado em /Users/dfarrell/git/demo/.git/
$ echo 'a'> letra
$ git add letter
$ git commit -m 'Letra inicial'
[master (root-commit) 6e59e76] Carta Inicial
 1 arquivo alterado, 1 inserção (+)
 modo de criação 100644 carta
$ echo 'b' >> letra
$ git add letter && git commit -m 'Adicionando letra'
[master 7126e6d] Adicionando carta
 1 arquivo alterado, 1 inserção (+)
$ echo 'c' >> letra; git add letter && git commit -m 'Adicionando letra'
[master f2458be] Adicionando carta
 1 arquivo alterado, 1 inserção (+)
$ echo 'd' >> carta; git add letter && git commit -m 'Adicionando letra'
[master 7f77979] Adicionando carta
 1 arquivo alterado, 1 inserção (+)
$ echo 'e' >> carta; git add letter && git commit -m 'Adicionando letra'
[master 790eade] Adicionando carta
 1 arquivo alterado, 1 inserção (+)
$ git log
commit 790eade367b0d8ab8146596cd717c25fd895302a
Autor: Dan Farrell 
Data: Qui, 16 de julho, 14:21:26 de 2015 -0500

    Adicionando carta

commit 7f77979efd17f277b4be695c559c1383d2fc2f27
Autor: Dan Farrell 
Data: Qui, 16 de julho, 14:21:24 de 2015 -0500

    Adicionando carta

commit f2458bea7780bf09fe643095dbae95cf97357ccc
Autor: Dan Farrell 
Data: Qui, 16 de julho, 14:21:19 2015 -0500

    Adicionando carta

commit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Autor: Dan Farrell 
Data: Qui, 16 de julho, 14:20:52 2015 -0500

    Adicionando carta

commit 6e59e7650314112fb80097d7d3803c964b3656f0
Autor: Dan Farrell 
Data: Qui, 16 de julho, 14:20:33 2015 -0500

    Carta Inicial
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Nota: verificando '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.

Você está no estado de 'HEAD separado'. Você pode olhar ao redor, fazer experiências
alterações e commits, e você pode descartar quaisquer commits que fizer neste
estado sem impactar nenhuma ramificação ao realizar outra verificação.

Se você deseja criar um novo branch para reter os commits que você criou, você pode
faça isso (agora ou mais tarde) usando -b com o comando checkout novamente. Exemplo:

  git checkout -b new_branch_name

HEAD está agora em 7126e6d ... Adicionando carta
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Mudou para um novo ramo 'B'
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
fatal: '790eade367b0d8ab8146596cd717c25fd895302a' não parece ser um repositório git
fatal: não foi possível ler do repositório remoto.

Certifique-se de que possui os direitos de acesso corretos
e o repositório existe.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Atualizando 7126e6d..7f77979
Avanço rápido
 carta | 2 ++
 1 arquivo alterado, 2 inserções (+)
carta de $ cat
uma
b
c
d

1

Eu encontrei a resposta atualizada deste vídeo , a resposta aceita não funcionou para mim.

Primeiro clone o repo mais recente do git (se não tiver) usando git clone <HTTPs link of the project> (ou usando SSH) e depois vá para o branch desejado usando git checkout <branch name> .

Use o comando

git log

para verificar os últimos commits. Copie o shal do commit específico. Então use o comando

git fetch origin <Copy paste the shal here>

Depois de pressionar a tecla Enter. Agora use o comando

git checkout FETCH_HEAD

Agora, o commit particular estará disponível para seu local. Mude qualquer coisa e empurre o código usando git push origin <branch name>. Isso é tudo. Verifique o vídeo para referência.


0

Isso funciona para mim:

git pull origin <sha>

por exemplo

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

Isso puxa 28eb00, ff39e4 e tudo antes, mas não puxa f4d10ad. Ele permite o uso de pull --rebase e respeita as configurações de pull em seu gitconfig. Isso funciona porque você está basicamente tratando 28eb00 como um branch.

Para a versão do git que estou usando, esse método requer um hash de confirmação completo - sem abreviações ou apelidos são permitidos. Você poderia fazer algo como:

[dbn src]$ git pull origin `git rev-parse origin/master^`
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.