github: Menambahkan komit ke permintaan penarikan yang ada

89

Saya membuka permintaan tarik ke rel repo di github dengan menggunakan tombol Fork & Edit file ini .

Sekarang, Setelah mendapatkan umpan balik tentang PR saya, saya ingin menambahkan beberapa komitmen lagi. jadi inilah yang saya akhiri dengan melakukan

$ git clone [email protected]:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

Ini bekerja dengan baik tetapi tampaknya alur kerja yang cukup kompleks. Mungkin saya salah, ada yang salah di sini?

pertanyaan saya adalah: Apakah saya melakukan ini dengan cara yang benar? jika tidak, lalu apa cara yang tepat untuk melakukan ini?

CuriousMind
sumber
4
Beberapa yang datang ke sini mungkin merasa ini lebih cocok dengan skenario mereka: stackoverflow.com/questions/9790448/…
AaronLS
4
Saya juga menemukan versi pertanyaan / jawaban ini lebih jelas: stackoverflow.com/questions/7947322/…
Ben Wheeler

Jawaban:

64

Karena Anda menggunakan alat GitHub dan hanya mengubah satu file, Anda juga dapat menelusuri file di GitHub, pilih cabang yang tepat dari sudut kiri atas di bawah menu tarik-turun "pohon:" ( patch-3dalam kasus Anda), dan sekarang pilih "Edit file ini". Sekarang perubahan Anda akan dilakukan ke cabang ini dan akan muncul di permintaan penarikan Anda

Abe Voelker
sumber
Perhatikan ini tidak akan berfungsi jika cabang dilindungi , tombol edit akan berwarna abu-abu
Louis Maddox
10

Saya baru saja membuat blog tentang topik ini:

Bagaimana kami terus memperbarui cabang fitur ini? Menggabungkan komit upstream terbaru itu mudah, tetapi Anda ingin menghindari pembuatan komit penggabungan, karena itu tidak akan dihargai ketika didorong ke hulu: Anda kemudian secara efektif melakukan kembali perubahan upstream, dan komit upstream tersebut akan mendapatkan hash baru ( saat mereka mendapatkan orang tua baru). Ini sangat penting, karena komit yang digabungkan tersebut akan tercermin dalam permintaan penarikan GitHub Anda ketika Anda mendorong pembaruan tersebut ke cabang fitur GitHub pribadi Anda (bahkan jika Anda melakukannya setelah Anda mengeluarkan permintaan penarikan.)

Itulah mengapa kita perlu melakukan rebase daripada menggabungkan:

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

Baik opsi rebase dan perintah rebase ke git akan menjaga struktur Anda tetap bersih, dan menghindari menggabungkan komit. Namun perlu diingat bahwa itu adalah komit pertama Anda (dengan mana Anda mengeluarkan permintaan tarik pertama) yang sedang di-rebased, dan yang sekarang memiliki hash komit baru, yang berbeda dari hash asli yang masih ada di cabang repo github jarak jauh Anda .

Sekarang, mendorong pembaruan tersebut ke cabang fitur GitHub pribadi Anda akan gagal di sini, karena kedua cabang berbeda: pohon cabang lokal dan pohon cabang jarak jauh “tidak sinkron”, karena hash komit yang berbeda tersebut. Git akan memberi tahu Anda untuk pertama kali git pull --rebase, lalu mendorong lagi, tetapi ini tidak akan menjadi dorongan maju cepat yang sederhana, karena riwayat Anda telah ditulis ulang. Jangan lakukan itu!

Masalahnya di sini adalah Anda akan kembali mengambil komit pertama yang diubah seperti aslinya, dan itu akan digabungkan di atas cabang lokal Anda. Karena status tidak sinkron, tarikan ini tidak berlaku dengan baik. Anda akan mendapatkan riwayat rusak di mana komit Anda muncul dua kali. Saat Anda memasukkan semua ini ke cabang fitur GitHub, perubahan tersebut akan tercermin pada permintaan penarikan asli, yang akan menjadi sangat, sangat buruk.

AFAIK, sebenarnya tidak ada solusi yang benar-benar bersih untuk ini. Solusi terbaik yang saya temukan adalah memaksa mendorong cabang lokal Anda ke cabang GitHub Anda (sebenarnya memaksa pembaruan non-percepat-maju):

Sesuai git-push (1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

Jadi jangan ditarik, paksa saja dorong seperti ini:

git push svg +user-non-unique

atau:

git push svg user-non-unique --force

Ini sebenarnya akan menimpa cabang jarak jauh Anda, dengan semua yang ada di cabang lokal Anda. Komit yang berada di aliran jarak jauh (dan menyebabkan kegagalan) akan tetap ada, tetapi akan menjuntai, yang akhirnya akan dihapus oleh git-gc (1). Bukan masalah besar.

Seperti yang saya katakan, AFAICS adalah solusi terbersih. Kelemahan dari ini, adalah bahwa PR Anda akan diperbarui dengan komitmen terbaru tersebut, yang akan mendapatkan tanggal kemudian, dan dapat muncul tidak sinkron dalam riwayat komentar PR. Bukan masalah besar, tetapi berpotensi membingungkan.

Serge van Ginderachter
sumber
5

Anda juga dapat membuat permintaan tarik baru yang terikat ke, masterbukan yang spesifikabc1234 revisi .

Dengan cara itu, setiap commit / push baru ke repositori Anda akan ditambahkan ke permintaan pull.

cfedermann.dll
sumber
3

Ya - Anda melakukan lebih banyak pekerjaan daripada yang Anda butuhkan. Buat saja komit tambahan lalu paksa dorong. Anda akan melihat komit asli serta yang baru didorong saat Anda menyegarkan github di browser Anda.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD
Forrest
sumber
ini adalah cara termudah dan paling lurus ke depan, tidak yakin mengapa ini bukan jawaban teratas
Banjo Obayomi