Eu descobri recentemente a patch
opção do git para o add
comando, e devo dizer que é realmente um recurso fantástico. Também descobri que um pedaço grande pode ser dividido em pedaços menores pressionando a stecla, o que aumenta a precisão do commit. Mas e se eu quiser ainda mais precisão, se o pedaço dividido não for pequeno o suficiente?
Por exemplo, considere este pedaço já dividido:
@@ -34,12 +34,7 @@
width: 440px;
}
-/*#field_teacher_id {
- display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
width: 300px;
}
Como posso adicionar a remoção de comentários CSS apenas para a próxima confirmação? A s
opção não está mais disponível!
-
caracteres e o Git reclamou que meu patch não se aplicava.git add -p
e editando um pedaço come
isso, afetaria apenas o que está sendo preparado, não a sua árvore de trabalho.Digamos que sua
example.css
aparência seja assim:Agora vamos mudar os seletores de estilo no bloco do meio e, enquanto estamos nisso, exclua um estilo antigo comentado que não precisamos mais.
Isso foi fácil, agora vamos cometer. Mas espere, eu quero manter a separação lógica das alterações no controle de versão para uma simples revisão passo a passo do código e para que minha equipe e eu possamos pesquisar facilmente o histórico de confirmação para obter detalhes específicos.
A exclusão do código antigo é logicamente separada da outra alteração do seletor de estilo. Vamos precisar de dois commits distintos, então vamos adicionar pedaços para um patch.
Opa, parece que as mudanças estão muito próximas, então o git as juntou.
Mesmo tentando dividi- lo pressionando stem o mesmo resultado, porque a divisão não é granular o suficiente para nossas alterações de precisão. Linhas inalteradas são necessárias entre as linhas alteradas para que o git possa dividir automaticamente o patch.
Então, vamos editá- lo manualmente pressionandoe
O git abrirá o patch em nosso editor de escolha.
Vamos revisar o objetivo:
Queremos dividir isso em dois commits:
A primeira confirmação envolve a exclusão de algumas linhas (remoção de comentários).
Para remover as linhas comentadas, deixe-as em paz, elas já estão marcadas para rastrear as exclusões no controle de versão como queremos.
-/*#field_teacher_id {
- display: block;
-} */
O segundo commit é uma alteração, que é rastreada pelo registro de exclusões e adições:
Exclusões (linhas de seleção antigas removidas)
Para manter as linhas antigas do seletor (não as exclua durante este commit), queremos ...
... o que significa literalmente substituir os
-
sinais de menos por umcaractere de espaço .
Então, essas três linhas ...
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
... se tornará ( observe o espaço único na primeira de todas as 3 linhas):
form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
Adições (nova linha de seleção adicionada)
Para não prestar atenção à nova linha de seletor adicionada durante esse commit, queremos ...
... o que significa literalmente excluir toda a linha:
+#user-register form.table-form .field-type-checkbox label {
(Bônus: se você estiver usando o vim como seu editor, pressione ddpara excluir uma linha. Usuários do Nano pressione Ctrl+ K)
Seu editor deve ficar assim quando você salvar:
Agora vamos cometer.
E só para ter certeza, vamos ver as alterações desde o último commit.
Perfeito - você pode ver que apenas as exclusões foram incluídas nesse commit atômico. Agora vamos terminar o trabalho e comprometer o resto.
Finalmente, você pode ver que o último commit inclui apenas as alterações do seletor.
fonte
+
por#
. O resultado é o mesmo, mas talvez você não se sinta à vontade ao excluir (e não possa reverter) ou queira experimentar antes de salvar.r
#
acabou o plus xDSe você pode usar o git gui, ele permite que você defina as alterações linha por linha. Infelizmente, não sei como fazer isso na linha de comando - ou mesmo se for possível.
Uma outra opção que usei no passado é reverter parte da mudança (manter o editor aberto), confirmar os bits que quero, desfazer e salvar novamente a partir do editor. Não é muito elegante, mas faz o trabalho. :)
EDIT (uso do git-gui):
Não tenho certeza se o git-gui é o mesmo nas versões msysgit e linux, usei apenas o msysgit. Mas, supondo que seja o mesmo, quando você o executa, existem quatro painéis: o painel superior esquerdo é o seu diretório de trabalho alterado, o inferior esquerdo é o seu estágio, o superior direito é o diff do arquivo selecionado (seja dir de trabalho ou encenado), e o canto inferior direito é para a descrição do commit (suspeito que você não precise dele). Quando você clica em um arquivo no canto superior direito, verá o diff. Se você clicar com o botão direito do mouse em uma linha de diferenças, verá um menu de contexto. As duas opções a serem observadas são "estágio hunk para confirmação" e "linha de estágio para confirmação". Você continua selecionando "linha de estágio para confirmação" nas linhas que deseja confirmar e está pronto. Você pode até selecionar várias linhas e prepará-las, se desejar.
Quanto à confirmação, você pode usar a ferramenta GUI ou a linha de comando.
fonte
git-gui
mas não tenho idéia de como conseguir o que você está descrevendo.Uma maneira de fazer isso é pular o pedaço, o
git add
que mais você precisar, e depois executargit add
novamente. Se esse for o único pedaço, você poderá dividi-lo.Se você está preocupado com a ordem dos commits, use
git rebase -i
.fonte
git add -p
novamente, mas não posso dividi-lo. Eu entendi:Stage this hunk [y,n,q,a,d,/,e,?]?
e depois pressionar 's' imprime a ajuda. BTW, você quis dizeradd patch
, nãopatch add
? Ou existe umgit patch
plugin que devo instalar?git rebase -i
. Que é mais flexível do quecommit --amend