Pertanyaan ini tidak hanya berkaitan dengan bagaimana menyelesaikan tugas ini, tetapi juga apakah melakukan itu adalah praktik yang baik atau buruk dengan Git.
Pertimbangkan bahwa secara lokal saya melakukan sebagian besar pekerjaan pada cabang master, tetapi saya telah membuat cabang topikal yang saya sebut "topical_xFeature". Dalam proses bekerja pada "topical_xFeature" dan beralih bolak-balik untuk melakukan pekerjaan lain di cabang master, ternyata saya telah membuat lebih dari satu komit di cabang "topical_xFeature", tetapi di antara setiap komit, saya belum melakukan Dorong.
Pertama , apakah Anda menganggap praktik buruk ini? Tidakkah lebih bijaksana untuk tetap dengan satu komit per cabang per push? Dalam kasus apa akan lebih baik untuk memiliki banyak komit pada cabang sebelum dorongan dilakukan?
Kedua , bagaimana saya sebaiknya menyelesaikan membawa banyak komit pada cabang topical_xFeature ke cabang master untuk dorongan? Apakah itu gangguan untuk tidak khawatir tentang hal itu dan lakukan saja dorongan di mana banyak komit didorong, atau apakah kurang mengganggu entah bagaimana menggabungkan komit menjadi satu dan kemudian mendorong? Sekali lagi, bagaimana melakukan ini?
sumber
git branch -d topic
. Mengapa git tidak dapat mengidentifikasi bahwa semua perubahan digabungkan?git branch -D topic
menghapusnya secara paksa.Ini adalah cara yang biasanya saya ikuti untuk menggabungkan beberapa Komit menjadi komit tunggal sebelum saya mendorong kode.
Untuk mencapai ini, saya sarankan Anda menggunakan konsep ' squash ' yang disediakan oleh GIT.
Ikuti langkah-langkah di bawah ini.
1) git rebase -i master (alih-alih master, Anda juga dapat menggunakan komit tertentu)
buka editor interaktif rebase, di mana ia akan menunjukkan semua komitmen Anda. Pada dasarnya di mana Anda perlu mengidentifikasi komit yang ingin Anda gabungkan menjadi satu komit.
Bayangkan ini adalah komitmen Anda dan ditampilkan seperti ini di editor.
Penting untuk dicatat bahwa komit ini terdaftar dalam urutan yang berlawanan dari yang biasanya Anda lihat menggunakan perintah log. Berarti, komit yang lebih lama akan ditampilkan terlebih dahulu.
2) Ubah 'pilih' menjadi 'squash' untuk perubahan yang dilakukan terakhir. sesuatu seperti yang ditunjukkan di bawah ini. Dengan melakukan itu, 2 komit terakhir Anda akan digabung dengan yang pertama.
Anda juga dapat menggunakan formulir pendek jika Anda memiliki banyak komitmen untuk digabungkan:
untuk mengedit menggunakan 'i', itu akan memungkinkan editor untuk dimasukkan. Ingatlah bahwa sebagian besar komit (tertua) tidak dapat dihancurkan karena tidak ada komit sebelumnya untuk digabungkan. Jadi itu harus dipilih atau 'p'. Gunakan 'Esc' untuk keluar dari mode penyisipan.
3) Sekarang, simpan editor dengan perintah berikut. : wq
Saat Anda menyimpannya, Anda memiliki satu komit yang memperkenalkan perubahan dari ketiga komit sebelumnya.
Semoga ini bisa membantu Anda.
sumber
git rebase -i HEAD~2
adalah tempat yang membantu bagi saya untuk memulai. Maka jawaban ini sangat membantu. Kemudian, sayagit status
menunjukkan "Cabang Anda dan 'asal / fitur / xyz' telah berbeda, dan masing-masing memiliki 1 dan 1 komit yang berbeda, masing-masing." Jadi saya perlugit push origin feature/xyz --force-with-lease
Melihat stackoverflow.com/a/59309553/470749 dan freecodecamp.org/forum/t/…Pertama : tidak ada yang memberitahu Anda untuk hanya memiliki satu komit per cabang per dorongan: dorongan adalah mekanisme publikasi yang memungkinkan Anda untuk mempublikasikan riwayat lokal (yaitu kumpulan komit) pada repo jarak jauh.
Kedua : a
git merge --no-ff topical_xFeature
akan merekam master sebagai satu komit pekerjaan topik Anda, sebelum mendorongmaster
.(Dengan begitu, Anda tetap bertahan
topical_xFeature
untuk evolusi lebih lanjut, yang dapat Anda catatmaster
sebagai satu komit baru pada penggabungan berikutnya --tidak-ff.Jika menyingkirkan
topical_xFeature
adalah tujuannya, makagit merge --squash
merupakan pilihan yang tepat, sebagaimana dirinci dalam Brian Campbell 's jawaban .)sumber
--squash
, bukan--no-ff
itu yang Anda inginkan.--no-ff
akan membuat gabungan komit, tetapi juga meninggalkan semua komit daritopical_xFeature
.topical_feature
cabang, dan hanya mencatat satu komit dimaster
cabang.Beralihlah ke cabang utama dan pastikan Anda mutakhir.
git fetch
ini mungkin diperlukan (tergantung pada konfigurasi git Anda) untuk menerima pembaruan pada origin / masterGabungkan cabang fitur ke cabang master.
Setel ulang cabang master ke status asal.
Git sekarang menganggap semua perubahan sebagai perubahan yang tidak dipentaskan. Kami dapat menambahkan perubahan ini sebagai satu komit. Menambahkan. juga akan menambahkan file yang tidak dilacak.
Ref: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
sumber
Pertama-tama pilih komit yang Anda inginkan setelahnya.
Atur ulang ke kepala yang Anda pilih (saya telah memilih
HEAD@{2}
)git status
(hanya untuk memastikan)Tambahkan komit baru Anda
Catatan:
HEAD@{0}
&HEAD@{1}
Sekarang digabung menjadi 1 komit, ini dapat dilakukan untuk beberapa komit juga.git reflog
lagi harus menampilkan:sumber
Alat Untuk Mengotomatiskan Banyak Komit Menjadi Satu
seperti kata Kondal Kolipaka . Menggunakan "git rebase -i"
Logika "git rebase"
Saat menggunakan "git rebase -i", git menghasilkan file git-rebase-todo di direktori .git / rebase-merge saat ini, dan kemudian memanggil editor git untuk memungkinkan pengguna mengedit file git-rebase-todo untuk diproses. Jadi alat ini perlu dipenuhi:
Ubah editor git default
Jadi, alat tersebut perlu mengubah editor git dan memproses file git-rebase-todo. Alat menggunakan python di bawah ini:
Ref: https://liwugang.github.io/2019/12/30/git_commits_en.html
sumber