@Mark Longair memakukannya dalam jawabannya di sini , tapi saya ingin menambahkan beberapa wawasan tambahan.
Terkait, dan menjawab pertanyaan tentang cara memecah Permintaan Tarik (PR) besar, terutama ketika menekan komitmen Anda tidak praktis karena satu atau lebih gabungan master ke dalam feature_branch Anda
Situasi saya:
Saya membuat besar feature_branchdengan 30 komitmen dan membuka Permintaan Tarik (PR) pada GitHub untuk menggabungkannya master. Branch mastermengganti satu ton di bawahku, dan menerima 200 komit yang feature_branchtidak kumiliki. Untuk menyelesaikan konflik yang saya lakukan git checkout feature_branchdan git merge masteruntuk menggabungkan masterperubahan ke dalam saya feature_branch. Saya memilih untuk mergedaripada rebasemenjadi master terbaru sehingga saya harus menyelesaikan konflik hanya satu kali daripada berpotensi 30 kali (satu kali untuk setiap komitmen saya). Saya tidak ingin memeras 30 komit saya menjadi 1 terlebih dahulu dan kemudian kembali ke yang terbarumasterkarena itu mungkin menghapus riwayat komentar ulasan GitHub dalam PR. Jadi, saya menggabungkan master ke cabang fitur saya dan menyelesaikan konflik 1 kali. Semuanya baik-baik saja. Namun PR saya terlalu besar untuk ditinjau oleh kolega saya. Saya perlu membaginya. Saya pergi untuk menekan 30 komit saya dan OH TIDAK! DIMANA MEREKA? MEREKA SEMUA YANG TERCANTUM DENGAN master200 komitmen baru-baru ini sekarang karena saya bergabung masterdengan saya feature_branch! APA YANG SAYA LAKUKAN?
git cherrypenggunaan jika Anda ingin mencoba git cherry-pickkomitmen individu:
git cherry untuk menyelamatkan (semacam)!
Untuk melihat semua komitmen yang ada feature_branchtetapi TIDAK dalam, mastersaya dapat melakukannya:
git checkout feature_branch
git cherry master
ATAU, saya dapat memeriksa komit dari cabang APA PUN dengan TIDAK MEMASTIKAN saya sedang feature_branchmelakukan git cherry [upstream_branch] [feature_branch], seperti ini. Sekali lagi, ini memeriksa untuk melihat yang melakukan adalah feature_branchtetapi tidak dalam upstream_branch( masterdalam hal ini):
git cherry master feature_branch
Menambahkan -vjuga menunjukkan baris subjek pesan komit:
git cherry -v master
Memipis ke "jumlah kata" "-line" ( wc -l) menghitung berapa banyak komit yang ada:
git cherry master | wc -l
Anda dapat membandingkan jumlah ini dengan angka komit yang diperlihatkan dalam GithHub PR Anda agar merasa lebih baik karena mengetahui bahwa itu git cherrybenar - benar berfungsi. Anda juga dapat membandingkan hash git satu per satu dan melihatnya cocok di antara git cherrydan GitHub. Perhatikan bahwa git cherryTIDAK akan menghitung setiap komit merge di mana Anda bergabung masterke dalam feature_branch, tapi GitHub WILL. Jadi, jika Anda melihat perbedaan kecil dalam hitungan, cari halaman komit PR GitHub untuk kata "gabung" dan Anda mungkin akan melihat bahwa itulah penyebabnya git cherry. Mis: komit berjudul "Gabungkan 'master' cabang ke feature_branch" akan muncul di PR GitHub tetapi tidak ketika Anda menjalankan git cherry master feature_branch. Ini baik dan diharapkan.
Jadi, sekarang saya memiliki cara untuk mengetahui perbedaan mana yang mungkin ingin saya ceri-pilih ke cabang fitur baru untuk memisahkan perbedaan ini: Saya dapat menggunakan git cherry master feature_branchsecara lokal, atau melihat komitmen di GitHub PR.
Bagaimana squashing bisa membantu - andai saja kita bisa terjepit:
Sebuah alternatif, bagaimanapun, untuk memisahkan diff saya yang besar adalah dengan memecah semua 30 komit saya menjadi satu, menambal yang ke cabang fitur baru, soft reset patch komit, kemudian gunakan git guiuntuk menambahkan potongan file dengan file, potongan demi potongan, atau baris demi baris. Setelah saya mendapatkan satu sub-fitur, saya dapat melakukan apa yang saya tambahkan kemudian memeriksa cabang baru, menambahkan lebih banyak, melakukan, memeriksa cabang baru, dll, sampai saya memiliki fitur besar saya dibagi menjadi beberapa sub-fitur . Masalahnya adalah bahwa 30 komit saya berbaur dengan 200 komit lain dari orang lain karena saya git merge mastermasuk ke dalam saya feature_branch, jadi rebasing karenanya tidak praktis, karena saya harus menyaring 230 komit untuk memesan ulang dan menghancurkan 30 komit saya.
Cara menggunakan file tambalan sebagai pengganti yang lebih mudah untuk terjepit:
Cara mengatasinya adalah dengan hanya mendapatkan file tambalan yang berisi "squash-equivalen" dari semua 30 komit saya, menambalnya ke garpu baru master(cabang-sub-fitur baru), dan bekerja dari sana, sebagai berikut:
git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch
Sekarang saya memiliki 30-komit patch saya semua diterapkan secara lokal, tetapi tidak dipentaskan dan tidak berkomitmen.
Sekarang gunakan git guiuntuk menambahkan file, potongan, dan / atau baris dan putus PR besar Anda atau "diff":
Perhatikan bahwa jika Anda tidak memilikinya git gui, Anda dapat menginstalnya dengan mudah di Ubuntu sudo apt install git-gui.
Sekarang saya dapat menjalankan git guidan mulai menambahkan file, potongan, dan / atau baris (dengan mengklik kanan pada program GUI Git), dan memecah 30 cabang fitur komit ke dalam sub cabang seperti dijelaskan di atas, berulang kali menambahkan, melakukan, lalu forking cabang fitur baru dan ulangi siklus ini sampai semua perubahan telah ditambahkan ke cabang-sub-fitur dan fitur 30-commit saya berhasil dipecah menjadi 3 atau 4 sub-fitur. Saya dapat membuka PR terpisah untuk masing-masing sub-fitur ini sekarang, dan mereka akan lebih mudah untuk ditinjau oleh tim saya.
Referensi:
- Buat tambalan atau file diff dari repositori git dan terapkan ke repositori git lain