Apakah masuk akal untuk melakukan git rebase
sambil menjaga stempel waktu komit?
Saya percaya konsekuensinya adalah bahwa cabang baru tidak harus memiliki tanggal secara kronologis. Apakah secara teori itu mungkin? (mis. menggunakan perintah pipa ledeng; hanya ingin tahu di sini)
Jika secara teori memungkinkan, maka apakah mungkin dalam praktik dengan rebase, bukan untuk mengubah cap waktu?
Misalnya, anggap saya memiliki pohon berikut:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Sekarang, jika saya oldbranch
mulai lagi master
, tanggal komit berubah dari Februari 1984 menjadi Juni 2010. Apakah mungkin mengubah perilaku itu sehingga stempel waktu komit tidak berubah? Pada akhirnya saya akan mendapatkan:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
Apakah itu masuk akal? Apakah bahkan diizinkan di git untuk memiliki riwayat di mana komit lama memiliki komit yang lebih baru sebagai orangtua?
sumber
git rebase --committer-date-is-author-date SHA
. Lihat jawaban saya yang diedit di bawahJawaban:
Pembaruan Juni 2014: David Fraser menyebutkan dalam komentar sebuah solusi yang juga dirinci dalam " Ubah stempel waktu saat rebasing cabang git ", menggunakan opsi
--committer-date-is-author-date
(diperkenalkan awalnya pada Januari 2009 di komit 3f01ad6Lihat
git am
:(Jawaban asli, Juni 2012)
Anda dapat mencoba, untuk rebase non-interaktif
(dari jawaban SO ini )
Ini diteruskan ke
git am
, yang menyebutkan:Sebab
git rebase
, opsi ini "Tidak kompatibel dengan opsi --interaktif."Karena Anda dapat mengubah kapan saja cap waktu komit lama (dengan
git filter-branch
), saya kira Anda dapat mengatur riwayat Git Anda dengan urutan tanggal komit apa pun yang Anda inginkan / butuhkan, bahkan atur ke masa depan! .Seperti Olivier menyebutkan dalam pertanyaannya, tanggal penulis tidak pernah diubah oleh rebase;
Dari Buku Pro Git :
Untuk lebih jelas, dalam hal ini, seperti komentar Olivier:
sumber
git rebase --ignore-date
tidak berhasil. Itu mengubah tanggal dari komitmen yang diubah.--ignore-date
melakukan kebalikan dari apa yang saya capai! Yaitu, menghapus stempel waktu penulis dan menggantinya dengan stempel waktu komitmen! Jadi jawaban yang tepat untuk pertanyaan saya adalah: jangan lakukan apa-apa, karenagit rebase
sebenarnya tidak mengubah stempel waktu penulis secara default.--committer-date-is-author-date
opsi tampaknya meninggalkan timestamp penulis, dan mengatur cap waktu committer menjadi sama dengan cap waktu penulis asli, yang diinginkan Olivier ...Jika Anda telah mengacaukan tanggal komit (mungkin dengan rebase) dan ingin mengatur ulangnya ke tanggal penulis yang sesuai, Anda dapat menjalankan:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
sumber
WARNING: Ref 'refs/heads/master' is unchanged
. Saya menggunakan git versi 1.7.9.5 di Linux (64 bit)git rebase --committer-date-is-author-date <base_branch>
Dengan cara ini, git akan mengatur ulang tanggal komit hanya untuk komit yang diterapkan pada <base_branch> (yang mungkin merupakan nama cabang yang sama yang Anda gunakan saat Anda mengacaukan).Sebuah pertanyaan penting Von C membantu saya memahami apa yang terjadi: ketika rebase Anda, committer ini perubahan timestamp, tapi bukan penulis timestamp, yang tiba-tiba semua masuk akal. Jadi pertanyaan saya sebenarnya tidak cukup tepat.
Jawabannya adalah rebase sebenarnya tidak mengubah stempel waktu penulis (Anda tidak perlu melakukan apa pun untuk itu), yang sangat cocok untuk saya.
sumber
Secara default, git rebase akan mengatur stempel waktu committer ke waktu ketika komit baru dibuat, tetapi menjaga stempel waktu penulis tetap utuh. Sebagian besar waktu, ini adalah perilaku yang diinginkan, tetapi pada beberapa skenario, kami juga tidak ingin mengubah cap waktu komiter. Bagaimana kita bisa mencapai itu? Nah, inilah trik yang biasa saya lakukan.
Pertama, pastikan setiap komit yang akan Anda rebase memiliki pesan komit unik dan cap waktu penulis (Di sinilah trik membutuhkan perbaikan, saat ini sesuai dengan kebutuhan saya).
Sebelum rebase, catat stempel waktu pengganti, stempel waktu penulis dan komit pesan dari semua komit yang akan diubah menjadi file.
Kemudian, biarkan rebase yang sebenarnya terjadi.
Akhirnya, kami mengganti timestamp committer saat ini dengan yang dicatat dalam file jika pesan komit sama dengan menggunakan
git filter-branch
.Jika terjadi kesalahan, checkout saja
git reflog
atau semuarefs/original/
referensi.Selain itu, Anda dapat melakukan hal yang mirip dengan stempel waktu penulis.
Misalnya, jika stempel waktu penulis dari beberapa komit tidak sesuai, dan tanpa mengatur ulang komit ini, kami hanya ingin stempel waktu penulis ditampilkan secara berurutan, maka perintah berikut akan membantu.
sumber