web-dev-qa-db-ja.com

日付ごとにGitでチェックアウトする方法は?

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

また、現在の見解では、失いたくない変更を段階的に行っています。理想的には、現在のソースと、以前の日付に基づいて興味のあるバージョンとの間で前後に切り替えたいと思います。

265
Amir Afghani

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

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に注意してください。それは通常あなたが望むものです。

309
Andy

Andyのソリューションは私には機能しません。ここで私は別の方法を見つけました:

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

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

107
Rocky

この行に沿って何かが必要なようです: Git checkout based on date

つまり、rev-listを使用してコミットを検索し、次にcheckoutを使用して実際にコミットを取得します。

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

編集:リンクがダウンしているため、次のコマンドを使用します。

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

コマンド置換にパイプを好む人へ

git rev-list -n1 --before=2013-7-4 master | xargs git checkout
9
Steven Penny

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

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

これは、指定された日付の適切なコミットのSHAを返し、次に:

git checkout SHA
8
BartoszKP

マスターブランチからプロダクションブランチへの最新のマージコミットを検索する場合は、rev-listオプションを使用してさらに進めます(純粋に仮想的な例として)。

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

特定の日付の実稼働サーバー上にあるコードを見つける必要がありました。これは私のためにそれを見つけました。

3
egerlach

@Andyによって提案されたgit rev-parseソリューションは、興味のある日付がコミットの日付である場合に正常に機能します。ただし、author's dateに基づいてチェックアウトしたい場合、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"を使用します。)

3

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

他の回答は、ある時点でブランチ内の最新のコミットにリポジトリを返すためのテクニックを提供しますが、必ずしも十分ではないかもしれません。たとえば、ブランチからビルドし、後でブランチを削除するか、後でリベースするブランチからビルドすると、ビルドのコミットは現在のブランチからのgitで「到達不能」になる可能性があります。リポジトリが圧縮されると、Gitの到達不能オブジェクトが最終的に削除される可能性があります。

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

2
antlersoft
git rev-list -n 1 --before="2009-07-27 13:37" Origin/master

印刷された文字列(たとえばXXXX)を取得して、次の操作を行います。

git checkout XXXX
1
Luca C.