Faria sentido executar git rebase
enquanto preservava os carimbos de data / hora de confirmação?
Acredito que uma conseqüência seria que o novo ramo não terá necessariamente datas de confirmação cronologicamente. Isso é teoricamente possível? (por exemplo, usando comandos de encanamento; apenas curioso aqui)
Se for teoricamente possível, na prática com rebase, é possível não alterar os carimbos de data / hora?
Por exemplo, suponha que eu tenha a seguinte árvore:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Agora, se eu rebase oldbranch
em master
, a data de confirmar as alterações de fevereiro 1984 a junho de 2010. É possível alterar esse comportamento para que a cometer timestamp não é alterado? No final, eu obteria assim:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
Isso faria algum sentido? É permitido ao git ter um histórico em que um commit antigo tenha um commit mais recente como pai?
fonte
git rebase --committer-date-is-author-date SHA
. Veja minha resposta editada abaixoRespostas:
Atualização em junho de 2014: David Fraser menciona nos comentários uma solução também detalhada em " Alterar carimbos de data e hora ao refazer a ramificação do git ", usando a opção
--committer-date-is-author-date
(introduzida inicialmente em janeiro de 2009 no commit 3f01ad6Veja
git am
:(Resposta original, junho de 2012)
Você poderia tentar, para um não-interativo rebase
(desta resposta SO )
Isso é passado para
git am
, que menciona:Para
git rebase
, esta opção é "Incompatível com a opção --interactive".Como você pode alterar o carimbo de data e hora da data de confirmação antiga (com
git filter-branch
), suponho que você possa organizar seu histórico do Git com a ordem da data de confirmação que desejar / precisar, até mesmo configurá-la para o futuro! .Como Olivier menciona em sua pergunta, a data do autor nunca é alterada por uma nova reformulação;
Do livro Pro Git :
Para ser mais claro, neste caso, como comenta Olivier:
fonte
git rebase --ignore-date
não funciona. Ele altera as datas dos confirmados reformulados.--ignore-date
faz o oposto do que eu estava tentando conseguir! Ou seja, apaga o registro de data e hora do autor e o substitui pelo registro de data e hora de confirmação! Portanto, a resposta certa para minha pergunta é: não faça nada, poisgit rebase
na verdade não altera os carimbos de data / hora dos autores por padrão.--committer-date-is-author-date
opção parece deixar o timestamp autor, e definir o timestamp committer ser o mesmo que o timestamp autor original, que é o que Olivier queria ...Se você já estragou as datas de confirmação (talvez com uma nova reformulação) e deseja redefini-las para as datas de autor correspondentes, é possível executar:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
fonte
WARNING: Ref 'refs/heads/master' is unchanged
. Eu estou usando git versão 1.7.9.5 no Linux (64 bits)git rebase --committer-date-is-author-date <base_branch>
Dessa forma, o git redefinirá a data de confirmação apenas para as confirmações aplicadas em <base_branch> (que provavelmente é o mesmo nome do ramo que você usou quando estragou tudo).Uma pergunta crucial de Von C me ajudou a entender o que está acontecendo: quando a sua recuperação, o carimbo de data / hora do emissor muda, mas não o carimbo de data / hora do autor , que de repente tudo faz sentido. Então, minha pergunta não foi realmente precisa o suficiente.
A resposta é que o rebase na verdade não altera os carimbos de data / hora do autor (você não precisa fazer nada por isso), o que me convém perfeitamente.
fonte
Por padrão, o git rebase definirá o registro de data e hora do commit para o horário em que o novo commit é criado, mas mantém o registro de data e hora do autor intacto. Na maioria das vezes, esse é o comportamento desejado, mas em alguns cenários, também não queremos alterar o carimbo de data / hora do commiter. Como podemos conseguir isso? Bem, aqui está o truque que costumo fazer.
Primeiro, verifique se cada um dos commits que você está prestes a reformular possui uma mensagem de commit e um carimbo de data / hora exclusivos do autor (é aqui que o truque precisa de melhorias, mas atualmente atende às minhas necessidades).
Antes da rebase, registre o carimbo de data / hora do autor, o carimbo de data do autor e confirme a mensagem de todas as confirmações que serão rebaseadas em um arquivo.
Então, deixe a rebase real ocorrer.
Por fim, substituímos o registro de data e hora do consolidador atual pelo registrado no arquivo se a mensagem de confirmação for a mesma usando
git filter-branch
.Se algo der errado, faça o checkout
git reflog
ou todos osrefs/original/
árbitros.Além disso, você pode fazer o mesmo com o registro de data e hora do autor.
Por exemplo, se o carimbo de data / hora do autor de algumas confirmações estiver fora de ordem e sem reorganizá-las, queremos que o carimbo de data / hora do autor seja exibido em ordem, os seguintes comandos ajudarão.
fonte