git:git
no way to compare when less than two revisions
Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
— | git:git [17/09/2021 10:48] (atual) – criada - edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Git ====== | ||
+ | //Git// é um sistema de controle de versionamento de código aberto projetado para a manipulação de projetos com rapidez e eficiência. | ||
+ | //Git// é um sistema de controle de versionamento rápido, escalável e distribuído com um conjunto rico de comandos para prover um alto nível de operabilidade. | ||
+ | |||
+ | Este link apresenta as [[infotic: | ||
+ | |||
+ | ===== Instalando ===== | ||
+ | |||
+ | Os binários do Git podem ser obtidos no endereço [[https:// | ||
+ | |||
+ | No Windows é comum o Git ser executado no [[git: | ||
+ | |||
+ | |||
+ | ===== Verificando a versão ===== | ||
+ | Para verificar a versão do Git instalada em sua máquina podemos utilizar o comando | ||
+ | |||
+ | <code bash>$ git --version</ | ||
+ | |||
+ | ===== Clientes gráficos ===== | ||
+ | |||
+ | Apesar do Git ser uma ferramenta de linha de comando, dispomos de alguns programas com interface gráfica para trabalhar com o Git: | ||
+ | |||
+ | * [[git: | ||
+ | * [[gitlab: | ||
+ | |||
+ | ===== Configurando ===== | ||
+ | |||
+ | Para usar o Git você precisa ter no mínimo a sua identidade configurada: | ||
+ | |||
+ | <code bash>$ git config --global user.name | ||
+ | $ git config --global user.email " | ||
+ | |||
+ | |||
+ | Configurações Globais | ||
+ | |||
+ | (mover para página infotic: | ||
+ | |||
+ | Para conseguir acesso aos projetos da TIC em https:// | ||
+ | |||
+ | <code bash> | ||
+ | $ git config --global user.email "< | ||
+ | $ git config --global user.name "< | ||
+ | </ | ||
+ | |||
+ | Onde '' | ||
+ | |||
+ | Crie um par de chaves SSH sem senha caso não tenha uma. Em geral, estarão no diretório '' | ||
+ | |||
+ | <code bash> | ||
+ | $ ssh-keygen | ||
+ | </ | ||
+ | |||
+ | Vá para a sessão SSH Keys de seu perfil do GitLab e crie uma nova chave, copiando o conteúdo de '' | ||
+ | |||
+ | Para não haver conflitos com espaços em branco ao mesclar ramos, caso espaços em branco não sejam relevantes em seu projeto, faça: | ||
+ | |||
+ | <code bash>$ git config –-global core.whitespace nowarn</ | ||
+ | |||
+ | ===== Utilizando ===== | ||
+ | |||
+ | Um repositório Git está contido em um diretório .git, que contem os históricos de revisão e outros metadados. O diretório rastreado pelo repositório, | ||
+ | |||
+ | ==== Obtendo um repositório ==== | ||
+ | |||
+ | * [[git: | ||
+ | * [[git: | ||
+ | |||
+ | |||
+ | ==== Registrando mudanças ==== | ||
+ | |||
+ | Os projetos Git possuem uma área de preparação (//staging area//), um arquivo de índice no diretório '' | ||
+ | |||
+ | === Preparando as mudanças === | ||
+ | |||
+ | | [[git: | ||
+ | | Remover mudanças do índice| '' | ||
+ | | Mostrar mudanças a serem // | ||
+ | |||
+ | Além de [[git: | ||
+ | |||
+ | Mudanças em determinados arquivos e diretórios podem ser [[git: | ||
+ | |||
+ | === Gravando as mudanças === | ||
+ | |||
+ | O comando '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | === Seleção da revisão === | ||
+ | |||
+ | O Git oferece diversas formas de especificar revisões. Muitos comandos Git recebem revisões como argumentos. Um //commit// pode ser identificado por qualquer umas das formas a seguir: | ||
+ | |||
+ | * O código hash do //commit// (todo ou apenas os 7 primeiros dígitos). | ||
+ | * Qualquer rótulo de //commit// como um nome de ramo (// | ||
+ | * O rótulo '' | ||
+ | * Qualquer uma das opções acima combinada com o '' | ||
+ | |||
+ | === Visualizando as mudanças === | ||
+ | |||
+ | O comando a seguir mostra a diferença entre dois // | ||
+ | <code bash>$ git diff HEAD HEAD~3</ | ||
+ | ou entre a área de preparação (//staging area//) e a árvore do diretório de trabalho: | ||
+ | <code bash>$ git diff</ | ||
+ | |||
+ | O comando a seguir mostra o histórico de mudanças: | ||
+ | <code bash>$ git log -p</ | ||
+ | |||
+ | Veja mais [[git: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Ramos ===== | ||
+ | |||
+ | Para ver a lista de ramos e o ramo atual: | ||
+ | |||
+ | <code bash>$ git branch</ | ||
+ | |||
+ | Para ver mais informações sobre os ramos, inclusive se os mesmos estão à frente, atrás, ambos (há modificações locais e no remoto), igual ou é um ramo novo, em relação ao que está nas últimas referências aos ramos | ||
+ | do repositório (pegos no último '' | ||
+ | |||
+ | Para criar um ramo baseado no ramo atual (o novo será idêntico ao atual): | ||
+ | |||
+ | <code bash>$ git checkout -b < | ||
+ | | ||
+ | Para apagar um ramo: | ||
+ | |||
+ | <code bash>$ git branch -d < | ||
+ | | ||
+ | Esse comando não permite apagar um ramo que não tenha sido mesclado em outro. Para apagar mesmo assim, troque o '' | ||
+ | Note que o ramo atual não pode ser o que será apagado. Para isso, é necessário mudar para outro ramo, o que pode ser feito com: | ||
+ | |||
+ | <code bash>$ git checkout < | ||
+ | | ||
+ | Para mesclar dois ramos, faça: | ||
+ | |||
+ | <code bash>$ git merge < | ||
+ | | ||
+ | o que fará com que as mudanças do ramo com '' | ||
+ | |||
+ | Quando há conflitos numa mesclagem, é possível que se queira pegar apenas o que foi feito em um dos ramos e descartar as alterações do outro. Para fazer isso automaticamente, | ||
+ | |||
+ | Caso queira abortar o processo de resolução de conflitos por algum motivo, faça: | ||
+ | |||
+ | <code bash>$ git merge --abort</ | ||
+ | | ||
+ | Infelizmente não é possível abortar uma mesclagem que tenha bem sucedida (sem conflitos) com esse comando. Será necessário fazer um '' | ||
+ | ===== Rebase ===== | ||
+ | |||
+ | Quando se faz mesclagem de ramos, ao olhar o histórico de // | ||
+ | |||
+ | <code bash>$ git checkout A | ||
+ | $ git merge B</ | ||
+ | |||
+ | faz-se: | ||
+ | |||
+ | <code bash>$ git checkout B | ||
+ | $ git rebase A | ||
+ | $ git checkout A | ||
+ | $ git merge B</ | ||
+ | |||
+ | Para simplificar, | ||
+ | |||
+ | <code bash>$ git rebase A B | ||
+ | $ git checkout A | ||
+ | $ git merge B</ | ||
+ | |||
+ | O primeiro comando acima basicamente diz: " | ||
+ | |||
+ | Com '' | ||
+ | |||
+ | **Cuidado!** Não faça '' | ||
+ | |||
+ | Assim como no caso do '' | ||
+ | |||
+ | O '' | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | Esse comando vai permitir alterar os últimos '' | ||
+ | |||
+ | O '' | ||
+ | |||
+ | ===== Alterar Vários Commits de uma vez ===== | ||
+ | |||
+ | Suponha que seja necessário tirar ou adicionar um arquivo em todo o histórico de //commits// do Git, ou ainda alterar informações em um arquivo em todo esse histórico. Isso é possível com o comando '' | ||
+ | |||
+ | Um exemplo importante de uso dele é se um arquivo com uma senha tiver sido comitado por engano; deve-se tirá-lo de todo o histórico do repositório. | ||
+ | |||
+ | Consulte a documentação para conhecer todos os parâmetros e comandos possíveis, para ver as alterações que o comando permite fazer em todo o repositório. | ||
+ | |||
+ | Como as alterações são radicais, rode o comando num ramo de teste e depois redefina (// | ||
+ | ===== Cherry-Pick ===== | ||
+ | |||
+ | // | ||
+ | ramo e jogar em outro. Isso pode ser útil quando apenas se quer pegar uma funcionalidade/ | ||
+ | |||
+ | Para rodar o comando, estando no ramo de destino, faça: | ||
+ | |||
+ | <code bash>$ git cherry-pick < | ||
+ | |||
+ | Ao fazer isso, o //commit// será aplicado no ramo de destino. Ao fazer isso, será criado um | ||
+ | novo //commit// no histórico, com outro //hash//. | ||
+ | |||
+ | ===== Rerere ===== | ||
+ | |||
+ | Muitas vezes a maneira de se resolver conflitos manualmente durante //merges// e //rebases// é semelhante. Portanto, seria interessante que o Git " | ||
+ | |||
+ | <code bash>$ git config --global rerere.enabled true</ | ||
+ | |||
+ | Ao invés de ligar o '' | ||
+ | |||
+ | <code bash>$ git merge</ | ||
+ | |||
+ | ===== Repositório remoto ===== | ||
+ | |||
+ | Para associar o repositório local a um remoto, faça: | ||
+ | |||
+ | <code bash>$ git remote add origin < | ||
+ | |||
+ | onde '' | ||
+ | |||
+ | Para ver a URL do repositório remoto, faça: | ||
+ | |||
+ | <code bash>$ git remote show origin</ | ||
+ | | ||
+ | Para trocar a URL do repositório remoto, faça: | ||
+ | | ||
+ | <code bash>$ git remote set-url origin < | ||
+ | |||
+ | Para acessar algo de um ramo remoto, como para fazer uma comparação, | ||
+ | |||
+ | < | ||
+ | origin/< | ||
+ | </ | ||
+ | |||
+ | Já se quiser criar um repositório local a partir de um remoto, faça: | ||
+ | |||
+ | <code bash>$ git clone [origin] < | ||
+ | | ||
+ | Neste caso, apenas o ramo '' | ||
+ | |||
+ | Para mandar os //commits// no ramo local para o respectivo ramo remoto, faça: | ||
+ | |||
+ | <code bash>$ git push origin < | ||
+ | | ||
+ | Já para mandar os //commits// de todos os ramos locais para os respectivos ramos remotos, faça: | ||
+ | |||
+ | <code bash>$ git push origin --all</ | ||
+ | | ||
+ | Para obter as atualizações do repositório remoto para o correspondente ramo local, faça: | ||
+ | |||
+ | <code bash>$ git pull origin </ | ||
+ | |||
+ | Deve-se usá-lo sempre antes de começar a alterar os arquivo para não ter conflito com a versão que está no repositório remoto. | ||
+ | |||
+ | Já para pegar as atualizações do repositório remoto mas sem atualizar os ramos locais, faça: | ||
+ | |||
+ | <code bash>$ git fetch origin</ | ||
+ | |||
+ | Dessa forma, as alterações vão ficar na referência ao ramos remotos e precisarão ser mescladas ao ramos locais. | ||
+ | |||
+ | Para apagar ramos remotos, quando não precisar mais deles, faça: | ||
+ | |||
+ | <code bash>$ git fetch origin --delete < | ||
+ | |||
+ | **Muito cuidado com esse comando para não apagar um ramo indevidamente!** Todavia, se o ramo tiver sido apagado recentemente, | ||
+ | ===== Desfazer alterações ===== | ||
+ | |||
+ | Para reverter um ou mais //commit//, faça | ||
+ | |||
+ | <code bash>$ git revert < | ||
+ | | ||
+ | onde '' | ||
+ | |||
+ | Para voltar ao //commit// anterior, mas criando um novo //commit//, faça: | ||
+ | |||
+ | <code bash>$ git revert HEAD</ | ||
+ | |||
+ | Para retirar um arquivo que foi marcado para ser comitado, faça: | ||
+ | |||
+ | <code bash>$ git reset HEAD < | ||
+ | | ||
+ | Para fazer um arquivo modificado ser sobrescrito com o conteúdo do último //commit//, faça (cuidado pois todas as modificações serão perdidas!): | ||
+ | |||
+ | <code bash>$ git checkout -- < | ||
+ | |||
+ | Para voltar ao //commit// anterior, mas descartando por completo todas as alterações, | ||
+ | |||
+ | <code bash>$ git reset --hard HEAD</ | ||
+ | | ||
+ | **Cuidado com esse procedimento pois não há como recuperar!** | ||
+ | |||
+ | Já para fazer o ramo atual voltar ao estado de outro ramo, faça: | ||
+ | |||
+ | <code bash>$ git reset --hard < | ||
+ | | ||
+ | |||
+ | ===== Stash ===== | ||
+ | |||
+ | Quando se está no meio de alterações em um ramo e é necessário trocar de ramo para alterá-lo, e depois voltar ao trabalho, não é necessário desfazer tudo ou comitar pela metade no ramo de origem. Existe um comando muito útil que evita essa trabalheira toda. No ramo de origem, faça: | ||
+ | |||
+ | <code bash>$ git stash</ | ||
+ | | ||
+ | Com isso, seu ramo voltará ao estado do último //commit//. As alterações ficarão salvas em uma pilha. Note que é possível fazer vários //stashs//, um em cima do outro, mas é algo que não costuma ser necessário. Agora, é possível fazer as alterações no outro ramo, comitá-las e voltar ao ramo anterior, onde deverá ser feito o comando: | ||
+ | |||
+ | <code bash>$ git stash pop</ | ||
+ | | ||
+ | **Atenção: | ||
+ | Cuidado para não fazer o comando acima no ramo errado. Desfazer esse tipo de erro costuma ser bem complicado. | ||
+ | | ||
+ | Desta forma, as modificações em andamento voltarão e poderão ser continuadas. Com o '' | ||
+ | |||
+ | <code bash>$ git stash apply stash@{i}</ | ||
+ | | ||
+ | onde '' | ||
+ | |||
+ | <code bash>$ git stash drop stash@{i}</ | ||
+ | | ||
+ | ===== Submódulos ===== | ||
+ | |||
+ | Muitas vezes é interessante que um projeto possua código de um outro projeto dentro do diretório. Ou seja, internamente, | ||
+ | |||
+ | <code bash>$ git submodule add < | ||
+ | |||
+ | Com isso, será criada uma pasta dentro do diretório do projeto principal de acordo com o caminho passado, juntamente com o conteúdo do repositório. Se quiser usar o nome padrão do subprojeto, é só omitir o segundo parâmetro. Também será criado um arquivo '' | ||
+ | |||
+ | Ao clonar um projeto com submódulos, | ||
+ | |||
+ | <code bash>$ git submodule init | ||
+ | $ git submodule update</ | ||
+ | ===== Buscas ===== | ||
+ | |||
+ | O '' | ||
+ | |||
+ | Para buscar quando determinada ocorrência passou a ou deixou de existir no repositório, | ||
+ | |||
+ | <code bash>$ git log -S< | ||
+ | |||
+ | |||
+ | |||
+ | ===== Etiquetas ===== | ||
+ | |||
+ | Quando uma versão é lançada, ou seja, quando o conteúdo do ramo '' | ||
+ | |||
+ | Para fazer isso, apenas use o comando: | ||
+ | |||
+ | <code bash>$ git tag -a < | ||
+ | | ||
+ | A //tag// é uma etiqueta e pode ser usada como se fosse um ramo. Porém, não é aconselhável modificá-la e mantê-la com o mesmo nome. Para listar todas as etiquetas, use o comando acima sem nenhum parâmetro. | ||
+ | |||
+ | Para listar todas as //tags//, faça: | ||
+ | |||
+ | <code bash>$ git tag</ | ||
+ | | ||
+ | Uma //tag// não é mandada para o repositório remoto automaticamente. Para fazê-lo (algo altamente recomendável), | ||
+ | |||
+ | <code bash>$ git push origin --tags</ | ||
+ | |||
+ | ===== Apelidos ===== | ||
+ | |||
+ | Com o '' | ||
+ | |||
+ | <code bash>$ git config –global alias.st status | ||
+ | $ git config –global alias.co checkout</ | ||
+ | | ||
+ | Com isso, ao invés de digitar '' | ||
+ | |||
+ | ===== Forks ===== | ||
+ | |||
+ | Suponha que haja um projeto no Git a partir do qual queira iniciar um projeto novo que deve ter o desenvolvimento desvinculado do atual (não querendo fazer mesclagem com o mesmo). Ou seja, serão projetos que seguirão trajetórias distintas. Para isso, é possível fazer um //fork//, gerando um projeto idêntico do atual. | ||
+ | |||
+ | Usando o GitLab, pode-se clicar no botão Fork. | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | Ao fazer isso, terá que mover o projeto para outro // | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | ===== Limpeza ===== | ||
+ | |||
+ | As operações no Git com o tempo podem deixá-lo com vários objetos soltos e arquivos que não estão no repositórios e que não serão usados perdidos. Além disso, há a criação de vários ramos que muitas vezes são criados e ficam esquecidos. Com isso, o Git fica lento e o repositório excessivamente grande. Para resolver o problema, há os comandos: | ||
+ | |||
+ | <code bash>$ git gc --aggressive</ | ||
+ | | ||
+ | para realizar coleta de lixo de objetos soltos. | ||
+ | |||
+ | <code bash>$ git clean -d -f </ | ||
+ | | ||
+ | para remover todos os arquivos que não fazem do repositório. Útil para jogar fora sobras de //build//, etc. | ||
+ | |||
+ | <code bash>$ git clean -f -X</ | ||
+ | | ||
+ | para remover apenas arquivos que são ignorados pelo Git; útil para limpar o diretório sem remover junto arquivos que foram criados manualmente. Com isso é possível, por exemplo, limpar o diretório de todos os arquivos gerados automaticamente (porque eles são ignorados pelo Git), sem apagar arquivos que você mesmo criou, como uma nova classe que ainda não foi comitada. Cuidado com os arquivos de configuração, | ||
+ | |||
+ | Para saber o que será excluído, use o '' | ||
+ | |||
+ | <code bash>$ git remote prune origin</ | ||
+ | | ||
+ | Apaga a referência a ramos do seu '' | ||
+ | |||
+ | ===== Ajuda ===== | ||
+ | |||
+ | Para saber detalhes sobre qualquer comando do Git, faça: | ||
+ | |||
+ | <code bash>$ git < | ||
+ | | ||
+ | ===== Troubleshooting ===== | ||
+ | |||
+ | ==== Forçar sobrescrita do repositório local pelo remoto ==== | ||
+ | |||
+ | <code bash>$ git fetch --all | ||
+ | $ git reset --hard origin/< | ||
+ | |||
+ | ===== Referências ===== | ||
+ | |||
+ | * Git. Disponível em: https:// | ||
+ | * Git - ArchWiki. Disponível em: https:// |
git/git.txt · Última modificação: 17/09/2021 10:48 por 127.0.0.1