への回答 - 既存のコミットされていないコミットを変更するにはどうすればいいですか? まだ上流にプッシュされていない以前のコミットメッセージを修正する方法を説明する。新しいメッセージは元のコミットのタイムスタンプを継承します。これは論理的に思えますが、時間を再設定する方法はありますか?
修正しようとしているコミットの特定のハッシュにgit filter-branch
とGIT_AUTHOR_DATE
を設定するenvフィルタと一緒にGIT_COMMITTER_DATE
を使用します。
これにより、それ以降のすべてのハッシュが無効になります。
例:
コミット119f9ecf58069b265ab22f1f97d2b648faf932e0
の dates を変更したい場合は、次のようにして変更できます。
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'
対話的なリベースをして、日付を変更したいコミットに対して edit を選択することができます。たとえば、入力したコミットを修正するためにリベースプロセスが停止した場合は、次のように入力します。
git commit --amend --date="Wed Feb 16 14:00 2011 +0100"
その後は、対話的なリベースを続けます。
_ update _ (studgeekのコメントに応えて):作成者日付の代わりにコミット日を変更する:
GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend
上記の行は、修正コミットで使用される環境変数GIT_COMMITTER_DATEを設定します。
すべてがGit Bashでテストされています。
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
そのためのスクリプトと自作パッケージを書きました。インストールがとても簡単で、GitHub PotatoLabs/git-redate
ページで見つけることができます。
構文:
git redate -c 3
git redate
を実行するだけで、最近の5つのコミットのすべての日付を編集することができます(何回コミットするかのための-c
オプションもあります。デフォルトは5です)。ご質問、ご意見、ご提案がありましたらお知らせください。
各コミットは、2つの日付、コミッター日付と作成者日付に関連付けられています。あなたはこれらの日付を見ることができます:
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"
最初の日付はコミット日、2番目の日付は作成者日付です。
次のコマンドで次のコミットに進みます。
git rebase --continue
すべてのコミットを修正するまでこのプロセスを繰り返します。進行状況をgit status
で確認してください。
theosp の answer を土台にして、私は自分のPATH
に入れるgit-cdc
(変更日コミット用)と呼ばれるスクリプトを書きました。
名前は重要です。PATH
内の任意の場所にgit-xxx
を入力すると、次のように入力できます。
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日前にリセットします。
OS Xの場合、GNU
coreutils
(brew install coreutils
)をインストールし、それをPATH
(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
)に追加してから "2 days ago
"構文を使用することもできます。
git commit --amend --date="now"
これは最後のコミットの日付(タイムスタンプ)を変更します
git commit --amend --date "Thu May 28 18:21:46 2015 +0530"
前回の最後のコミットであれば。
git rebase -i HEAD~2
git commit --amend --date=now
もしあなたがすでにorginにプッシュしていて強制的に使うことができるのなら:
git Push --force
あなたがプッシュを強制できないならば、そしてそれがプッシュされるならば、あなたはコミットを変更することはできません! 。
最後のコミットのコミット時刻と作成者時刻の両方を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!"
次の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"
}
私はこの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]
を実行してください。
別のコミットの正確な日付を取得したい場合(コミットをリベース編集し、元のリベース前のバージョンの日付を保持したいとします)。
git commit --amend --date="$(git show -s --format=%ai a383243)"
これにより、HEAD commitの日付が 正確に / a383243のコミット日に修正されます(あいまいさがある場合は、さらに数字を含めます)。コミットメッセージを編集できるように、エディタウィンドウもポップアップします。
それはあなたが通常気にしているものである作者日付のためのものです - コミッター日付のための他の答えを見てください。
作成者日とコミット日の両方を変更するには
GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
標準の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の ブログ投稿に感謝します 。彼のコードが私にはうまくいかなかったとしても、それは私が正しい解決策を見つけるのを助けました。
素晴らしい答えはたくさんありますが、1日または1か月以内に複数のコミットの日付を変更したい場合、正しい答えが見つかりません。それで私は説明付きでこれのための新しいスクリプトを作成します。それが誰かに役立つことを願っています:
#!/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
コミットがまだプッシュされていない場合は、次のようにします。git commit --amend --date = "Wed Mar 25 10:05:44 2020 +0300"その後、git bashはすでに適用されている日付でエディタを開きます。 VIエディタのコマンドモードで ":wq"と入力して保存するとプッシュできます。