Ramificar de uma consolidação anterior usando Git

1798

Se eu tenho n confirmações, como posso ramificar a partir da confirmação n-3?

Eu posso ver o hash de cada commit.

dole doug
fonte

Respostas:

2547

Você pode criar a ramificação por meio de um hash:

git branch branchname <sha1-of-commit>

Ou usando uma referência simbólica:

git branch branchname HEAD~3

Para fazer o checkout da ramificação ao criá-la, use

git checkout -b branchname <sha1-of-commit or HEAD~3>
CB Bailey
fonte
42
Git 1.8.2, deixe-me usar o sha1 curto para a primeira forma.
precisa saber é o seguinte
53
O @MattFenwick Git permitirá que você use hashes encurtados em todos os lugares onde um hash é permitido, desde que o hash encurtado seja '' único '' no repositório. Portanto, se não funcionou, tente adicionar outro caractere a partir do hash.
Poke
29
Para enviar a nova ramificação corretamente para o servidor .. precisava desta última etapa:git push origin BRANCH_NAME
Gene Bo
3
para iniciar um ramo de <sha1-of-commit>corrida git checkout -b <name-of-branch> <sha1-of-commit>, mas se o ramo já existegit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh
258

Para fazer isso no github.com:

  1. Vá para o seu projeto.
  2. Clique no botão "Confirma".
  3. Clique no <> ("Navegue no repositório neste momento do histórico") na confirmação da qual você deseja ramificar.
  4. Clique em "tree: xxxxxx" no canto superior esquerdo. Logo abaixo da barra de estatísticas do idioma, você terá a opção de "Localizar ou criar filial" (basta digitar um novo nome de filial)Ramificar do commit anterior
OneSolitaryNoob
fonte
4
A questão não é sobre o github, mas sobre o git. A maioria dos servidores git não é github.
Anders Tornblad
46
Apesar do Github não ser o git, ainda foi imensamente útil!
Liz
Infelizmente, ele ainda mostra as alterações de outras submissões, o que eu queria evitar, o que é por isso que eu procurei para esta pergunta
Maxim
83

A mágica pode ser feita pelo git reset .

  1. Crie uma nova ramificação e mude para ela (para que todas as suas confirmações mais recentes sejam armazenadas aqui)

    git checkout -b your_new_branch

  2. Volte para o seu ramo de trabalho anterior (suponha que seja mestre)

    git checkout master

  3. Remova os x commits mais recentes, mantenha o mestre limpo

    git reset --hard HEAD~x # in your case, x = 3

A partir deste momento, todos os x commits mais recentes estão apenas na nova ramificação, e não na sua ramificação anterior (mestre).

Jing Li
fonte
7
Era isso que eu procurava, uma vez que remove os commits do Mestre e faz com que você se lembre de fazer o branch antes que esses commits fossem feitos. Obrigado.
superbeck
7
Só não se esqueça de que um git reset --hardnão é uma boa idéia se você já empurrou a comprometer-se a origem ...
LuisF
1
você pode, git push --force se você já tinha empurrado o ramo antes #
2729 milan
Mas tenha muito cuidado ao usar --force blog.developer.atlassian.com/force-with-lease
peater
74

Se você não tiver certeza de qual confirmação você deseja ramificar antecipadamente, poderá verificar as confirmações e examinar o código delas (consulte fonte, compilação, teste)

git checkout <sha1-of-commit>

Depois de encontrar o commit que você deseja ramificar, você pode fazer isso dentro do commit (ou seja, sem voltar ao mestre primeiro) apenas criando um branch da maneira usual:

git checkout -b <branch_name>
stanm
fonte
22
git checkout -b <branch-name> <sha1-of-commit>
Tyler Long
fonte
1
Como isso é diferente de " git branch branchname <sha1-of-commit>" (da resposta aceita)?
Peter Mortensen
Eu não sei. Eu acho que eles são equivalentes. Eu sempre uso git checkout -bpara criar um novo ramo.
Tyler Long
10
stackoverflow.com/a/7987711/3590629 ramificação git ... cria a ramificação, mas deixa você na ramificação atual. git checkout -b ... cria a ramificação e muda para você.
esme_louise
9

Uma maneira rápida de fazer isso no seu repositório do Github seria a seguinte:

  • Encontre o commit específico do seu ramo
  • Ao lado do ID do SHA, clique em 'Procurar no repositório neste momento da história'
  • Aqui você pode criar uma nova ramificação a partir desse commit insira a descrição da imagem aqui
Vatsal Parekh
fonte
1
Este é realmente desatualizado
regetskcob
2
A questão não é sobre o github.
Anders Tornblad
8

Basta executar:

git checkout -b branch-name <commit>

Por exemplo :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

O checkoutcomando com o parâmetro -bcriará uma nova ramificação E passará para você

d1jhoni1b
fonte
1
Eu gosto muito deste. Obrigado
The Fool
é possível criar uma ramificação com base no commit SHA de uma ramificação de recurso que foi excluída por meio de uma solicitação pull? Ou tenho que ramificar a partir da confirmação da solicitação pull no mestre?
user2966445
execute git fetch& git branchcommand na pasta do seu projeto usando o terminal e verifique se o ramo de recurso existe; se esse for o caso, sim, é claro que você não poderá criar um ramo a partir de ramos excluídos, também poderá reverter uma exclusão de ramo, caso o O ramo se foi #
d1jhoni1b 27/11/19
4

Uma ótima pergunta relacionada é: como diabos você descobre isso usando a --helpopção git? Vamos tentar isso:

git branch --help

Vemos esta saída:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Gobbledegook.

Pesquise no texto subsequente a palavra "confirmar". Encontramos o seguinte:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

Estamos chegando a algum lugar!

Agora, concentre-se nesta linha do gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Condense isso a isso:

git branch <branchname> [<start-point>]

E feito.

Purplejacket
fonte
1
Eu odeio idiota. Obrigado.
Byron Whitlock
4

Para fazer isso no Eclipse:

  • Vá para a perspectiva "Git Repository Explorating".
  • Expanda "Tags" e escolha o commit a partir do qual deseja criar ramificação.
  • Clique com o botão direito do mouse no commit e escolha "Create Branch".
  • Forneça um nome de filial.

Ele criará uma filial local para você. Então, sempre que você enviar suas alterações, sua filial será enviada para o servidor remoto.

Saurabhcdt
fonte
3

Você pode fazer isso no Stash.

  1. Clique no commit
  2. No canto superior direito da tela, clique em "Marcar esta confirmação"
  3. Em seguida, você pode criar o novo ramo a partir da tag que você acabou de criar.
David Ruan
fonte
Que GUI é essa? GitHub?
Ostrichofevil
Atlassian Stash
David Ruan
3

Consegui fazer assim:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

Onde você deve inserir o valor de ignorar. 0 é o mais recente, 1 é o anterior, 2 é o commit antes disso, etc.

Mike Graf
fonte
4
Por que não usar HEAD~1(onde 1 especifica 1 confirmação)?
Jduncanator #
1
Seu caminho é coberto pela resposta selecionada e funciona bem. A minha é uma maneira diferente da resposta selecionada.
Mike Graf
3

Isso cria o ramo com um comando:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Prefiro esse caminho melhor do que os publicados acima, porque ele cria a ramificação imediatamente (não requer um comando de envio extra posteriormente).

Alexander Samoylov
fonte
3

Usando Sourcetree | O jeito mais fácil.

  • Primeiro, faça o checkout do ramo que você deseja realizar o commit específico para criar um novo ramo.
  • Em seguida, observe a barra de ferramentas, selecione Repositório> Filial ... o atalho é Command + Shift + B.
  • E selecione o commit específico que você deseja realizar. E dê um novo nome de filial e crie uma filial!

insira a descrição da imagem aqui

Dary
fonte
finalmente encontrei esta resposta útil. Obrigado
Firda Sahidi
1

Isto é o que eu fiz:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

Nesse caso, 8a75b001096536b3216022484af3026aa9c7bb5bwas e old commit pertencem ao masterramo.

Jaime Montoya
fonte
1

Vá para um commit específico de um repositório git

Às vezes, ao trabalhar em um repositório git, você deseja voltar para um commit específico (revisão) para obter uma captura instantânea do seu projeto em um horário específico. Para fazer tudo isso, é necessário o hash SHA-1 da confirmação, que você pode encontrar facilmente verificando o log com o comando:

git log --abbrev-commit --pretty=oneline

que fornecerá uma lista compacta de todos os commits e a versão curta do hash SHA-1.

Agora que você conhece o hash do commit que deseja acessar, pode usar um dos 2 comandos a seguir:

git checkout HASH

ou

git reset --hard HASH

Verificação de saída

git checkout <commit> <paths>

Diz ao git para substituir o estado atual dos caminhos pelo estado no commit fornecido. Os caminhos podem ser arquivos ou diretórios.

Se nenhum ramo for fornecido, o git assumirá o commit HEAD.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

Se nenhum caminho for especificado, o git se moverá HEADpara o commit fornecido (alterando o commit no qual você está sentado e trabalhando).

git checkout branch //means switching branches.

Redefinir

git reset <commit> //re-sets the current pointer to the given commit.

Se você estiver em uma ramificação (normalmente deveria), HEADe essa ramificação será movida para confirmação.

Se você estiver no HEADestado desconectado , o git reset será movido apenas HEAD. Para redefinir uma ramificação, verifique primeiro.

Se você quiser saber mais sobre a diferença entre git reset e git checkout, recomendo a leitura do blog oficial do git .

Lyes CHIOUKH
fonte
2
obrigado pela sua resposta, FYI: Este: git log --abbrev-commit --pretty=oneline pode ser abreviado paragit log --oneline
Suhaib
0

Selecione Confirmar

Para usuários da GUI do Git, é possível visualizar todo o histórico (se necessário) e clicar com o botão direito do mouse no commit do qual você deseja ramificar e inserir o nome do ramo.

Digite o nome da filial

Visualize toda a história

Ivan
fonte
Isso só funcionará se o usuário utilizar qualquer sistema operacional baseado UI como o Windows & MAC
Saurabhcdt
Está certo. Minha resposta começa especificamente com as palavras "Para usuários da GUI do Git ...". Não dei uma resposta que funcione para todos - isso já está feito. Dei um método alternativo que pode ser mais fácil para muitas pessoas. Acho que a razão pela qual minha resposta não é apreciada é que não é uma solução para todos, mas que já existe com alguns milhares de votos. No entanto, isso não faz minha resposta errada "Para usuários da GUI do Git!". CRIAR NOVA FILIAL existe na GUI. Duvido que eu seja a única pessoa no mundo a usá-lo!
Ivan
0

Para fazer a resposta aceita no Visual Studio 2015 e 2017:

Clique nas alterações

Clique nas alterações (seta vermelha acima)

Clique em Ações para visualizar o histórico

Clique em Ações (seta vermelha acima) e clique em Exibir histórico no menu suspenso

E uma nova guia será aberta:

Guia Histórico

E você deve clicar com o botão direito do mouse no commit anterior ao qual deseja que seu código seja revertido: clique com o botão direito do mouse na confirmação anterior

Escolha fazer check-out de uma nova agência e pronto!

Abaixo, embora não faça parte da pergunta do OP, mas faço muito e este é um passo complicado, pelo menos para mim: se você deseja reverter para um commit anterior, sem fazer checkout de um novo branch, NÃO escolha reverter (! ?); você deve redefinir --mixed ou --hard:

clique com o botão direito do mouse na confirmação anterior e redefina

Marcelo Scofano
fonte
Compartilhe suas respostas em inglês, pois a maioria de nós aqui não fala nem conhece outras línguas estrangeiras além do inglês.
Shamiul Hasan Rumman 13/09/19
@ShamiulHasanRumman, no texto que explica as imagens - geralmente abaixo - eu traduzi o termo apontado Seta Vermelha para o inglês, assim Clique em Ações (seta vermelha acima) Não foi suficiente?
Marcelo Scofano
@MarceloScofano, foi difícil mudar o editor em inglês antes de tirar as capturas de tela?
Andrew Surdu
1
@AndreiSurdu: como nunca precisei fazer isso, esperava que, para mudar para o inglês, tivesse que instalar algum pacote extra. Mas você está certo, ele precisa apenas de uma reinicialização do VS, nenhuma instalação. Tentarei alterar as imagens acima assim que tiver tempo livre.
Marcelo Scofano
0

se você usar a árvore de origem bastante simples.

  • Clique com o botão direito do mouse no commit de onde você precisa criar uma nova ramificação
  • Clique em 'branch'
  • Digite o nome da nova ramificação na caixa de diálogo e clique em 'criar ramificação'
Ibtisam Asif
fonte
0

Se você está procurando uma solução baseada em linha de comando, pode ignorar minha resposta. Eu vou sugerir que você use o GitKraken . É um cliente de interface do usuário extraordinário git. Ele mostra a árvore Git na página inicial. Você pode apenas olhar para eles e saber o que está acontecendo com o projeto. Basta selecionar um commit específico, clicar com o botão direito do mouse e selecionar a opção 'Criar uma ramificação aqui'. Ele fornecerá uma caixa de texto para inserir o nome da filial. Digite o nome do ramo, selecione 'OK' e você está definido. É realmente muito fácil de usar.

Shamiul Hasan Rumman
fonte