377

ソースコードのリグレッションに取り組んでいます。Git に「パラメーター化された日付/時刻に基づいてソースをチェックアウトしてください」と伝えたいと思います。これは可能ですか?

また、現在のビューには、失いたくない段階的な変更があります。理想的には、現在のソースと、以前の日付に基づいて興味のあるバージョンとの間を行き来したいと考えています。

4

14 に答える 14

429

現在の変更を保持するには

を使用すると、作業をコミットせずに隠しておくことができますgit stash。あなたはgit stash popそれを取り戻すために使うよりも. または、(carleetoが言っgit commitたように)別のブランチにすることもできます。

rev-parse を使用した日付によるチェックアウト

rev-parse次のように使用して、特定の日付までにコミットをチェックアウトできます。

git checkout 'master@{1979-02-26 18:30:00}'

利用可能なオプションの詳細については、 を参照してくださいgit-rev-parse

コメントに記載されているように、このメソッドは reflog を使用して履歴内のコミットを見つけます。デフォルトでは、これらのエントリは 90 日後に期限切れになります。reflog を使用するための構文はそれほど冗長ではありませんが、遡ることができるのは 90 日間だけです。

rev-list を使用した日付によるチェックアウト

reflog を使用しないもう 1 つのオプションはrev-list、特定の時点でコミットを取得するために使用する方法です。

git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`

マージによって取り込まれたバージョンではなく履歴のみが必要な場合は、 --first-parentに注意してください。それはあなたが通常望んでいることです。

于 2011-08-09T02:05:37.667 に答える
148

アンディの解決策は私にはうまくいきません。ここで別の方法を見つけました:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Git: 日付によるチェックアウト

于 2011-12-15T03:40:27.783 に答える
19

これに沿って何かが必要なようです: 日付に基づくGitチェックアウト

つまり、rev-listコミットを検索し、チェックアウトを使用して実際に取得するために使用します。

段階的な変更を失いたくない場合、最も簡単な方法は、新しいブランチを作成し、それらをそのブランチにコミットすることです。ブランチはいつでも切り替えることができます。

編集:リンクがダウンしているので、コマンドは次のとおりです。

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
于 2011-08-09T01:36:56.357 に答える
13

私の場合、この-n 1オプションは機能しません。Windows では、次の一連のコマンドが正常に機能することがわかりました。

git rev-list -1 --before="2012-01-15 12:00" master

これは、指定された日付の適切なコミットの SHA を返します。

git checkout SHA
于 2015-12-08T16:17:41.667 に答える
5

関心のある日付がコミットの日付git rev-parseである場合、@Andy によって提案されたソリューションは正常に機能します。ただし、作成者の日付に基づいてチェックアウトする場合は、コミットを選択するためにその日付を使用するオプションが提供されないため、機能しません。代わりに、以下を使用できます。rev-parse

git checkout $(
  git log --reverse --author-date-order --pretty=format:'%ai %H' master |
  awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 }
)

( awk述語$1 >= "2016-04-12" && $2 >= "11:37"で使用時間も指定したい場合。)

于 2016-08-13T09:43:50.890 に答える
3

ビルド時に正確なバージョンのリポジトリに戻れるようにしたい場合は、ビルド元のコミットにタグを付けるのが最善です。

他の回答は、特定の時点でリポジトリをブランチの最新のコミットに戻す手法を提供しますが、常に十分であるとは限りません。たとえば、ブランチからビルドし、後でブランチを削除するか、後でリベースされたブランチからビルドする場合、ビルド元のコミットは、現在のブランチから git で「到達不能」になる可能性があります。リポジトリが圧縮されると、git 内の到達不能オブジェクトが最終的に削除される可能性があります。

コミットにタグを付けるということは、後でブランチをどうしたとしても (タグを削除しない限り)、到達不能になることはないということです。

于 2015-12-04T22:57:35.227 に答える
1
git rev-list -n 1 --before="2009-07-27 13:37" origin/master

印刷された文字列 (たとえば XXXX) を取得して、次のようにします。

git checkout XXXX
于 2017-05-05T14:38:24.980 に答える