ソースコードのリグレッションに取り組んでいます。 Gitに「パラメーター化された日付/時刻に基づいてソースをチェックアウトする」ことを伝えたい。これは可能ですか?
また、現在の見解では、失いたくない変更を段階的に行っています。理想的には、現在のソースと、以前の日付に基づいて興味のあるバージョンとの間で前後に切り替えたいと思います。
git stash
を使用すると、コミットせずに作業を隠しておくことができます。 git stash pop
を使用して、それを取り戻します。または、(carleetoが言ったように)別のブランチにgit commit
できます。
次のようにrev-parse
を使用して、特定の日付までにコミットをチェックアウトできます。
git checkout 'master@{1979-02-26 18:30:00}'
使用可能なオプションの詳細については、 git-rev-parse
をご覧ください。
コメントで述べたように、このメソッドはreflogを使用して履歴内のコミットを見つけます。デフォルトでは、これらのエントリ 90日後に期限切れ 。 reflogを使用するための構文はそれほど冗長ではありませんが、90日までしか遡れません。
Reflogを使用しないもう1つのオプションは、rev-list
を使用して、特定の時点でコミットを取得することです。
git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`
マージによってもたらされたバージョンではなく履歴のみが必要な場合は、-first-parentに注意してください。それは通常あなたが望むものです。
Andyのソリューションは私には機能しません。ここで私は別の方法を見つけました:
git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
この行に沿って何かが必要なようです: Git checkout based on date
つまり、rev-list
を使用してコミットを検索し、次にcheckoutを使用して実際にコミットを取得します。
段階的な変更を失いたくない場合、最も簡単な方法は、新しいブランチを作成して、そのブランチにコミットすることです。ブランチ間をいつでも切り替えることができます。
編集:リンクがダウンしているため、次のコマンドを使用します。
git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
コマンド置換にパイプを好む人へ
git rev-list -n1 --before=2013-7-4 master | xargs git checkout
私の場合、-n 1
オプションは機能しません。 Windowsでは、次の一連のコマンドが正常に機能することがわかりました。
git rev-list -1 --before="2012-01-15 12:00" master
これは、指定された日付の適切なコミットのSHAを返し、次に:
git checkout SHA
マスターブランチからプロダクションブランチへの最新のマージコミットを検索する場合は、rev-list
オプションを使用してさらに進めます(純粋に仮想的な例として)。
git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`
特定の日付の実稼働サーバー上にあるコードを見つける必要がありました。これは私のためにそれを見つけました。
@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"
を使用します。)
ビルドを行うときにリポジトリの正確なバージョンに戻りたい場合は、ビルドを行うコミットにタグを付けるのが最善です。
他の回答は、ある時点でブランチ内の最新のコミットにリポジトリを返すためのテクニックを提供しますが、必ずしも十分ではないかもしれません。たとえば、ブランチからビルドし、後でブランチを削除するか、後でリベースするブランチからビルドすると、ビルドのコミットは現在のブランチからのgitで「到達不能」になる可能性があります。リポジトリが圧縮されると、Gitの到達不能オブジェクトが最終的に削除される可能性があります。
コミットにタグを付けるということは、その後ブランチで何をしても(タグを削除しない限り)到達不能にならないことを意味します。
git rev-list -n 1 --before="2009-07-27 13:37" Origin/master
印刷された文字列(たとえばXXXX)を取得して、次の操作を行います。
git checkout XXXX