Pertanyaan Dengan menggunakan GIT, bagaimana saya bisa secara selektif menarik / menggabungkan perubahan dari 'garpu' orang lain?


Ambil skenario ini:

  1. Saya memutuskan untuk 'membuat' basis kode di github.com, dan mulai melakukan rutinitas saya: Edit - Komit - Dorong; alias hack hack hack.
  2. Setelah saya melakukan beberapa perubahan, saya melihat beberapa perubahan yang dilakukan orang lain pada proyek yang sama, dan saya menyukainya!
  3. Saya memutuskan saya ingin menggabungkannya dengan milik saya. Masalahnya, saya hanya ingin 'porsi' dari satu komitmen tertentu, dari beberapa komit yang dia buat.

Metode apa yang paling efisien untuk mendapatkan jumlah perubahan yang dipilih ini, digabung menjadi 'garpu' saya?


76
2017-09-10 12:36


asal


Jawaban:


Setelah mengendalikan gelombang dunia IRC, seseorang memberikan solusi yang bagus:

git cherry-pick SHA1 --no-commit
git add --patch

Semoga itu membantu orang lain dengan pertanyaan yang sama!

EDIT: OK, mungkin itu tidak sesederhana itu. Berikut ini langkah-langkah lengkapnya:

  1. Pertama Anda harus berada di repositori Anda, lakukan yang diperlukan cd-ing untuk masuk ke direktori kerja Anda.

  2. Anda sekarang perlu menambahkan cabang jarak jauh, lalu mengambilnya. Lakukan ini dengan:

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. Anda sekarang dapat menjalankan perintah seperti git log someUser/master untuk menemukan commit SHA1 yang ingin Anda gabungkan secara 'sebagian'.

  4. Setelah Anda memiliki SHA, Anda sekarang dapat menjalankan:

    git cherry-pick -n SHA1

    dimana SHA1 adalah komit SHA, duh!

  5. Ada kemungkinan besar akan terjadi konflik, tergantung berapa lama komitmennya, dan seberapa sering area tertentu dari proyek tersebut berubah. Maaf, tetapi Anda harus menyelesaikannya secara manual dengan editor terpercaya Anda. Jadi tarik keluar VIM, atau apa pun yang Anda gunakan, dan singkirkan konflik sampai Anda mencapai tahap di mana Anda menyukai perubahan.

  6. Anda sekarang harus me-reset indeks ke revisi HEAD, kemudian Anda dapat menggunakan GIT yang terpercaya add --patch perintah untuk mengambil dan memilih perubahan apa yang Anda inginkan:

    git reset HEAD

    git add --patch atau git add -p

  7. Yay! Waktu Komit:

    git commit -m "I merged a select amount of changes"

  8. Untuk membersihkan kekacauan (Hal-hal yang Anda katakan tidak masuk git add --patch) dan hanya menyimpan perubahan yang dipilih dalam repositori kerja Anda, jalankan:

    git reset --hard HEAD

    Tampaknya git checkout -f adalah pilihan lain juga.


113
2017-09-10 13:05



Saya tidak jelas tentang apa yang Anda inginkan. Jika Anda ingin membawa hanya komit tertentu dari garpu lain, Anda bisa menggunakannya git cherry-pick SHA. Penjelasan lengkap tentang gitready.


2
2017-09-10 12:40



Saya sangat menyukai solusi Tim, namun terkadang saya suka bermain-main di vimdiff. Solusi saya untuk masalah ini adalah mentah, tetapi bekerja untuk saya karena saya suka vim.

Saya telah menetapkan vimdiff sebagai difftool saya, dan kemudian secara selektif menggabungkan saya diff cabang:

git difftool <branch> <file>

Lalu saya pergi ke panel dengan versi cabang saat ini dan mengedit asli di vim (kadang-kadang ini tidak perlu, tetapi kadang-kadang vimdiff membuka versi di / tmp) dan menonaktifkan mode read-only:

:e <file>
:set readonly!

Sekarang saya dapat menggunakan alat patch vim seperti do dan dp untuk menerapkan apa yang saya inginkan, dan melakukan pengeditan kecil lainnya saat saya pergi. Ketika saya selesai, saya menyimpan file, keluar dari vim, dan kemudian panggung dan komit file di git seperti edit biasa.

Seperti yang saya katakan, ini tidak terlalu canggih, tetapi sangat kuat, dan masih murni di baris perintah. Pastikan untuk menambahkan pesan komit yang jelas, karena git tidak akan secara otomatis menyertakan pesan gabungan untuk Anda.

contoh vimdiff http://j.mp/1dZVllt


2
2018-01-18 05:03



Jika Anda hanya menginginkan port komit, Anda mungkin lebih baik memilih cherry-memilih komitmen yang Anda inginkan dan mengatur ulang file yang tidak ingin Anda sentuh.

git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN

Tentu saja, jika Anda memiliki beberapa bagian yang dimodifikasi dalam file dan hanya ingin menyimpan beberapa dari mereka, Anda tidak punya pilihan selain mengedit file secara manual, memotong perubahan mereka.


1
2017-09-10 12:38