Bagaimana Anda menekan seluruh repositori ke komit pertama?
Saya dapat rebase ke komit pertama, tetapi itu akan meninggalkan saya dengan 2 komit. Apakah ada cara untuk merujuk komit sebelum yang pertama?
git
rebase
git-rebase
squash
git-rewrite-history
Verhogen
sumber
sumber
--root
sebenarnya bukan solusi terbaik untuk menekan semua commit jika ada banyak dari mereka untuk squash): Gabungkan dua commit pertama dari repositori Git? .Jawaban:
Mungkin cara termudah adalah dengan hanya membuat repositori baru dengan status copy pekerjaan saat ini. Jika Anda ingin menyimpan semua pesan komit yang dapat Anda lakukan pertama-tama
git log > original.log
dan kemudian mengeditnya untuk pesan komit awal Anda di repositori baru:atau
sumber
git rebase -i --root
. Lihat: stackoverflow.com/a/9254257/109618Pada git 1.6.2 , Anda bisa menggunakan
git rebase --root -i
.Untuk setiap komit kecuali yang pertama, ubah
pick
kesquash
.sumber
squash
untuk semua komit. Yang pertama perlupick
.Memperbarui
Saya sudah membuat alias
git squash-all
.Contoh penggunaan :
git squash-all "a brand new start"
.Peringatan : ingatlah untuk memberikan komentar, jika tidak, pesan komit default "Awal baru" akan digunakan.
Atau Anda dapat membuat alias dengan perintah berikut:
Satu Liner
Catatan : "
A new start
" di sini hanyalah contoh, jangan ragu untuk menggunakan bahasa Anda sendiri.TL; DR
Tidak perlu squash, gunakan
git commit-tree
untuk membuat komitmen anak yatim dan pergi bersamanya.Menjelaskan
buat komit tunggal via
git commit-tree
Apa yang
git commit-tree HEAD^{tree} -m "A new start"
dilakukan adalah:Ekspresi
HEAD^{tree}
berarti objek pohon yang terkaitHEAD
, yaitu ujung cabang Anda saat ini. lihat Tree-Objects dan Commit-Objects .atur ulang cabang saat ini ke komit baru
Kemudian
git reset
cukup reset cabang saat ini ke objek komit yang baru dibuat.Dengan cara ini, tidak ada di ruang kerja yang disentuh, juga tidak perlu rebase / squash, yang membuatnya sangat cepat. Dan waktu yang dibutuhkan tidak relevan dengan ukuran repositori atau kedalaman riwayat.
Variasi: Repo Baru dari Template Proyek
Ini berguna untuk membuat "commit awal" dalam proyek baru menggunakan repositori lain sebagai templat / pola dasar / seed / kerangka. Sebagai contoh:
Ini menghindari menambahkan repo templat sebagai remote (
origin
atau sebaliknya) dan menciutkan riwayat repo templat ke komit awal Anda.sumber
git push -f
untuk propagasi.git clone
. Jika Anda menambahkan--hard
untukgit reset
dan beralihHEAD
denganFETCH_HEAD
digit commit-tree
Anda dapat membuat awal komit setelah mengambil repo Template. Saya telah mengedit jawaban dengan bagian di bagian akhir yang menunjukkan hal ini.${1?Please enter a message}
Jika semua yang ingin Anda lakukan adalah menekan semua komit Anda ke root commit, lalu sementara
dapat bekerja, itu tidak praktis untuk sejumlah besar komit (misalnya, ratusan komit), karena operasi rebase mungkin akan berjalan sangat lambat untuk menghasilkan daftar komit editor rebase interaktif, serta menjalankan rebase itu sendiri.
Berikut adalah dua solusi yang lebih cepat dan lebih efisien ketika Anda menekan sejumlah besar komitmen:
Solusi alternatif # 1: cabang yatim
Anda cukup membuat cabang yatim baru di ujung (yaitu komit terbaru) dari cabang Anda saat ini. Cabang yatim ini membentuk komit root awal dari pohon histori komit yang sama sekali baru dan terpisah, yang secara efektif setara dengan menekan semua komit Anda:
Dokumentasi:
Solusi alternatif # 2: soft reset
Solusi efisien lainnya adalah dengan menggunakan campuran atau soft reset ke root commit
<root>
:Dokumentasi:
sumber
git push origin master --force
.git push --force
Ini akan membuat komit yatim dengan pohon KEPALA, dan menampilkan nama itu (SHA-1) di stdout. Kemudian atur ulang cabang Anda di sana.
sumber
git reset $(git commit-tree HEAD^{tree} -m "commit message")
akan membuatnya lebih mudah.echo "message" | git commit-tree "HEAD^{tree}"
Inilah cara saya akhirnya melakukan ini, kalau-kalau itu bekerja untuk orang lain:
Ingatlah bahwa selalu ada risiko dalam melakukan hal-hal seperti ini, dan tidak pernah ada ide buruk untuk membuat cabang penyimpanan sebelum memulai.
Mulailah dengan login
Gulir ke komit pertama, salin SHA
Ganti
<#sha#>
dengan SHA yang disalin dari logPastikan semuanya berwarna hijau, jika tidak jalankan
git add -A
Ubah semua perubahan saat ini menjadi komit pertama saat ini
Sekarang paksa dorong cabang ini dan itu akan menimpa apa yang ada.
sumber
Saya membaca sesuatu tentang menggunakan cangkok tetapi tidak pernah banyak menyelidiki.
Bagaimanapun, Anda dapat menekan 2 komit terakhir secara manual dengan sesuatu seperti ini:
sumber
Cara termudah adalah dengan menggunakan perintah 'plumbing'
update-ref
untuk menghapus cabang saat ini.Anda tidak dapat menggunakan
git branch -D
karena memiliki katup pengaman untuk menghentikan Anda menghapus cabang saat ini.Ini menempatkan Anda kembali ke keadaan 'komit awal' di mana Anda dapat mulai dengan komit awal yang baru.
sumber
Pertama, hancurkan semua komit Anda menjadi satu komit menggunakan
git rebase --interactive
. Sekarang Anda memiliki dua komitmen untuk squash. Untuk melakukannya, baca salah satunyasumber
Dalam satu baris 6 kata
sumber
git help checkout
tentang--orphan
git help checkout --orphan
buat cadangan
reset ke komit yang ditentukan
kemudian tambahkan semua file ke pementasan
komit tanpa memperbarui pesan
dorong cabang baru dengan komitmen terjepit untuk repo
sumber
<root>
komit yang Anda atur kembali.git commit --amend --no-edit
akan melakukan semua perubahan pada komit saat ini yang<root>
tanpa perlu mengedit pesan komit.Untuk squash menggunakan cangkok
Tambahkan file
.git/info/grafts
, letakkan di sana hash komit yang Anda inginkan menjadi root Andagit log
sekarang akan mulai dari komit ituUntuk membuatnya 'nyata' berjalan
git filter-branch
sumber
Jawaban ini meningkat pada pasangan di atas (silakan pilih mereka), dengan asumsi bahwa selain membuat satu komit (no-parent-no-history), Anda juga ingin mempertahankan semua data komit komit tersebut:
Tentu saja komit-SHA dari komit baru / tunggal akan berubah, karena itu merepresentasikan sejarah baru (non-), menjadi komitmen tanpa orangtua / root.
Ini dapat dilakukan dengan membaca
git log
dan mengatur beberapa variabel untukgit commit-tree
. Dengan asumsi bahwa Anda ingin membuat komit tunggalmaster
di cabang baruone-commit
, simpan data komit di atas:sumber
Untuk melakukan ini, Anda dapat mereset repositori git lokal Anda ke tagar komit pertama, sehingga semua perubahan Anda setelah komit tersebut akan tidak bertahap, kemudian Anda bisa komit dengan opsi --amend.
Dan kemudian edit nam komit pertama jika diperlukan dan simpan file.
sumber
Bagi saya ini berfungsi seperti ini: Saya memiliki total 4 komitmen, dan menggunakan rebase interaktif:
Komit pertama tetap dan saya mengambil 3 komit terbaru.
Jika Anda terjebak dalam editor yang muncul berikutnya, Anda melihat sesuatu seperti:
Anda harus mengambil komit pertama dan menekan orang lain ke dalamnya. Yang harus Anda miliki adalah:
Untuk itu gunakan tombol INSERT untuk mengubah mode 'masukkan' dan 'edit'.
Untuk menyimpan dan keluar dari penggunaan editor
:wq
. Jika kursor Anda berada di antara garis komit atau di tempat lain tekan ESC dan coba lagi.Sebagai hasilnya, saya memiliki dua komit: yang pertama tetap dan yang kedua dengan pesan "Ini adalah kombinasi dari 3 komit.".
Periksa detailnya di sini: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
sumber
Saya biasanya melakukannya seperti ini:
Pastikan semuanya berkomitmen, dan tuliskan id komit terbaru jika terjadi kesalahan, atau buat cabang terpisah sebagai cadangan
Jalankan
git reset --soft `git rev-list --max-parents=0 --abbrev-commit HEAD`
untuk mengatur ulang kepala Anda ke komit pertama, tetapi biarkan indeks Anda tidak berubah. Semua perubahan sejak komit pertama sekarang akan tampak siap untuk berkomitmen.Jalankan
git commit --amend -m "initial commit"
untuk mengubah komit Anda ke komit pertama dan ubah pesan komit, atau jika Anda ingin menyimpan pesan komit yang ada, Anda dapat menjalankangit commit --amend --no-edit
Berlari
git push -f
untuk memaksa mendorong perubahan Andasumber