Как можно изменить временную метку старого коммита в Git? - PullRequest
640 голосов
/ 18 января 2009

Ответы на Как изменить существующие невыдвинутые коммиты? описывают способ изменения предыдущих сообщений коммитов, которые еще не были переданы в восходящий поток. Новые сообщения наследуют временные метки оригинальных коммитов. Это кажется логичным, но есть ли способ также переустановить время?

Ответы [ 18 ]

685 голосов
/ 16 февраля 2011

Вы можете сделать интерактивную перебазировку и выбрать edit для коммита, дату которого вы хотели бы изменить. Когда процесс rebase останавливается для внесения изменений в коммит, который вы вводите, например:

git commit --amend --date="Wed Feb 16 14:00 2011 +0100"

После этого вы продолжаете интерактивную перебазировку.

ОБНОВЛЕНИЕ (в ответ на комментарий Studgeek): изменить дату фиксации вместо даты автора:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend

В приведенных выше строках указана переменная среды GIT_COMMITTER_DATE, которая используется в коммите на изменение.

Все проверено в Git Bash.

480 голосов
/ 18 января 2009

Используйте git filter-branch с фильтром env, который устанавливает GIT_AUTHOR_DATE и GIT_COMMITTER_DATE для конкретного хеша коммита, который вы хотите исправить.

Это аннулирует это и все будущие хэши.

Пример:

Если вы хотите изменить даты коммита 119f9ecf58069b265ab22f1f97d2b648faf932e0, вы можете сделать это примерно так:

git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'
355 голосов
/ 14 марта 2012

Лучший способ обработать все эти предложения в одной команде -

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

Это установит дату последнего коммита и автора в «прямо сейчас»

152 голосов
/ 21 июля 2015

Просто сделай git commit --amend --reset-author --no-edit. Для старых коммитов вы можете сделать интерактивную перебазировку и выбрать edit для коммита, дату которого вы хотите изменить.

git rebase -i <ref>

Затем измените коммит с помощью --reset-author и --no-edit, чтобы изменить дату автора на текущую дату:

git commit --amend --reset-author --no-edit

Наконец, продолжите интерактивный ребаз:

git rebase --continue
98 голосов
/ 17 октября 2016

Я написал скрипт и пакет Homebrew для этого. Супер прост в установке, вы можете найти его на странице GitHub PotatoLabs/git-redate.

Синтаксис:

git redate -c 3

Вам просто нужно запустить git redate, и вы сможете редактировать все даты в vim самых последних 5 коммитов (есть также опция -c для того, сколько коммитов вы хотите вернуть, по умолчанию 5). Дайте мне знать, если у вас есть какие-либо вопросы, комментарии или предложения!

enter image description here

76 голосов
/ 02 февраля 2017

Каждый коммит связан с двумя датами, датой коммиттера и датой автора. Вы можете просмотреть эти даты с:

git log --format=fuller

Если вы хотите изменить дату автора и дату принятия последних 6 коммитов, вы можете просто использовать интерактивную перебазировку:

git rebase -i HEAD~6

.

pick c95a4b7 Modification 1
pick 1bc0b44 Modification 2
pick de19ad3 Modification 3
pick c110e7e Modification 4
pick 342256c Modification 5
pick 5108205 Modification 6

# Rebase eadedca..5108205 onto eadedca (6 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

Для всех коммитов, в которых вы хотите изменить дату, замените pick на edit (или просто e), затем сохраните и закройте редактор.

Теперь вы можете изменить каждый коммит, указав дату автора и дату коммиттера в формате ISO-8601:

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"

Первая дата - это дата коммита, вторая - дата автора.

Затем перейдите к следующему коммиту с:

git rebase --continue

Повторяйте процесс, пока не исправите все свои коммиты. Проверьте вашу прогрессию с git status.

42 голосов
/ 05 июля 2014

Опираясь на theosp * answer , я написал скрипт под названием git-cdc (для фиксации даты изменения), который я вставил в свой PATH.

Имя важно: git-xxx в любом месте вашего PATH позволяет вам набирать:

git xxx
# here
git cdc ... 

Этот скрипт находится в bash, даже в Windows (поскольку Git будет вызывать его из своей среды msys )

#!/bin/bash
# commit
# date YYYY-mm-dd HH:MM:SS

commit="$1" datecal="$2"
temp_branch="temp-rebasing-branch"
current_branch="$(git rev-parse --abbrev-ref HEAD)"

date_timestamp=$(date -d "$datecal" +%s)
date_r=$(date -R -d "$datecal")

if [[ -z "$commit" ]]; then
    exit 0
fi

git checkout -b "$temp_branch" "$commit"
GIT_COMMITTER_DATE="$date_timestamp" GIT_AUTHOR_DATE="$date_timestamp" git commit --amend --no-edit --date "$date_r"
git checkout "$current_branch"
git rebase  --autostash --committer-date-is-author-date "$commit" --onto "$temp_branch"
git branch -d "$temp_branch"

С этим вы можете набрать:

git cdc @~ "2014-07-04 20:32:45"

Это сбрасывает дату автора / коммита коммита до HEAD (@~) к указанной дате.

git cdc @~ "2 days ago"

Это сбрасывает дату автора / коммита коммита до HEAD (@~) в тот же час, но 2 дня назад.


Илья Семенов упоминает в комментариях :

Для OS X вы также можете установить GNU coreutils (brew install coreutils), добавить его в PATH (PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") и затем использовать синтаксис "2 days ago".

26 голосов
/ 07 апреля 2018
git commit --amend --date="now"
26 голосов
/ 02 июня 2015

Это изменяет дату (отметку времени) для последнего коммита

git commit --amend --date "Thu May 28 18:21:46 2015 +0530"

18 голосов
/ 25 апреля 2016

, если это предыдущий последний коммит.

git rebase  -i HEAD~2
git commit --amend --date=now

, если вы уже нажали на orgin и можете принудительно использовать:

git push --force 

если вы не можете форсировать толчок и если он толкается, вы не можете изменить коммит! ,

...