Ubah stempel waktu saat melakukan rebasing git branch

99

Saya telah mengatur ulang komit di cabang sebelum dipublikasikan sehingga menyebabkan stempel waktu dari komit menjadi campur aduk. Saya lebih suka mereka semua menjadi hari ini dengan hanya beberapa detik di antaranya.

Jelas cap waktu ini juga tidak akan benar, tetapi karena ini adalah waktu ketika segala sesuatunya go public, saya lebih suka itu daripada sejarah yang campur aduk, bijaksana waktu.

Jadi, bagaimana cara memberi tahu git untuk membuat stempel waktu baru saat melakukan rebasing?

tarsius
sumber
Dengan Git 2.29 (Q4 2020), a git rebase --rootatau -i, with --reset-author-dateakan berfungsi. Lihat jawaban saya di bawah
VonC

Jawaban:

135
git rebase --ignore-date
Michael Krelin - peretas
sumber
2
Saya sudah mencobanya sebelum memposting .. Kecuali saya belum melakukannya secara interaktif, mungkin itu triknya? Selain itu, apakah Anda sudah mencoba alias --committer-date-is-author-date? Mungkin --ignore-date diperkenalkan di versi yang lebih baru, saya tidak tahu.
Michael Krelin - hacker
2
Ya, jika dilakukan secara non-interaktif, itu berhasil. Tapi kemudian - seperti biasa dengan rebase - komit pertama tidak terpengaruh.
tarsius
2
@ MichaelKrelin-hacker: menurut dokumentasinya, --ignore-date Flag ini diteruskan ke git am untuk dengan mudah mengubah tanggal dari rebased commit (lihat git-am [1]). Tidak kompatibel dengan opsi --interactive.
Tim
4
@ Tim Komit root tidak memiliki induk, dan ketika saya menanyakan pertanyaan ini, saya juga ingin mengubah tanggal komit itu. Sekarang kita punya --root, yang memungkinkan hal ini.
tarsius
3
Incompatible with the --interactive option. Lihat dokumen
Vlastimil Ovčáčík
28

Dalam kasus saya, rebasing mengubah stempel waktu menjadi nilai CommitDate, jadi di gitweb, beberapa komitmen yang berumur beberapa bulan muncul sebagai 4 hari. Saya menemukan komit terakhir dengan tanggal yang benar dan melakukan:

$ git rebase --committer-date-is-author-date SHA
lkraav.dll
sumber
39
Tidak, tidak. Faktanya, justru sebaliknya. Dari dokumen git rebase: " Bendera ini diteruskan untuk git amdengan mudah mengubah tanggal dari komitmen berbasis ulang ". Di git amdalamnya tertulis: --committer-date-is-author-date" [...] memungkinkan pengguna untuk berbohong tentang tanggal pelaku dengan menggunakan nilai yang sama dengan tanggal pembuat " sementara --ignore-date" [...] memungkinkan pengguna untuk berbohong tentang tanggal pembuat dengan menggunakan nilai yang sama sebagai tanggal pelaku ".
Enrico Campidoglio
11

Ada caranya sebagai berikut

  1. Rebase normal

    git rebase --ignore-date
    
  2. Rebase interaktif

    git rebase -i master
    git commit --amend --date=now
    git push origin <branch> -f
    
Umar Asghar
sumber
0

Dari komentar:

Tidak kompatibel dengan --interactive option

Sebenarnya ... ini tidak lagi kompatibel dengan Git 2.29 (Q4 2020): " git rebase -i" ( man ) mempelajari lebih banyak opsi .
Opsi yang kompatibel dengan:

  • --interactive/-i
  • --root!

Lihat commit 6160b2e (26 Agustus 2020) oleh Junio ​​C Hamano ( gitster) .
Lihat commit 2712669 (17 Aug 2020), dan commit ef484ad (13 Jul 2020) oleh Rohit Ashiwal ( r1walz) .
Lihat commit a3894aa , commit 7573cec , commit e8cbe21 (17 Agustus 2020) oleh Phillip Wood ( phillipwood) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit 9c31b19 , 03 Sep 2020)

rebase -i: dukung --ignore-date

Asli-patch-oleh: Rohit Ashiwal
Ditandatangani oleh: Phillip Wood

Rebase diimplementasikan dengan dua backend berbeda - ' apply' dan 'merge ' yang masing-masing mendukung serangkaian opsi berbeda.

Secara khusus, terapkan backend mendukung sejumlah opsi yang diimplementasikan oleh ' ( man ) ' yang tidak diterapkan di backend gabungan. Ini berarti bahwa opsi yang tersedia berbeda tergantung pada backend mana yang digunakan yang membingungkan.git am

Patch ini menambahkan dukungan untuk --ignore-dateopsi merge backend.

Opsi ini menggunakan waktu saat ini sebagai tanggal penulis daripada menggunakan kembali tanggal penulis asli saat menulis ulang komit.
Kami berhati-hati untuk menangani kombinasi --ignore-datedan --committer-date-is-author-datedengan cara yang sama seperti penerapan backend.

Dan:

rebase: Menambahkan --reset-author-date

Dibantu oleh: Junio ​​C Hamano
Ditandatangani oleh: Rohit Ashiwal

Komit sebelumnya memperkenalkan --ignore-datebendera ke rebase -i, tetapi namanya agak kabur karena tidak mengatakan apakah tanggal pembuat atau tanggal pembuat diabaikan.
Tambahkan alias untuk menyampaikan tujuan yang tepat.

--reset-author-date

Juga:

rebase -i: dukungan --committer-date-is-author-date

Asli-patch-oleh: Rohit Ashiwal
Ditandatangani oleh: Phillip Wood

Patch ini menambahkan dukungan untuk --committer-date-is-author-dateopsi merge backend.
Opsi ini menggunakan tanggal pembuat dari komit yang sedang ditulis ulang sebagai tanggal komiter saat komit baru dibuat.

git rebasesekarang termasuk di halaman manualnya :

--committer-date-is-author-date:

Alih-alih menggunakan waktu saat ini sebagai tanggal pelaku, gunakan tanggal pembuat dari komit yang di-rebased sebagai tanggal pelaku.
Opsi ini menyiratkan --force-rebase.

git rebasejuga termasuk di halaman manualnya :

--ignore-date:

Bendera ini diteruskan ke 'git am' untuk mengubah tanggal pembuat setiap komit rebased (lihat git am).

VonC
sumber