Alur kerja Github yang dipilih untuk memperbarui permintaan tarik setelah peninjauan kode

341

Saya telah mengirimkan perubahan ke proyek Open Source di Github, dan menerima komentar ulasan kode dari salah satu anggota tim inti.

Saya ingin memperbarui kode dengan mempertimbangkan komentar ulasan, dan mengirimkannya kembali. Apa alur kerja terbaik untuk melakukan ini? Dari pengetahuan git / github saya yang terbatas, saya dapat melakukan salah satu dari yang berikut:

  1. Perbarui kode sebagai komit baru, dan tambahkan komit awal dan yang diperbarui ke permintaan tarik saya.

  2. Entah bagaimana (??) kembalikan komit lama dari repositori saya, dan buat komit baru yang berisi semuanya, lalu ajukan permintaan tarik untuk itu?

  3. git commitmemiliki fitur amendemen, tetapi saya dengar Anda tidak boleh menggunakannya setelah mendorong komit di luar repositori lokal Anda? Dalam hal ini saya telah membuat perubahan pada PC lokal saya dan mendorong ke cabang proyek github saya. Apakah ini boleh untuk menggunakan 'mengubah'?

  4. Sesuatu yang lain

Sepertinya opsi 2/3 akan lebih baik, karena proyek open source hanya akan memiliki satu komit dalam sejarah mereka yang akan mengimplementasikan semuanya, tetapi saya tidak yakin bagaimana melakukan ini.

Catatan: Saya tidak tahu apakah ini memengaruhi jawaban atau tidak, tetapi saya tidak melakukan perubahan di cabang terpisah, saya hanya melakukan komit di atas master

Orion Edwards
sumber

Jawaban:

219

Cukup tambahkan komit baru ke cabang yang digunakan dalam permintaan tarik dan dorong cabang ke GitHub. Permintaan tarikan akan secara otomatis diperbarui dengan komit tambahan.

# 2 dan # 3 tidak perlu. Jika orang-orang hanya ingin melihat di mana cabang Anda digabung (dan bukan komit tambahan), mereka dapat menggunakan git log --first-parenthanya untuk melihat komit gabungan dalam log.

Amber
sumber
7
masteradalah cabang juga, jadi secara teknis tidak masalah :)
menyodok
10
@OrionEdwards - seperti yang disebutkan di atas, master adalah cabang, dengan demikian, memperbaruinya akan menyebabkan setiap permintaan tarikan berdasarkan itu diperbarui juga. (Ini adalah alasan bagus untuk menggunakan cabang terpisah untuk apa pun yang Anda rencanakan untuk mengajukan permintaan penarikan.)
Amber
18
Karena kode ini masih dalam peninjauan , biasanya lebih baik untuk memperbaiki commit daripada memperkenalkan komitmen fixup tambahan yang hanya mengacaukan sejarah ...
mgalgs
4
@ mgalgs Itu masalah preferensi.
Amber
4
Saya tidak suka jawaban ini karena alasan yang dijelaskan dalam posting blog yang baru saja saya tulis ; Saya percaya jawaban lain jauh lebih baik.
Adam Spires
224

Untuk memperbarui permintaan tarik

Untuk memperbarui permintaan tarik (titik # 1), satu-satunya hal yang perlu Anda lakukan adalah checkout dari cabang yang sama dengan permintaan tarik dan tekan lagi:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

Opsional - Membersihkan riwayat komit

Anda mungkin diminta untuk meremas komit Anda bersama-sama sehingga riwayat repositori bersih, atau Anda sendiri ingin menghapus komit perantara yang mengalihkan perhatian dari "pesan" dalam permintaan tarikan Anda (poin # 2). Misalnya jika riwayat komit Anda terlihat seperti ini:

$ git remote add parent [email protected]:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem

Merupakan ide yang bagus untuk menyatukan segala sesuatu sehingga mereka tampil sebagai satu komit:

$ git rebase -i parent/master 

Ini akan meminta Anda untuk memilih cara menulis ulang riwayat permintaan tarik Anda, yang berikut akan ada di editor Anda:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

Untuk komit apa pun yang Anda ingin menjadi bagian dari komit sebelumnya - ubah pilih ke squash:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

Dan tutup editor Anda. Git kemudian akan menulis ulang riwayat dan meminta Anda untuk memberikan pesan komit untuk komit gabungan. Ubah sesuai dan riwayat komit Anda sekarang akan singkat:

$ git log --oneline parent/master..master
9de3202 fixing actual problem

Dorong itu ke garpu Anda:

$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To [email protected]:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

dan permintaan tarik Anda akan berisi satu komit, menggabungkan semua perubahan yang sebelumnya dibagi menjadi beberapa komit.

Mengubah sejarah pada repo publik adalah hal yang buruk

Menulis ulang sejarah dan menggunakan git push -fpada cabang yang, berpotensi, telah dikloning oleh orang lain adalah hal yang buruk - itu menyebabkan sejarah repositori dan checkout itu berbeda.

Namun, mengubah sejarah fork Anda untuk memperbaiki perubahan yang Anda usulkan untuk diintegrasikan ke dalam repositori - adalah hal yang baik. Dengan demikian tidak ada reservasi yang menekan "kebisingan" dari permintaan tarik Anda.

Catatan tentang cabang

Pada contoh di atas, saya menunjukkan permintaan tarikan sebagai berasal dari mastercabang fork Anda, tidak ada yang salah dengan itu tetapi hal itu menciptakan batasan tertentu seperti, jika ini adalah teknik standar Anda, hanya mampu memiliki satu PR terbuka per repositori . Namun itu adalah ide yang lebih baik untuk membuat cabang untuk setiap perubahan yang ingin Anda usulkan:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets
AD7six
sumber
28
+1 untuk menyebutkan cara membersihkan komit daripada mendorong komit fixup tambahan.
mgalgs
3
Saya mengalami beberapa masalah memetik / meremas dan jawaban ini membantu saya keluar. Juga memperhatikan bahwa Github menghapus percakapan sebelumnya setelah saya melakukannya git push -f. Tidak ada banyak komentar, tapi itu sesuatu yang tidak kuharapkan.
Hitesh
5
Hanya untuk memperjelas, ketika menghidupkan kembali untuk memiliki sejarah yang bersih, Anda memang mengubah komitmen publik Anda, Anda hanya berasumsi bahwa tidak ada yang peduli karena itu adalah garpu.
brita_
2
Tindak lanjut: praktik terbaik saat master berubah selama PR Anda?
Kevin Suttle
1
Pertimbangkan bahwa penulisan ulang riwayat pada permintaan tarik yang ditinjau (atau yang secara umum mengomentari / merujuk kode) dapat menyebabkan kebingungan, karena riwayat tidak akan cocok lagi dengan apa yang dimaksud dengan komentar. Tidak ada solusi mudah: seseorang akan menutup PR dan merujuknya pada yang baru (untuk tidak menulis ulang sejarah); ide saya adalah hanya mencadangkan SHA komit terbaru yang sedang direset / ditulis ulang dan merujuknya dalam komentar pada PR, setelah paksa-push telah dilakukan. JIKA prune tidak menghapus komitmen yang terlepas itu maka riwayatnya masih akan cocok dengan komentar PR.
Kamafeather