SlideShare uma empresa Scribd logo
1 de 10
Baixar para ler offline
Por Alberto Leal
                                                               http://www.albertoleal.eti.br
                                                                     albertonb@gmail.com
                                                                     twitter.com/albertoleal
                                                                      www.imasters.com.br

Git
12/2009


GIT: Quebrando um commit e cancelando algumas
alterações

Dando seqüência aos posts sobre GIT, aí vai mais uma dica: Como quebrar um
commit e cancelar algumas alterações.

Cenário: Foi feito o push de um commit contendo várias alterações no código. Porém,
após ter sido feito o code review foi detectado que algumas mudanças não seriam mais
necessárias, e/ou deveriam ser implementadas de outra forma. Claro que seria possível
ir no código fonte e ir apagando todas as alterações que foram feitas. Mas, será que
essa “limpeza” sairia às mil maravilhas? Será que o código voltaria a ficar da mesma
forma que antes das alterações terem sido feitas? Acho difícil!

Elaborei um pequeno exemplo, apenas, para tentar ilustrar o cenário acima.

Temos os seguintes commits em nosso Projeto:
Por Alberto Leal
http://www.albertoleal.eti.br
      albertonb@gmail.com
      twitter.com/albertoleal
       www.imasters.com.br
Por Alberto Leal
http://www.albertoleal.eti.br
      albertonb@gmail.com
      twitter.com/albertoleal
       www.imasters.com.br
Por Alberto Leal
                                                                   http://www.albertoleal.eti.br
                                                                         albertonb@gmail.com
                                                                         twitter.com/albertoleal
                                                                          www.imasters.com.br
Repare que foi criado um branch para resolver um defeito. No nosso caso, foi adicionar
um novo campo, País. Mas por algum motivo o registro de idade foi alterado
acidentalmente.

No caso acima, é fácil ir ao arquivo e desfazer as alteração incorreta no campo “idade”
antes de fazer o rebase/merge, eu sei. Mas, tente imaginar códigos reais, complexos,
onde voltar ao código fonte e desfazer as alterações não seria a melhor solução =)

Uma solução para trazer todas as alterações e escolher o que vai ser efetivado para o
merge/rebase é trazer o commit de volta para o stage do git para trabalhar nas alterações.
Para isso, vamos utilizar o comando git format-patch para recuperar os commits. Em
seguida, criaremos um novo branch para trabalharmos nas modificações e finalmente
fazer o rebase com o branch master:

 Alberto:ProjectX Alberto$ git branch
 * Defect123
   master
 Alberto:ProjectX Alberto$ git status
 # On branch master
 nothing to commit (working directory clean)

 Alberto:ProjectX Alberto$ git log
 commit ea4f2953c305b0453fd20f27b3043ebf96d541df
 Author: Alberto Leal <albertonb@gmail.com>
 Date:   Sat May 23 15:42:16 2009 -0300

      Adding new fields

 commit 656236111360762d92f9efacb05e27b5cd067a04
 Author: Alberto Leal <albertonb@gmail.com>
 Date:   Sat May 23 15:41:35 2009 -0300

      Some new changes

 commit 131519b37c1d1415e962d6fd23d4058c93438870
 Author: Alberto Leal <albertonb@gmail.com>
 Date:   Sat May 23 15:40:40 2009 -0300

     Initial Commit
 Alberto:ProjectX Alberto$ git format-patch master
 0001-Some-new-changes.patch
 0002-Adding-new-fields.patch
Por Alberto Leal
                                                               http://www.albertoleal.eti.br
                                                                     albertonb@gmail.com
                                                                     twitter.com/albertoleal
                                                                      www.imasters.com.br
Repare que os patches foram gerados a partir do Defect123 em relação ao branch
master, ou seja, somente as diferenças entre eles.

Para escolher quais as modificações que vão entrar para então fazer o merge/rebase
com o master, é necessário que se crie um novo branch a partir do master - limpo, sem
as modificações de Defect123 e use o comando git apply para aplicar os patches no
stage. Agora que os patches com os últimos commits já foram gerados, chegou a hora
de jogá-los novamente no stage:

 Alberto:ProjectX Alberto$ git checkout master
 Switched to branch "master"
 Alberto:ProjectX Alberto$ git checkout -b Defect123_Changes
 Switched to a new branch "Defect123_Changes"
 Alberto:ProjectX Alberto$ git apply 0001-Some-new-changes.patch
 Alberto:ProjectX Alberto$ git apply 0002-Adding-new-fields.patch
 Alberto:ProjectX Alberto$ git log
 commit 131519b37c1d1415e962d6fd23d4058c93438870
 Author: Alberto Leal &lt;albertonb@gmail.com&gt;
 Date:   Sat May 23 15:40:40 2009 -0300

     Initial Commit
 Alberto:ProjectX Alberto$ git status
 # On branch Defect123_Changes
 # Changed but not updated:
 #   (use "git add &lt;file&gt;..." to update what will be committed)
 #
 #       modified:   config.txt
 #
 # Untracked files:
 #     (use "git add &lt;file&gt;..." to include in what will be
 committed)
 #
 #       0001-Some-new-changes.patch
 #       0002-Adding-new-fields.patch
 no changes added to commit (use "git add" and/or "git commit -a")



Veja que o arquivo config.txt foi alterado. Agora, vamos adicionar as alterações para
serem commitadas, mas para isso vamos utilizar o comando git add -p (similar ao add
interativo):
Por Alberto Leal
                                                                 http://www.albertoleal.eti.br
                                                                       albertonb@gmail.com
                                                                       twitter.com/albertoleal
                                                                        www.imasters.com.br


 Alberto:ProjectX Alberto$ git add -p config.txt
 diff --git a/config.txt b/config.txt
 index ac82771..b36405c 100644
 --- a/config.txt
 +++ b/config.txt
 @@ -1,6 +1,8 @@
  Nome: Alberto Leal
 -email: albertonb@gmail.com
 -idade: 24
 +Email: albertonb@gmail.com
 +Idade: 2423434
  Empresa: IBM
 +Telefone: 12-1234-5678
 +País: Brasil
  Sexo: Masculino
  Estado civil: solteiro
 Stage this hunk [y/n/a/d/s/?]? s
 Split into 2 hunks.
 @@ -1,4 +1,4 @@
  Nome: Alberto Leal
 -email: albertonb@gmail.com
 -idade: 24
 +Email: albertonb@gmail.com
 +Idade: 2423434
  Empresa: IBM
 Stage this hunk [y/n/a/d/j/J/?]? n
 @@ -4,3 +4,5 @@
  Empresa: IBM
 +Telefone: 12-1234-5678
 +País: Brasil
  Sexo: Masculino
  Estado civil: solteiro
 Stage this hunk [y/n/a/d/K/?]? y


Utilizando o comando acima, podemos quebrar as alterações feitas no arquivo
utilizando a opção “s” (split). Após, você informa se deseja adicionar os fragmentos ao
stage, utilizando as opções “y”- yes e “n”- no. Todos os fragmentos que você desejar
adicionar no stage para comitá-lo, utilize a opção “y”. No pequeno exemplo acima,
apenas foi mantido no commit a adição dos novos campos: Telefone e País. A alteração
equivocada no campo “idade”foi eliminada do commit. Só nos resta efetivar as
alterações commitando as mudanças:
Por Alberto Leal
                                                                  http://www.albertoleal.eti.br
                                                                        albertonb@gmail.com
                                                                        twitter.com/albertoleal
                                                                         www.imasters.com.br


 Alberto:ProjectX Alberto$ git commit -m 'Cutting branch'
 Created commit 9e365a2: Cutting branch
  1 files changed, 2 insertions(+), 0 deletions(-)
 Alberto:ProjectX Alberto$ git checkout config.txt
 Alberto:ProjectX Alberto$ cat config.txt
 Nome: Alberto Leal
 email: albertonb@gmail.com
 idade: 24
 Empresa: IBM
 Telefone: 12-1234-5678
 País: Brasil
 Sexo: Masculino
 Estado civil: solteiro


Cuidado para não adicionar o arquivo novamente ao stage (git add config.txt). As
alterações que você fez já estão lá, prontas para serem commitadass. Se você se esquecer
e adicionar o arquivo novamente ao stage, você perderá todas as mudanças que você
fez no add interativo. É aconselhável que, logo após o comando git commit, você
execute git checkout <file>, como mostrado acima. Desse jeito, você pegará o arquivo
que está no repositório atualizado.
Por Alberto Leal
http://www.albertoleal.eti.br
      albertonb@gmail.com
      twitter.com/albertoleal
       www.imasters.com.br
Por Alberto Leal
                                                             http://www.albertoleal.eti.br
                                                                   albertonb@gmail.com
                                                                   twitter.com/albertoleal
                                                                    www.imasters.com.br
Agora, só nos resta fazer o rebase com o branch principal:

 Alberto:ProjectX Alberto$ git checkout master
 Switched to branch "master"
 Alberto:ProjectX Alberto$ git rebase Defect123_Changes
 First, rewinding head to replay your work on top of it...
 Fast-forwarded master to Defect123_Changes.
Por Alberto Leal
http://www.albertoleal.eti.br
      albertonb@gmail.com
      twitter.com/albertoleal
       www.imasters.com.br

Mais conteúdo relacionado

Destaque

Destaque (20)

Bioreca Ecuador
Bioreca EcuadorBioreca Ecuador
Bioreca Ecuador
 
Hazle Fotos A Las Mates
Hazle Fotos A Las MatesHazle Fotos A Las Mates
Hazle Fotos A Las Mates
 
Principais entraves desafios da Saúde do Amapá 2013
Principais entraves desafios da Saúde do Amapá 2013Principais entraves desafios da Saúde do Amapá 2013
Principais entraves desafios da Saúde do Amapá 2013
 
Negocio en las Tics
Negocio en las TicsNegocio en las Tics
Negocio en las Tics
 
Ignacio
IgnacioIgnacio
Ignacio
 
Historia De La TrigonometríA
Historia De La TrigonometríAHistoria De La TrigonometríA
Historia De La TrigonometríA
 
Europa Desde El Cielo
Europa Desde El CieloEuropa Desde El Cielo
Europa Desde El Cielo
 
Mele Ema Jazmin Mariano
Mele  Ema  Jazmin  MarianoMele  Ema  Jazmin  Mariano
Mele Ema Jazmin Mariano
 
educacion slp
educacion slpeducacion slp
educacion slp
 
Programa Ayudas Solidarias - Morropón
Programa Ayudas Solidarias - MorropónPrograma Ayudas Solidarias - Morropón
Programa Ayudas Solidarias - Morropón
 
Apresentação Gonçalo Calcinha APISOLAR
Apresentação Gonçalo Calcinha APISOLARApresentação Gonçalo Calcinha APISOLAR
Apresentação Gonçalo Calcinha APISOLAR
 
3 ZATIA
3 ZATIA3 ZATIA
3 ZATIA
 
Cuadricula2
Cuadricula2Cuadricula2
Cuadricula2
 
Curriculum Vitae
Curriculum  VitaeCurriculum  Vitae
Curriculum Vitae
 
Textos
TextosTextos
Textos
 
Como redactar un_cv_con_impacto
Como redactar un_cv_con_impactoComo redactar un_cv_con_impacto
Como redactar un_cv_con_impacto
 
Nueva York reciclará todos los plásticos rígidos
Nueva York reciclará todos los plásticos rígidosNueva York reciclará todos los plásticos rígidos
Nueva York reciclará todos los plásticos rígidos
 
Historia del abanico_-barbara_chilo-pamelarissardi
Historia del abanico_-barbara_chilo-pamelarissardiHistoria del abanico_-barbara_chilo-pamelarissardi
Historia del abanico_-barbara_chilo-pamelarissardi
 
Enjoy
EnjoyEnjoy
Enjoy
 
Ecuacion primer grado
Ecuacion primer gradoEcuacion primer grado
Ecuacion primer grado
 

Mais de Alberto Leal

Designing the APIs for an internal set of services
Designing the APIs for an internal set of servicesDesigning the APIs for an internal set of services
Designing the APIs for an internal set of servicesAlberto Leal
 
Testing Services Effectively
Testing Services Effectively Testing Services Effectively
Testing Services Effectively Alberto Leal
 
Contribuindo com a comunidade Open Source
Contribuindo com a comunidade Open SourceContribuindo com a comunidade Open Source
Contribuindo com a comunidade Open SourceAlberto Leal
 
Caipira Ágil - Afinal, testes atrasam o desenvolvimento?
Caipira Ágil - Afinal, testes atrasam o desenvolvimento?Caipira Ágil - Afinal, testes atrasam o desenvolvimento?
Caipira Ágil - Afinal, testes atrasam o desenvolvimento?Alberto Leal
 
Guru-Campinas - Continuous integration
Guru-Campinas - Continuous integrationGuru-Campinas - Continuous integration
Guru-Campinas - Continuous integrationAlberto Leal
 
IBM - Apresentando jQuery
IBM - Apresentando jQueryIBM - Apresentando jQuery
IBM - Apresentando jQueryAlberto Leal
 
Utilizando Git em Projetos Com Repositório Centralizado
Utilizando Git em Projetos Com Repositório CentralizadoUtilizando Git em Projetos Com Repositório Centralizado
Utilizando Git em Projetos Com Repositório CentralizadoAlberto Leal
 
Git - O Rebase Pode Te Assustar
Git - O Rebase Pode Te AssustarGit - O Rebase Pode Te Assustar
Git - O Rebase Pode Te AssustarAlberto Leal
 
Prazer,Ruby On Rails
Prazer,Ruby On RailsPrazer,Ruby On Rails
Prazer,Ruby On RailsAlberto Leal
 

Mais de Alberto Leal (11)

Designing the APIs for an internal set of services
Designing the APIs for an internal set of servicesDesigning the APIs for an internal set of services
Designing the APIs for an internal set of services
 
Testing Services Effectively
Testing Services Effectively Testing Services Effectively
Testing Services Effectively
 
Contribuindo com a comunidade Open Source
Contribuindo com a comunidade Open SourceContribuindo com a comunidade Open Source
Contribuindo com a comunidade Open Source
 
O que é dojo
O que é dojoO que é dojo
O que é dojo
 
Caipira Ágil - Afinal, testes atrasam o desenvolvimento?
Caipira Ágil - Afinal, testes atrasam o desenvolvimento?Caipira Ágil - Afinal, testes atrasam o desenvolvimento?
Caipira Ágil - Afinal, testes atrasam o desenvolvimento?
 
Wokshop de Git
Wokshop de Git Wokshop de Git
Wokshop de Git
 
Guru-Campinas - Continuous integration
Guru-Campinas - Continuous integrationGuru-Campinas - Continuous integration
Guru-Campinas - Continuous integration
 
IBM - Apresentando jQuery
IBM - Apresentando jQueryIBM - Apresentando jQuery
IBM - Apresentando jQuery
 
Utilizando Git em Projetos Com Repositório Centralizado
Utilizando Git em Projetos Com Repositório CentralizadoUtilizando Git em Projetos Com Repositório Centralizado
Utilizando Git em Projetos Com Repositório Centralizado
 
Git - O Rebase Pode Te Assustar
Git - O Rebase Pode Te AssustarGit - O Rebase Pode Te Assustar
Git - O Rebase Pode Te Assustar
 
Prazer,Ruby On Rails
Prazer,Ruby On RailsPrazer,Ruby On Rails
Prazer,Ruby On Rails
 

Git Quebrando Um Commit E Cancelando Algumas AlteraçõEs

  • 1. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br Git 12/2009 GIT: Quebrando um commit e cancelando algumas alterações Dando seqüência aos posts sobre GIT, aí vai mais uma dica: Como quebrar um commit e cancelar algumas alterações. Cenário: Foi feito o push de um commit contendo várias alterações no código. Porém, após ter sido feito o code review foi detectado que algumas mudanças não seriam mais necessárias, e/ou deveriam ser implementadas de outra forma. Claro que seria possível ir no código fonte e ir apagando todas as alterações que foram feitas. Mas, será que essa “limpeza” sairia às mil maravilhas? Será que o código voltaria a ficar da mesma forma que antes das alterações terem sido feitas? Acho difícil! Elaborei um pequeno exemplo, apenas, para tentar ilustrar o cenário acima. Temos os seguintes commits em nosso Projeto:
  • 2. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br
  • 3. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br
  • 4. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br Repare que foi criado um branch para resolver um defeito. No nosso caso, foi adicionar um novo campo, País. Mas por algum motivo o registro de idade foi alterado acidentalmente. No caso acima, é fácil ir ao arquivo e desfazer as alteração incorreta no campo “idade” antes de fazer o rebase/merge, eu sei. Mas, tente imaginar códigos reais, complexos, onde voltar ao código fonte e desfazer as alterações não seria a melhor solução =) Uma solução para trazer todas as alterações e escolher o que vai ser efetivado para o merge/rebase é trazer o commit de volta para o stage do git para trabalhar nas alterações. Para isso, vamos utilizar o comando git format-patch para recuperar os commits. Em seguida, criaremos um novo branch para trabalharmos nas modificações e finalmente fazer o rebase com o branch master: Alberto:ProjectX Alberto$ git branch * Defect123 master Alberto:ProjectX Alberto$ git status # On branch master nothing to commit (working directory clean) Alberto:ProjectX Alberto$ git log commit ea4f2953c305b0453fd20f27b3043ebf96d541df Author: Alberto Leal <albertonb@gmail.com> Date: Sat May 23 15:42:16 2009 -0300 Adding new fields commit 656236111360762d92f9efacb05e27b5cd067a04 Author: Alberto Leal <albertonb@gmail.com> Date: Sat May 23 15:41:35 2009 -0300 Some new changes commit 131519b37c1d1415e962d6fd23d4058c93438870 Author: Alberto Leal <albertonb@gmail.com> Date: Sat May 23 15:40:40 2009 -0300 Initial Commit Alberto:ProjectX Alberto$ git format-patch master 0001-Some-new-changes.patch 0002-Adding-new-fields.patch
  • 5. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br Repare que os patches foram gerados a partir do Defect123 em relação ao branch master, ou seja, somente as diferenças entre eles. Para escolher quais as modificações que vão entrar para então fazer o merge/rebase com o master, é necessário que se crie um novo branch a partir do master - limpo, sem as modificações de Defect123 e use o comando git apply para aplicar os patches no stage. Agora que os patches com os últimos commits já foram gerados, chegou a hora de jogá-los novamente no stage: Alberto:ProjectX Alberto$ git checkout master Switched to branch "master" Alberto:ProjectX Alberto$ git checkout -b Defect123_Changes Switched to a new branch "Defect123_Changes" Alberto:ProjectX Alberto$ git apply 0001-Some-new-changes.patch Alberto:ProjectX Alberto$ git apply 0002-Adding-new-fields.patch Alberto:ProjectX Alberto$ git log commit 131519b37c1d1415e962d6fd23d4058c93438870 Author: Alberto Leal &lt;albertonb@gmail.com&gt; Date: Sat May 23 15:40:40 2009 -0300 Initial Commit Alberto:ProjectX Alberto$ git status # On branch Defect123_Changes # Changed but not updated: # (use "git add &lt;file&gt;..." to update what will be committed) # # modified: config.txt # # Untracked files: # (use "git add &lt;file&gt;..." to include in what will be committed) # # 0001-Some-new-changes.patch # 0002-Adding-new-fields.patch no changes added to commit (use "git add" and/or "git commit -a") Veja que o arquivo config.txt foi alterado. Agora, vamos adicionar as alterações para serem commitadas, mas para isso vamos utilizar o comando git add -p (similar ao add interativo):
  • 6. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br Alberto:ProjectX Alberto$ git add -p config.txt diff --git a/config.txt b/config.txt index ac82771..b36405c 100644 --- a/config.txt +++ b/config.txt @@ -1,6 +1,8 @@ Nome: Alberto Leal -email: albertonb@gmail.com -idade: 24 +Email: albertonb@gmail.com +Idade: 2423434 Empresa: IBM +Telefone: 12-1234-5678 +País: Brasil Sexo: Masculino Estado civil: solteiro Stage this hunk [y/n/a/d/s/?]? s Split into 2 hunks. @@ -1,4 +1,4 @@ Nome: Alberto Leal -email: albertonb@gmail.com -idade: 24 +Email: albertonb@gmail.com +Idade: 2423434 Empresa: IBM Stage this hunk [y/n/a/d/j/J/?]? n @@ -4,3 +4,5 @@ Empresa: IBM +Telefone: 12-1234-5678 +País: Brasil Sexo: Masculino Estado civil: solteiro Stage this hunk [y/n/a/d/K/?]? y Utilizando o comando acima, podemos quebrar as alterações feitas no arquivo utilizando a opção “s” (split). Após, você informa se deseja adicionar os fragmentos ao stage, utilizando as opções “y”- yes e “n”- no. Todos os fragmentos que você desejar adicionar no stage para comitá-lo, utilize a opção “y”. No pequeno exemplo acima, apenas foi mantido no commit a adição dos novos campos: Telefone e País. A alteração equivocada no campo “idade”foi eliminada do commit. Só nos resta efetivar as alterações commitando as mudanças:
  • 7. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br Alberto:ProjectX Alberto$ git commit -m 'Cutting branch' Created commit 9e365a2: Cutting branch 1 files changed, 2 insertions(+), 0 deletions(-) Alberto:ProjectX Alberto$ git checkout config.txt Alberto:ProjectX Alberto$ cat config.txt Nome: Alberto Leal email: albertonb@gmail.com idade: 24 Empresa: IBM Telefone: 12-1234-5678 País: Brasil Sexo: Masculino Estado civil: solteiro Cuidado para não adicionar o arquivo novamente ao stage (git add config.txt). As alterações que você fez já estão lá, prontas para serem commitadass. Se você se esquecer e adicionar o arquivo novamente ao stage, você perderá todas as mudanças que você fez no add interativo. É aconselhável que, logo após o comando git commit, você execute git checkout <file>, como mostrado acima. Desse jeito, você pegará o arquivo que está no repositório atualizado.
  • 8. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br
  • 9. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br Agora, só nos resta fazer o rebase com o branch principal: Alberto:ProjectX Alberto$ git checkout master Switched to branch "master" Alberto:ProjectX Alberto$ git rebase Defect123_Changes First, rewinding head to replay your work on top of it... Fast-forwarded master to Defect123_Changes.
  • 10. Por Alberto Leal http://www.albertoleal.eti.br albertonb@gmail.com twitter.com/albertoleal www.imasters.com.br