Saya membuat cabang baru master
dengan:
git checkout -b testbranch
Saya membuat 20 komitmen ke dalamnya.
Sekarang saya ingin menekan 20 komit itu. Saya melakukannya dengan:
git rebase -i HEAD~20
Bagaimana jika saya tidak tahu berapa banyak yang melakukan? Apakah ada cara untuk melakukan sesuatu seperti:
git rebase -i all on this branch
git
version-control
pengguna3803850
sumber
sumber
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
yang akan melakukan rebase interaktif di mana komit adalah komit terakhir yang tetap tidak berubahJawaban:
Cara lain untuk menekan semua komit Anda adalah mengatur ulang indeks untuk dikuasai:
Ini tidak sempurna karena itu menyiratkan Anda tahu dari mana cabang "cabang Anda" berasal.
Catatan: menemukan bahwa cabang asal tidak mudah / tidak mungkin dengan Git ( cara visual seringkali paling mudah , seperti yang terlihat di sini ).
EDIT: Anda harus menggunakan
git push --force
Karlotcha Hoa menambahkan dalam komentar :
sumber
YourBranch
saat ini. Ini akan tetapYourBranch
utuh saat Anda melakukannyareset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
untuk secara otomatis menggunakan cabang tempat Anda berada saat ini. Dan jika Anda menggunakannya, Anda juga bisa menggunakan alias, karena perintahnya tidak bergantung pada nama cabang.git push --force
(dan peringatkan kolega Anda jika Anda beberapa orang bekerja di cabang itu)Periksa cabang yang ingin Anda hancurkan semua komit menjadi satu komit. Katakanlah namanya
feature_branch
,.git checkout feature_branch
Langkah 1:
Lakukan soft reset Anda
origin/feature_branch
denganmaster
cabang lokal Anda (tergantung pada kebutuhan Anda, Anda dapat mengatur ulang dengan asal / master juga). Ini akan mengatur ulang semua komitmen tambahan di Andafeature_branch
, tetapi tanpa mengubah perubahan file apa pun secara lokal.git reset --soft master
Langkah 2:
Tambahkan semua perubahan di direktori git repo Anda, ke komit baru yang akan dibuat. Dan lakukan hal yang sama dengan pesan.
git add -A && git commit -m "commit message goes here"
sumber
-f
bendera.Apa yang Anda lakukan sangat rentan kesalahan. Kerjakan saja:
yang secara otomatis akan rebase hanya komitmen cabang Anda ke master terbaru saat ini.
sumber
commit -am "the whole thing!"
reset origin/master
metode ini benar-benar buruk karena hanya sama dengan membuat komit langsung pada master - tidak ada sejarah 'menggabungkan cabang', tidak ada opsi permintaan tarik. Jawaban oleh @WaZaA jauh lebih sesuai dengan alur kerja normal git saya pikirCara sederhana lain untuk melakukan ini: buka cabang asal dan lakukan a
merge --squash
. Perintah ini tidak melakukan komit "terjepit". ketika Anda melakukannya, semua pesan komit dari Cabang Anda akan dikumpulkan.sumber
Dengan asumsi Anda bercabang dari master, Anda tidak perlu masuk
yourBranch
ke langkah reset sepanjang waktu:Penjelasan :
git rev-list --count HEAD ^master
menghitung komit sejak Anda membuat cabang fitur dari master, f.ex. 20.git reset --soft HEAD~20
akan melakukan soft reset 20 komit terakhir. Ini meninggalkan perubahan Anda di file, tetapi menghapus komit.Penggunaan :
Dalam .bash_profile saya, saya telah menambahkan alias untuk
gisquash
melakukan ini dengan satu perintah:Setelah mengatur ulang dan melakukan, Anda perlu melakukan a
git push --force
.Petunjuk :
Jika Anda menggunakan Gitlab> = 11.0 Anda tidak perlu melakukan ini lagi karena memiliki opsi squashing ketika menggabungkan cabang.
sumber
Berdasarkan membaca beberapa pertanyaan Stackoverflow dan jawaban tentang squashing, saya pikir ini adalah liner yang bagus untuk menekan semua komit di cabang:
Ini dengan asumsi master adalah cabang dasar.
sumber
Solusi untuk orang yang lebih suka mengklik:
Instal sourcetree (gratis)
Periksa seperti apa komitmen Anda. Kemungkinan besar Anda memiliki sesuatu yang mirip dengan ini
Klik kanan pada parent commit. Dalam kasus kami ini adalah cabang utama.
Anda dapat menekan komit dengan yang sebelumnya dengan mengklik tombol. Dalam kasus kami, kami harus mengklik 2 kali. Anda juga dapat mengubah pesan komit
Hasilnya luar biasa dan kami siap untuk mendorong!
Catatan: Jika Anda mendorong sebagian komitmen Anda ke jarak jauh Anda harus menggunakan dorongan paksa setelah squash
sumber
Solusi lain adalah menyimpan semua log komit ke file
log git> branch.log
Sekarang branch.log akan memiliki semua id komit sejak awal .. gulir ke bawah dan ambil komit pertama (ini akan sulit di terminal) menggunakan komit pertama
git reset --soft
semua komitmen akan terjepit
sumber
Reset git, sebagaimana disebutkan dalam banyak jawaban sebelumnya, sejauh ini merupakan cara terbaik dan paling sederhana untuk mencapai apa yang Anda inginkan. Saya menggunakannya dalam alur kerja berikut:
(di cabang pengembangan)
sumber
Semua git ini direset, keras, lunak, dan semua yang disebutkan di sini mungkin bekerja (tidak bagi saya) jika Anda melakukan langkah-langkah dengan benar dan semacam jin.
Jika Anda adalah Joe smo rata-rata, coba ini:
Cara menggunakan git merge --squash?
Menyelamatkan hidup saya, dan akan saya pergi ke squash, telah menggunakan ini 4 kali sejak saya mengetahuinya. Sederhana, bersih dan pada dasarnya 1 comamnd. Singkatnya:
Jika Anda berada di cabang, sebut saja "my_new_feature" off mengembangkan dan permintaan tarik Anda memiliki 35 komitmen (atau berapa banyak) dan Anda ingin menjadi 1.
A. Pastikan cabang Anda mutakhir, Lanjutkan kembangkan, dapatkan yang terbaru, dan gabungkan serta selesaikan konflik dengan "my_new_feature"
(langkah ini benar-benar harus Anda ambil sesegera mungkin)
B. Dapatkan perkembangan terbaru dan percabangan ke cabang baru, sebut saja "my_new_feature_squashed"
C. sihir ada di sini.
Anda ingin mengambil pekerjaan Anda dari "my_new_feature" ke "my_new_feature_squashed"
Jadi lakukan saja (sementara di cabang baru Anda kami ciptakan mengembangkan):
git merge --squash my_new_feature
Semua perubahan Anda sekarang akan berada di cabang baru Anda, silakan mengujinya, lalu lakukan 1 komit tunggal Anda, dorong, PR baru dari cabang itu - dan tunggu pengulangan di hari berikutnya.
Apakah kamu tidak suka coding? :)
sumber
Anda dapat menggunakan alat yang saya buat khusus untuk tugas ini:
https://github.com/sheerun/git-squash
Pada dasarnya Anda perlu menelepon
git squash master
dan selesaisumber