既存のプッシュされていないコミットを変更する方法への答えは?まだ上流にプッシュされていない以前のコミットメッセージを修正する方法を説明します。新しいメッセージは、元のコミットのタイムスタンプを継承します。これは理にかなっているようですが、時間を再設定する方法はありますか?
git commit --amend --reset-author
既存のプッシュされていないコミットを変更する方法への答えは?まだ上流にプッシュされていない以前のコミットメッセージを修正する方法を説明します。新しいメッセージは、元のコミットのタイムスタンプを継承します。これは理にかなっているようですが、時間を再設定する方法はありますか?
git commit --amend --reset-author
回答:
使用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'
インタラクティブなリベースを行い、日付を変更したいコミットの編集を選択できます。たとえば、入力したコミットを修正するためにリベースプロセスが停止した場合:
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
上記の行は、comend commitで使用される環境変数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");
これらすべての提案を1つのコマンドで処理するより良い方法は、
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"
。Git> = 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
、それはgitの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です)。質問、コメント、提案がある場合はお知らせください!
各コミットは、コミッターの日付と作成者の日付の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
。
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日前にリセットされます。
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を取得します(3番目の引数になります)。
brew install coreutils
、GNU 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に修正されます(あいまいな場合は、さらに桁を含めます)。また、エディタウィンドウがポップアップ表示されるので、コミットメッセージを編集できます。
それはあなたが普段気にしている著者の日付です-コミッターの日付については他の答えを見てください。
承認された回答(https://stackoverflow.com/a/454750/72809)を標準のWindowsコマンドラインで実行する場合は、次のコマンドが必要です。
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/へのクレジット
すばらしい答えはたくさんありますが、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