既存のプッシュされていないコミットを変更する方法への答えは? まだ上流にプッシュされていない以前のコミット メッセージを修正する方法を説明します。新しいメッセージは、元のコミットのタイムスタンプを継承します。これは論理的に思えますが、時間を再設定する方法はありますか?
27 に答える
インタラクティブなリベースをedit
実行して、日付を変更したいコミットを選択できます。たとえば、入力したコミットを修正するためにリベースプロセスが停止した場合:
git commit --amend --date="Wed Feb 16 14:00 2011 +0100" --no-edit
PS--date=now
は現在の時刻を使用します。
その後、対話型リベースを続行します。
作成日ではなくコミット日を変更するには:
GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend --no-edit
上記の行GIT_COMMITTER_DATE
は、コミットの修正に使用される環境変数を設定します。
すべてが Git Bash でテストされています。
修正しようとしているコミットの特定のハッシュを設定git filter-branch
する env フィルターと共に使用します。GIT_AUTHOR_DATE
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'
これらすべての提案を 1 つのコマンドで処理するより良い方法は、次のとおりです。
LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
これにより、最後のコミットのコミットと作成者の日付が「今すぐ」に設定されます。
するだけです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
このためのスクリプトと Homebrew パッケージを作成しました。インストールは非常に簡単で、GitHubPotatoLabs/git-redate
ページで見つけることができます。
構文:
git redate -c 3
実行するだけgit redate
で、最新の 5 つのコミットのすべての日付を vim で編集できます (-c
元に戻すコミットの数を指定するオプションもあり、デフォルトは 5 です)。ご質問、ご意見、ご提案がありましたらお知らせください。
すべての回答を読んだ後、インタラクティブにリベースする必要なく、複数のコミットの日付を一度に編集する、より簡潔で便利な方法を思いつきました。
git rebase HEAD~4 --exec "git commit --amend --no-edit --date 'now'"
コミッターと作者の両方の日付を変更します。
前の最後のコミットの場合。
git rebase -i HEAD~2
git commit --amend --date=now
すでに orgin にプッシュしていて、強制的に使用できる場合:
git push --force
プッシュを強制できず、プッシュされた場合、コミットを変更することはできません! .
The following bash function will change the time of any commit on the current branch.
Be careful not to use if you already pushed the commit or if you use the commit in another branch.
# 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"
}
作成日とコミット日の両方を変更するには:
GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
最後のコミットの commit 時間と author 時間の両方を によって受け入れられる時間に変更する便利なエイリアスを次に示します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!"
別のコミットの正確な日付を取得したい場合 (たとえば、コミットをリベース編集し、リベース前の元のバージョンの日付を取得したい場合):
git commit --amend --date="$(git show -s --format=%ai a383243)"
これにより、HEAD コミットの日付が正確にコミット a383243 の日付になるように修正されます (曖昧な点がある場合は数字を増やしてください)。また、エディター ウィンドウがポップアップ表示されるので、コミット メッセージを編集できます。
これは、通常気になる作成者の日付です。コミッターの日付については、他の回答を参照してください。
最後の 3 つのコミットの作成日とコミット日を編集します。
git rebase -i HEAD~3 --committer-date-is-author-date --exec "git commit --amend --no-edit --date=now"
--exec
コマンドはリベースの各行の後に追加され、作成者の日付を で選択できます。--date=...
コミッターの日付は作成者の日付と同じになります。
コードの著作権コメントを真夜中に更新することを確認したかったので、atまたはcronでわずかな遅延の危険を冒したくありませんでした。だから、私はコードをコミットしてから:
GIT_COMMITTER_DATE="Fri Jan 1 00:00:00 2021 +1000" git commit --amend --no-edit --date="Fri Jan 1 00:00:00 2021 +1000"
(あるいは、UTC オフセットを 0 に設定することもあるでしょうか? 決定事項…) これでプッシュできます!
皆さん、あけましておめでとうございます