Saya sedang mengerjakan regresi dalam kode sumber. Saya ingin memberi tahu Git: "checkout sumber berdasarkan tanggal / waktu yang diparameterisasi". Apakah ini mungkin?
Saya juga telah melakukan perubahan pada tampilan saya saat ini yang tidak ingin saya hilangkan. Idealnya, saya ingin beralih antara sumber saat ini, dan beberapa versi saya tertarik berdasarkan tanggal sebelumnya.
git
git-checkout
Amir Afghani
sumber
sumber
git bisect good
titik awal Anda .tags
.Jawaban:
Untuk menjaga perubahan Anda saat ini
Anda dapat menyimpan pekerjaan Anda simpanan, tanpa melakukannya, dengan
git stash
. Anda akan menggunakangit stash pop
untuk mendapatkannya kembali. Atau Anda dapat (seperti kata carleeto )git commit
ke cabang terpisah.Checkout berdasarkan tanggal menggunakan rev-parse
Anda dapat checkout komit dengan tanggal tertentu menggunakan
rev-parse
seperti ini:Rincian lebih lanjut tentang opsi yang tersedia dapat ditemukan di
git-rev-parse
.Seperti disebutkan dalam komentar, metode ini menggunakan reflog untuk menemukan komit dalam riwayat Anda. Secara default, entri ini kedaluwarsa setelah 90 hari . Meskipun sintaks untuk menggunakan reflog kurang verbose Anda hanya dapat kembali 90 hari.
Keluar berdasarkan tanggal menggunakan daftar rev
Opsi lain, yang tidak menggunakan reflog, adalah menggunakan
rev-list
untuk mendapatkan komit pada titik waktu tertentu dengan:Catat --first-parent jika Anda hanya menginginkan riwayat dan bukan versi yang dibawa oleh gabungan. Itu yang biasanya Anda inginkan.
sumber
git co 'master@{2 days ago}'
.git rev-list -n 1 --before="2009-07-27 13:37" master
$(...)
lebih disukai.Solusi Andy tidak berhasil untuk saya. Di sini saya menemukan cara lain:
Git: checkout berdasarkan tanggal
sumber
error: unknown switch `n'
ide bagaimana mengatasi ini?Sepertinya Anda memerlukan sesuatu seperti ini: Git checkout berdasarkan tanggal
Dengan kata lain, Anda menggunakan
rev-list
untuk menemukan komit dan kemudian menggunakan checkout untuk benar-benar mendapatkannya.Jika Anda tidak ingin kehilangan perubahan bertahap Anda, cara termudah adalah membuat cabang baru dan mengkomitnya ke cabang itu. Anda selalu dapat berpindah-pindah antar cabang.
Sunting: Tautan tidak aktif, jadi inilah perintahnya:
sumber
git checkout branch@{date}
berhentilah bekerja ketika reflog kedaluwarsa, tetapi Anda dapat menggunakannyagit checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
.Bagi mereka yang lebih suka pipa untuk memerintahkan substitusi
sumber
Dalam kasus saya
-n 1
opsi tidak berfungsi. Pada Windows saya menemukan bahwa urutan perintah berikut berfungsi dengan baik:Ini mengembalikan SHA komit yang sesuai untuk tanggal yang diberikan, dan kemudian:
sumber
The
git rev-parse
solusi yang diusulkan oleh @ Andy bekerja dengan baik jika tanggal Anda tertarik adalah komit tanggal ini . Namun jika Anda ingin checkout berdasarkan tanggal penulis ,rev-parse
tidak akan berfungsi, karena tidak menawarkan opsi untuk menggunakan tanggal itu untuk memilih komit. Sebagai gantinya, Anda dapat menggunakan yang berikut ini.(Jika Anda juga ingin menentukan waktu penggunaan
$1 >= "2016-04-12" && $2 >= "11:37"
dalam predikat awk .)sumber
Melangkah lebih jauh dengan
rev-list
opsi, jika Anda ingin menemukan komit gabungan terbaru dari cabang master Anda ke cabang produksi Anda (sebagai contoh murni hipotetis):Saya perlu menemukan kode yang ada di server produksi pada tanggal tertentu. Ini menemukannya untukku.
sumber
Jika Anda ingin dapat kembali ke versi repositori yang tepat pada saat Anda melakukan build, yang terbaik adalah menandai komit dari mana Anda membuat build.
Jawaban lain menyediakan teknik untuk mengembalikan repositori ke komit terbaru di cabang pada waktu tertentu - tetapi mereka mungkin tidak selalu cukup. Misalnya, jika Anda membangun dari cabang, dan kemudian menghapus cabang, atau membangun dari cabang yang kemudian direstrukturisasi, komit yang Anda bangun dapat menjadi "tidak terjangkau" di git dari cabang mana pun saat ini. Objek yang tidak terjangkau di git akhirnya dapat dihapus ketika repositori dipadatkan.
Menempatkan tag pada komit berarti tidak pernah menjadi tidak dapat dijangkau, apa pun yang Anda lakukan dengan cabang setelah itu (kecuali menghapus tag).
sumber
ambil string yang dicetak (misalnya XXXX) dan lakukan:
sumber