Pelo que entendi, o Git não precisa rastrear operações de renomeação / movimentação / cópia de arquivos , então qual é o real objetivo do git mv ? A página de manual não é especialmente descritiva ...
Isso é obsoleto? É um comando interno, não destinado a ser usado por usuários regulares?
mv oldname newname; git add newname; git rm oldname
, também irá dar erradogit mv oldname newname
(veja esta resposta ).git mv
é um pouco diferente domv oldname newname; git add newname; git rm oldname
que, se você fez alterações no arquivo antesgit mv
dele, essas alterações não serão testadas até você criargit add
o novo arquivo.Do GitFaq oficial :
fonte
git mv
e a abordagem manual? Não é óbviogit help mv
.O Git está apenas tentando adivinhar o que você está tentando fazer. Está fazendo todos os esforços para preservar a história ininterrupta. Claro, não é perfeito. Assim,
git mv
você pode ser explícito com sua intenção e evitar alguns erros.Considere este exemplo. Começando com um repositório vazio,
Resultado:
A detecção automática falhou :( Ou foi?
e depois
Agora tente (lembre-se de excluir a
.git
pasta ao experimentar):Por enquanto, tudo bem:
Agora, ninguém é perfeito:
Realmente? Mas é claro...
... e o resultado é o mesmo que acima:
--follow
mostra apenas o histórico completo.Agora, tenha cuidado ao renomear, pois qualquer uma das opções ainda pode produzir efeitos estranhos . Exemplo:
Compare com:
Resultado:
Ups ... Agora, o histórico está voltando para a inicial a em vez da inicial b , o que está errado. Então, quando fizemos dois movimentos por vez, o Git ficou confuso e não acompanhou as alterações corretamente. A propósito, em meus experimentos, o mesmo aconteceu quando eu excluí / criei arquivos em vez de usá-lo
git mv
. Prossiga com cuidado; voce foi avisado...fonte
Como @Charles diz,
git mv
é uma abreviação.A verdadeira questão aqui é "Outros sistemas de controle de versão (por exemplo, Subversion e Perforce) tratam os nomes de arquivos especialmente. Por que o Git não?"
Linus explica em http://permalink.gmane.org/gmane.comp.version-control.git/217 com tato característico:
fonte
Há outro uso que tenho para
git mv
não mencionado acima.Desde a descoberta
git add -p
(modo de correção do git add; consulte http://git-scm.com/docs/git-add ), gosto de usá-lo para revisar as alterações conforme as adiciono ao índice. Assim, meu fluxo de trabalho passa a (1) trabalhar com código, (2) revisar e adicionar ao índice, (3) confirmar.Como se
git mv
encaixa? Se mover um arquivo diretamente e usargit rm
egit add
, todas as alterações serão adicionadas ao índice, e usar git diff para visualizar as alterações será menos fácil (antes de confirmar). Usandogit mv
, no entanto, acrescenta o novo caminho para o índice, mas não as alterações feitas para o arquivo, permitindo assimgit diff
egit add -p
ao trabalho como de costume.fonte
Há um caso de nicho em que
git mv
permanece muito útil: quando você deseja alterar a caixa de um nome de arquivo em um sistema de arquivos que não diferencia maiúsculas de minúsculas. O APFS (mac) e o NTFS (windows) são, por padrão, sem distinção entre maiúsculas e minúsculas (mas preservando maiúsculas e minúsculas).greg.kindel menciona isso em um comentário sobre a resposta de CB Bailey.
Suponha que você esteja trabalhando em um mac e tenha um arquivo
Mytest.txt
gerenciado pelo git. Você deseja alterar o nome do arquivo paraMyTest.txt
.Você poderia tentar:
Oh céus. O Git não reconhece que houve alguma alteração no arquivo.
Você pode contornar isso renomeando o arquivo completamente e renomeando-o novamente:
Viva!
Ou você pode economizar todo esse incômodo usando
git mv
:fonte