No dia-a-dia utilizar recursos das ferramentas certas ajudam a agilizar nosso trabalho, tratando-se de controle de versões o Git tem diversos truques interessantes. Vou resumir de forma rápida alguns comandos que utilizo diariamente, a idéia é concentrar aqui novas dicas que forem aparecendo, então sugestões são bem vindas.
INSTAWEB
Um dos comandos mais úteis e interessantes que tenho utilizado ultimamente para fazer revisão de código ou para ter um histórico do projeto é o “instaweb” que inicia um servidor local onde podemos navegar (http://127.0.0.1:1234/?p=.git;a=shortlog) pelos commits e verificar as diferenças do repositório de uma forma bem simples e clara. É importante lembrar que ao subir o serviço o terminal fica liberado sendo necessário parar o servidor após utilizar senão o processo continuará “rodando”.
git instaweb --httpd webrick
git instaweb --httpd webrick --stop
STASH
O comando “stash” é útil quando estamos trabalhando em algum código que ainda não está concluído e precisamos atualizar o projeto com as últmas atualizações, então colocamos nossas alterações em área isolada com git stash, atualizamos o projeto e aplicamos novamente nossas alterações com git stash apply. Exemplo:
git stash
git stash apply
AMEND
O comando “amend” é utilizado para corrirgir ou re-editar a mensagem do último commit desde que ele não tenha sido enviado para o repositório. Exemplo:
git commit -m "Alguma mensagem errada"
git commit --amend -m "Correção da mensagem"
GREP
Com “grep” encontramos palavras dentro dos arquivos do projeto, combinado com -n é possível saber em qual linha a palavra ou o conjunto delas foi encontrado.
git grep -n "palavra ou frase procurada"
RESET
Reset pode ser utilizado basicamente para duas situações, uma delas é desfazer um commit mantendo as alterações realizadas no código com “–soft” e para desfazer um commit completamente incluindo as alterações com “–hard”. Exemplo:
git reset --soft HEAD~1
git reset --hard HEAD~1
LOG
Temos diversas formas para verificar os logs de commits do projeto, abaixo alguns tipos de formatações para exibí-los. O último “shortlog” mostra a quantidade de commits do projeto.
git log --pretty=oneline --graph --all
git log --pretty=oneline --abbrev-commit
git whatchanged -n 1
git shortlog -s -n
Para complementar, uma dica para mostrar o branch atual no terminal. No arquivo ~/.bashrc no Ubuntu ou ~/.bash_profile no MacOS inclua as linhas abaixo, feche o terminal e abra novamente para que as alterações sejam aplicadas.
export PS1="\[\033[38m\]\u\[\033[32m\] \w \[\033[31m\]\`ruby -e
\"print (%x{git branch 2> /dev/null}.grep(/^\*/).first ||
'').gsub(/^\* (.+)$/, '(\1) ')\"\`\[\033[37m\]$\[\033[00m\] "
O terminal ficará assim:
user ~/projects/blog (master) $
Referências:
http://gitready.com/
http://book.git-scm.com/
http://learn.github.com/p/intro.html
http://book.git-scm.com/4_tracking_branches.html
http://cheat.errtheblog.com/s/git
http://book.git-scm.com/4_ignoring_files.html
Perdi a conta de quantas vezes tive que relembrar qual era o caminho para subir o MongoDB ou para abrir o Shell para fazer alguma pesquisa. Para simplificar configurei o PATH e criei um ALIAS no arquivo .bashrc.
Seguem os passos para fazer isto rapidinho.
Abra o arquivo .bashrc com sudo pelo terminal. Onde “Yourusername” deve ser substituído pelo seu nome de usuário.
sudo gedit /home/Yourusername/.bashrc
Ou simplesmente.
sudo gedit ~/.bashrc
Vá até o final do arquivo e insira as linhas.
#Path configuration to MongoDB
export PATH=$PATH:/opt/mongo/bin/
Antes de salvar e fechar inclua também no mesmo arquivo um alias para inicializar o serviço. Estou considerando que você seguiu este tutorial para instalar o MongoDB, caso contrário é necessário saber onde o MongoDB está instalado e em qual pasta os dados serão armazenados.
#Alias to initialize the MongoDB in the simple way
alias mongod='mongod --dbpath ~/projetos/tools/mongo/data/db'
Feito isto salve o arquivo, feche o terminal e abra novamente para reconhecer as atualizações de configuração e pronto, de qualquer diretório basta digitar mongod para iniciar o Mongo e apenas mongo para abrir o Shell.
Assim como o MySql o MongoDB tem um shell para manipular dados diretamente na base, seguem os comandos (CRUD) básicos para inserir, buscar, atualizar e apagar documentos.
Para inicializar o shell:
/opt/mongo/bin/./mongo
Se tiver algum problema com este comando então faça isto:
cd /opt/mongo/bin/
./mongo
As linhas abaixo serão exibidas:
MongoDB shell version: 1.3.3-
url: test
connecting to: test
type "help" for help
>
Os comandos iniciais são:
| show dbs |
Mostra todas as bases de dados |
| use dbname |
Aponta a váriavel “db” para a base digite no lugar de dbname |
| show collections |
Exibi as coleções da base em uso. As collections “equivalem” as tables nos bancos relacionais. |
| db.collection_name.insert(object) |
Cria um documento |
| db.collection_name.find() |
Exibi os documentos da coleção |
| db.collection_name.update(criteria_object_or_pair_key_value) |
Atualiza um documento com o critério ou chave par/valor definido |
| db.collection_name.remove(criteria_object_or_pair_key_value) |
Remove um ou mais documentos com o critério ou chave par/valor definido |
Vamos à prática para exemplificar os comandos acima. Abaixo estamos verificando as bases existentes, definindo que usaremos a base “local”, confirmando que estamos na base correta e mostrando as coleções que neste caso ainda não existem.
> show dbs
admin
local
>use local
switched to db local
> db
local
>show collections
false
Agora vamos criar uma coleção de documentos chamada “minha_colecao” e inserir alguns dados.
>db.minha_colecao.insert({ nome: "Mauricio", fone: "12345678", idade: 10 })
ObjectId("4b808e9a6eff")
Quando exibimos as coleções novamente temos “minha_colecao” e “system.indexes” sendo a última criada automaticamente.
>show collections
minha_colecao
system.indexes
Podemos verificar nossos documentos criados e inserir outros.
>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Mauricio", "fone" : "5678", "idade" : 10 }
>db.minha_colecao.insert({ nome: "Monet", fone: "000", idade: 100 })
ObjectId("4b912e9a6ef4")
>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Mauricio", "fone" : "5678", "idade" : 10 }
{ "_id" : ObjectId("4b912e9a6ef4"), "nome" : "Monet", "fone" : "000", "idade" : 100 }
Para atualizar os documentos podemos após o hash passar o parâmetro “true” que força uma inserção caso o critério utilizado não seja encontrado.
>db.minha_colecao.update({nome: "Mauricio"}, {nome: "Amorim", fone: "000"}, true)
>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Amorim", "fone" : "000", "idade" : 10 }
{ "_id" : ObjectId("4b912e9a6ef4"), "nome" : "Monet", "fone" : "000", "idade" : 100 }
>db.minha_colecao.update({nome:"Inexistente"},{nome:"Insere novo", fone:"2355"}, true)
>db.minha_colecao.find()
{ "_id" : ObjectId("4b808e9a6eff"), "nome" : "Amorim", "fone" : "000", "idade" : 10 }
{ "_id" : ObjectId("4b912e9a6ef4"), "nome" : "Monet", "fone" : "000", "idade" : 100 }
{ "_id" : ObjectId("4b987e9a6e10"), "nome" : "Insere novo", "fone" : "2355"}
Por último vamos remover todos os documentos seguindo um determinado critério, neste caso o “fone” igual a “000″. Cuidado! Se o parâmetro com um critério não for informado todos os documentos da coleção serão removidos.
>db.minha_colecao.remove({fone: "000"})
>db.minha_colecao.find()
{ "_id" : ObjectId("4b987e9a6eff"), "nome" : "Insere um novo", "fone" : "2355"}
As funções utilizadas acima também podem receber um objeto como parâmetro e seu funcionamento será idêntico.
> xyz = { nome: "Monet", fone: "111", profissao: "artista" }
>db.minha_colecao.insert(xyz)
ObjectId("18b12e9a6ef4")
>db.minha_colecao.find()
{"_id": ObjectId("18b12e9a6ef4"), "nome":"Monet", "fone" : "111", "profissao" : "artista" }
Estes são comandos básicos de manipulação de dados, mais informações podem ser encontradas nas referências abaixo. Recomendo os screencasts do Joon You que são bem práticos.
Referências:
MongoDB DBA Operations
MongoDB Advanced Queries
Screencast – Introduction MongoDB with Joon You
The interactive shell by Kyle