Berkontribusi pada proyek di github, cara "mendasarkan kembali permintaan tarik saya di atas master"

98

Ok jadi saya berkontribusi pada proyek di github. Proyek di github adalah upstream, repo bercabang saya di github adalah origin, dan localrepo saya di komputer saya.

git checkout -b feature
# Working on feature
git commit -a -m 'only commit on feature'

kemudian saya mengajukan permintaan tarik

git push origin master

Permintaan penarikan ditinjau dan perubahan yang tidak terkait perlu dilakukan. Orang lain membuat komit dan bergabung keupstream/master

Sekarang saya diminta oleh upstreampengelola untuk "menyusun kembali permintaan tarik saya di atas master"

Ini adalah cerita saya (masukkan efek suara Hukum dan Ketertiban) .....

Saya tidak membuat perubahan apa pun pada permintaan tarik dan fitur komit pada cabangnya masih sama.

git checkout master
git fetch upstream
git checkout feature
git rebase master
=> "Current branch feature is up to date."
git push origin feature
=> "Everything up-to-date"

Saya tidak mengerti. Bagaimana ini mungkin ketika saya tahu bahwa seseorang berkomitmen dan bergabung upstream/mastersetelah saya mendorong permintaan tarik saya ke origin/feature?

Adakah yang bisa memberi tahu saya prosedur apa yang harus dilakukan dalam situasi ini?

fontno
sumber

Jawaban:

110

Anda hanya menampilkan pengambilan di repo upstream. Itu tidak benar-benar memperbarui cabang lokal Anda. Itu hanya memperbarui pengetahuan Anda tentangupstream . Anda harus memastikan upstream/mastertelah digabungkan sepenuhnya ke dalam Anda master, seperti dengan a git pull, sebelum melakukan rebasing ke master, atau lebih sederhananya rebase ke upstream/master.

Yaitu:

git checkout master
git pull upstream master
git checkout feature
git rebase master

atau

git checkout feature
git rebase upstream/master

Memperbarui:

Setelah memperbaiki featurecabang lokal Anda, Anda harus mendorongnya kembali originuntuk menyelesaikan pembaruan permintaan penarikan. Karena Anda sudah mendorong featuresekali, Anda tidak bisa pushlagi begitu saja karena rebase mengubah sejarah, dan itu bukan percepatan. Biasanya, jika dorongan gagal dengan "non-percepat-maju", Anda akan menyelesaikannya dengan melakukan penarikan, tetapi penarikan hanya akan menggabungkan dua riwayat yang berbeda, yang jelas bukan yang Anda inginkan. Itu berarti featurecabang lama Anda (pra rebase) akan digabungkan dengan yang baru (pasca rebase). Anda ingin menimpa origin/feature dengan status featurecabang baru , membuang data apa pun dari yang lama. Itu berarti Anda ingin memaksakan dorongan untuk terjadi, meskipun itu bukan percepatan, menggunakan git push -f origin feature. catatan:berbahaya , dan Anda bisa kehilangan komitmen dengannya. Hanya gunakan jika Anda benar-benar yakin Anda tahu apa yang Anda lakukan, seperti di sini, di mana Anda dengan sengaja ingin melepaskan komitmen lama yang tidak berguna di cabang pra-rebase feature.

Ryan Stewart
sumber
1
Oke, saya mengerti, terima kasih atas klarifikasinya. Saya melihat bahwa saya seharusnya menarik alih-alih diambil. Sekarang saya memiliki masalah lain, ketika saya git push origin featuremendapatkan kesalahan non-fast-forward, gagal mendorong dll. Akankah git pull --rebase menyelesaikan kesalahan ini dan mendorong ke cabang fitur saya atau apakah ini akan menyebabkan masalah bagi pengelola dan orang lain?
fontno
1
Memperbarui jawaban saya untuk menutupi dorongan.
Ryan Stewart
Dalam kasus saya, saya menambahkan repo upstream sebagai remote, tetapi lupa mengambil darinya. git fetch upstreammengunduh perubahan terbaru, lalu akhirnya git rebase upstream/developberfungsi.
Alberto Chiusole
10

Sekarang saya diminta oleh pengelola hulu untuk "mengubah permintaan tarik saya ke atas master"

Perhatikan bahwa sejak September 2016, pengelola dapat memicu rebase sendiri.

Lihat " Rebase dan gabungkan permintaan tarik "

Ketika Anda memilih opsi "Rebase and merge" yang baru, komit dari cabang permintaan tarik akan didasarkan pada ujung cabang dasar, dan kemudian cabang dasar itu sendiri dengan cepat diteruskan ke kepala yang baru direbasis ini. Rebases secara otomatis menyetel komiter dari komitmen yang direbasis ke pengguna saat ini, sambil menjaga informasi kepengarangan tetap utuh. Cabang permintaan penarikan tidak akan diubah oleh operasi ini.

Jika rebase tidak dapat dilakukan karena bentrok, kami akan memberi tahu Anda sehingga Anda dapat menyelesaikannya secara manual jika perlu.

https://cloud.githubusercontent.com/assets/2195/18671961/a03fa9b6-7f35-11e6-8fa0-e16b2fede8ca.gif

VonC
sumber