푸시되지 않은 기존 커밋을 수정하는 방법에 대한 답변 은 무엇입니까? 아직 업스트림으로 푸시되지 않은 이전 커밋 메시지를 수정하는 방법을 설명합니다. 새 메시지는 원래 커밋의 타임 스탬프를 상속합니다. 이것은 논리적으로 보이지만 시간을 다시 설정하는 방법이 있습니까?
git commit --amend --reset-author
푸시되지 않은 기존 커밋을 수정하는 방법에 대한 답변 은 무엇입니까? 아직 업스트림으로 푸시되지 않은 이전 커밋 메시지를 수정하는 방법을 설명합니다. 새 메시지는 원래 커밋의 타임 스탬프를 상속합니다. 이것은 논리적으로 보이지만 시간을 다시 설정하는 방법이 있습니까?
git commit --amend --reset-author
답변:
수정하려는 커밋의 특정 해시 git filter-branch
를 설정 GIT_AUTHOR_DATE
하고 env 필터와 함께 사용하십시오 GIT_COMMITTER_DATE
.
이것은 그와 모든 미래의 해시를 무효화합니다.
예:
commit 날짜 를 변경하려면 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'
대화식 리베이스를 수행하고 날짜를 변경하려는 커밋에 대한 편집 을 선택할 수 있습니다. 리베이스 프로세스가 커밋을 수정하기 위해 중지되면 다음과 같이 입력하십시오.
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에서 테스트됩니다.
rebase
git commit --amend
+ var fixedDate = strftime(new Date(), "%c"); + var result = shelljs.exec("git commit --amend --date=\"" + fixedDate + "\" --no-edit");
하나의 명령으로 이러한 제안을 모두 처리하는 더 좋은 방법은
LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
그러면 마지막 커밋의 커밋 및 작성자 날짜가 "지금"으로 설정됩니다.
LANG= GIT_COMMITTER_DATE="`date`" git commit --amend --date "`date`"
--date "now"
. 힘내> = 2는 그것을 해석 할 것입니다.
그냥하세요 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
--reset-author
, 그것은 자식의 새로운 1.6.6 (REF gitlog.wordpress.com/2010/01/13/git-1-6-6 )
--reset-author
는 작성자와 작성자 날짜를 모두 지금 재설정합니다.
이를 위해 스크립트와 Homebrew 패키지를 작성했습니다. 설치가 매우 쉽고 GitHub PotatoLabs/git-redate
페이지 에서 찾을 수 있습니다 .
통사론:
git redate -c 3
당신은 실행해야 git redate
하고 가장 최근의 5 커밋의 vim에서 모든 날짜를 편집 할 수 있습니다 ( -c
다시 커밋하려는 커밋 수에 대한 옵션 도 있으며 기본값은 5입니다). 질문, 의견 또는 제안 사항이 있으면 알려주십시오!
각 커밋은 커미터 날짜와 작성자 날짜의 두 날짜와 연결됩니다. 이 날짜를 다음과 같이 볼 수 있습니다.
git log --format=fuller
마지막 6 개의 커밋의 작성자 날짜와 커미터 날짜를 변경하려면 대화식 rebase를 사용하면됩니다.
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
.
git checkout name-of-current-branch
.
--no-edit
in git commit --amend --no-edit --date=2017-10-08T09:51:07
을 사용 하여 기존 커밋 메시지를 유지하십시오.
GIT_COMMITTER_DATE
여기에 설명 된대로 업데이트 할 수도 있습니다. eddmann.com/posts/…
theosp 의 답변 을 바탕으로 , 나는 git-cdc
(변경 날짜 커밋을 위해) 라는 스크립트를 작성했습니다 PATH
.
이름은 중요합니다. git-xxx
어디에서나 PATH
입력 할 수 있습니다.
git xxx
# here
git cdc ...
그 스크립트는 Windows에서도 bash에 있습니다 (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 일 전에 다시 설정됩니다.
Ilya Semenov 는 주석에서 언급 했습니다 .
OS X의 경우 당신은 또한 GNU 설치할 수 있습니다
coreutils
(brew install coreutils
에 추가)를PATH
(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
"사용 후) 및2 days ago
"구문을.
git cdc @~ "2014-07-04 20:32:45
그렇지 않으면 시간을 인식하지 못하므로 시간 00:00:00을 얻습니다 (세번째 인수가됩니다).
brew install coreutils
)를 설치 하고 PATH ( PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
)에 추가 한 다음 "2 일 전"구문을 사용할 수도 있습니다.
2 days ago
"가 작동합니까?
다른 답변은 여러 커밋 날짜를 편집하는 데별로 편리하지 않습니다. 몇 년 후에 기술을 공유하기 위해이 질문으로 돌아 왔습니다.
마지막 4 개의 커밋 날짜를 변경하려면
git rebase -i HEAD~4
exec
필요에 따라 날짜를 수정하기 위해 줄을 삽입하여 다음과 같이 리베이스를 편집하십시오 .
pick 4ca564e Do something
exec git commit --amend --no-edit --date "1 Oct 2019 12:00:00 PDT"
pick 1670583 Add another thing
exec git commit --amend --no-edit --date "2 Oct 2019 12:00:00 PDT"
pick b54021c Add some tests
exec git commit --amend --no-edit --date "3 Oct 2019 12:00:00 PDT"
pick e8f6653 Fix the broken thing
exec git commit --amend --no-edit --date "4 Oct 2019 12:00:00 PDT"
GIT_AUTHOR_DATE
만합니다.
exec git commit --amend --no-edit --date "now"
다음은 마지막 커밋의 커밋 및 작성 시간을 모두 허용되는 시간으로 변경하는 편리한 별칭입니다 date --date
.
[alias]
cd = "!d=\"$(date -d \"$1\")\" && shift && GIT_COMMITTER_DATE=\"$d\" \
git commit --amend --date \"$d\""
용법: git cd <date_arg>
예 :
git cd now # update the last commit time to current time
git cd '1 hour ago' # set time to 1 hour ago
편집 : 다음은 인덱스가 깨끗한 지 (커밋되지 않은 변경 사항 없음) 확인하고 마지막 커밋 메시지를 다시 사용하거나 그렇지 않으면 실패하지 않는 자동화 된 버전입니다.
[alias]
cd = "!d=\"$(date -d \"$1\")\" && shift && \
git diff-index --cached --quiet HEAD --ignore-submodules -- && \
GIT_COMMITTER_DATE=\"$d\" git commit --amend -C HEAD --date \"$d\"" \
|| echo >&2 "error: date change failed: index not clean!"
이전 커밋 날짜를 변경하기 위해이 npm 패키지를 만들었습니다.
https://github.com/bitriddler/git-change-date
샘플 사용법 :
npm install -g git-change-date
cd [your-directory]
git-change-date
수정하려는 커밋을 선택한 다음 새 날짜를 입력하라는 메시지가 표시됩니다.
특정 해시로 커밋을 변경하려면 이것을 실행하십시오. git-change-date --hash=[hash]
다음 bash 함수는 현재 브랜치에서 커밋 시간을 변경합니다.
커밋을 이미 푸시했거나 다른 분기에서 커밋을 사용하는 경우 사용하지 않도록주의하십시오.
# rewrite_commit_date(commit, date_timestamp)
#
# !! Commit has to be on the current branch, and only on the current branch !!
#
# Usage example:
#
# 1. Set commit 0c935403 date to now:
#
# rewrite_commit_date 0c935403
#
# 2. Set commit 0c935403 date to 1402221655:
#
# rewrite_commit_date 0c935403 1402221655
#
rewrite_commit_date () {
local commit="$1" date_timestamp="$2"
local date temp_branch="temp-rebasing-branch"
local current_branch="$(git rev-parse --abbrev-ref HEAD)"
if [[ -z "$date_timestamp" ]]; then
date="$(date -R)"
else
date="$(date -R --date "@$date_timestamp")"
fi
git checkout -b "$temp_branch" "$commit"
GIT_COMMITTER_DATE="$date" git commit --amend --date "$date"
git checkout "$current_branch"
git rebase "$commit" --onto "$temp_branch"
git branch -d "$temp_branch"
}
if [[ -z "$commit" ]]
->if [[ -z "$date_timestamp" ]]
GIT_COMMITTER_DATE=
메소드가 끝날 때 수동 커밋을 지정하여 날짜를 지정하지 않도록 설정 하는 것이 좋습니다 .
다른 커밋의 정확한 날짜를 얻으려면 (예를 들어 커밋을 리베이스 편집하고 원래 프리 리베이스 버전의 날짜를 갖기를 원할 경우) :
git commit --amend --date="$(git show -s --format=%ai a383243)"
이렇게하면 HEAD 커밋 날짜가 커밋 날짜 가 정확히 a383243 이되도록 수정합니다 (모호한 경우 더 많은 숫자 포함). 커밋 메시지를 편집 할 수있는 편집기 창이 나타납니다.
그것은 당신이 일반적으로 관심있는 저작자 날짜입니다-커미터 날짜에 대한 다른 답변을보십시오.
표준 Windows 명령 행에서 허용되는 응답 ( https://stackoverflow.com/a/454750/72809 ) 을 수행 하려면 다음 명령이 필요합니다.
git filter-branch -f --env-filter "if [ $GIT_COMMIT = 578e6a450ff5318981367fe1f6f2390ce60ee045 ]; then export GIT_AUTHOR_DATE='2009-10-16T16:00+03:00'; export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; fi"
노트:
^
) 성공하지 못했습니다.Colin Svingen 의 블로그 게시물에 많은 감사를드립니다 . 그의 코드가 나를 위해 작동하지 않았지만 올바른 솔루션을 찾는 데 도움이되었습니다.
커밋이 아직 푸시되지 않은 경우 다음과 같은 것을 사용할 수 있습니다.
git commit --amend --date=" Wed Mar 25 10:05:44 2020 +0300"
그 후 git bash는 이미 적용된 날짜로 편집기를 열므로 VI 편집기 명령 모드 ": wq"를 입력하여 저장하면됩니다.
--no-edit
옵션을 사용하십시오 .
git push -f
(강제 업데이트)를 사용하여 변경된 커밋을 푸시 할 수 있습니다 . 그러나 부작용이있을 수 있습니다. (특히 많은 사람들이 저장소의 로컬 클론을 가지고있는 경우)
Powershell을 사용하는 사람
git rebase DESIRED_REF^ -i
$commitDateString = "2020-01-22T22:22:22"
$env:GIT_COMMITTER_DATE = $commitDateString
git commit --amend --date $commitDateString
$env:GIT_COMMITTER_DATE = ""
git rebase --continue
https://mnaoumov.wordpress.com/2012/09/23/git-change-date-of-commit/의 크레딧
이미 많은 훌륭한 답변이 있지만 하루 또는 한 달 안에 여러 커밋에 대한 날짜를 변경하고 싶을 때 적절한 답변을 찾지 못했습니다. 그래서 나는 설명과 함께 이것을 위해 새로운 스크립트를 만듭니다. 그것이 누군가를 도울 수 있기를 바랍니다.
#!/bin/bash
# change GIT_AUTHOR_DATE for commit at Thu Sep 14 13:39:41 2017 +0800
# you can change the data_match to change all commits at any date, one day or one month
# you can also do the same for GIT_COMMITTER_DATE
git filter-branch --force --env-filter '
date_match="^Thu, 14 Sep 2017 13+"
# GIT_AUTHOR_DATE will be @1505367581 +0800, Git internal format
author_data=$GIT_AUTHOR_DATE;
author_data=${author_data#@}
author_data=${author_data% +0800} # author_data is 1505367581
oneday=$((24*60*60))
# author_data_str will be "Thu, 14 Sep 2017 13:39:41 +0800", RFC2822 format
author_data_str=`date -R -d @$author_data`
if [[ $author_data_str =~ $date_match ]];
then
# remove one day from author_data
new_data_sec=$(($author_data-$oneday))
# change to git internal format based on new_data_sec
new_data="@$new_data_sec +0800"
export GIT_AUTHOR_DATE="$new_data"
fi
' --tag-name-filter cat -- --branches --tags
날짜가 변경됩니다 :
AuthorDate: Wed Sep 13 13:39:41 2017 +0800