Saya baru-baru ini melakukan proyek dan menerapkan beberapa perbaikan. Saya kemudian membuat permintaan tarik yang kemudian diterima.
Beberapa hari kemudian perubahan lain dilakukan oleh kontributor lain. Jadi garpu saya tidak mengandung perubahan itu.
Bagaimana saya bisa memasukkan uang itu ke dalam garpu saya? Apakah saya perlu menghapus dan membuat ulang garpu ketika ada perubahan lebih lanjut untuk disumbangkan? Atau ada tombol pembaruan?
git
github
pull-request
git-fork
Lea Hayes
sumber
sumber
Jawaban:
Di klon lokal repositori bercabang Anda, Anda bisa menambahkan repositori GitHub asli sebagai "remote". ("Remote" seperti nama panggilan untuk URL repositori -
origin
misalnya, adalah satu.) Kemudian Anda dapat mengambil semua cabang dari repositori hulu itu, dan menyusun kembali pekerjaan Anda untuk terus bekerja pada versi upstream. Dalam hal perintah yang mungkin terlihat seperti:Jika Anda tidak ingin menulis ulang sejarah cabang master Anda, (misalnya karena orang lain mungkin telah mengkloningnya) maka Anda harus mengganti perintah terakhir dengan
git merge upstream/master
. Namun, untuk membuat permintaan tarik lebih lanjut yang sebersih mungkin, mungkin lebih baik untuk melakukan rebase.Jika Anda telah mengubah kembali cabang
upstream/master
Anda, Anda mungkin harus mendorongnya untuk mendorongnya ke repositori bercabang sendiri di GitHub. Anda akan melakukannya dengan:Anda hanya perlu menggunakan
-f
yang pertama kali setelah rebased.sumber
-f
yang mengacaukan semua orang yang bisa mengkloning versi Anda.git merge --no-ff upstream/master
Dengan begini komit Anda tidak di atas lagi.Mulai Mei 2014, dimungkinkan untuk memperbarui garpu langsung dari GitHub. Ini masih berfungsi sampai September 2017, TAPI itu akan menyebabkan sejarah komit yang kotor.
Update from original
).Sekarang Anda memiliki tiga opsi, tetapi masing-masing akan menghasilkan riwayat komit yang kurang bersih.
This branch is X commits ahead, Y commits behind <original fork>
.Jadi ya, Anda dapat menjaga repo Anda diperbarui dengan upstreamnya menggunakan GitHub web UI, tetapi melakukan hal itu akan menodai riwayat komit Anda. Tetaplah pada baris perintah sebagai gantinya - mudah.
sumber
Berikut adalah dokumen resmi GitHub tentang Menyinkronkan garpu :
sumber
git push origin master
--follow-tags
: stackoverflow.com/a/26438076/667847git merge upstream/master
, kemudian memeriksa untuk mengembangkan cabang dan melakukangit merge upstream/develop
Permission denied (publickey). fatal: Could not read from remote repository.
ketika mencoba mengambil dari akun Github Facebook hulu.Banyak jawaban yang akhirnya menggerakkan fork one Anda di depan repositori induk. Jawaban ini merangkum langkah-langkah yang ditemukan di sini yang akan memindahkan garpu Anda ke komit yang sama dengan orang tua .
Ubah direktori ke repositori lokal Anda.
git checkout master
Tambahkan induk sebagai repositori jarak jauh,
git remote add upstream <repo-location>
git fetch upstream
Isu
git rebase upstream/master
git status
Isu
git push origin master
Untuk informasi lebih lanjut tentang perintah ini, lihat langkah 3 .
sumber
Jika, seperti saya, Anda tidak pernah melakukan sesuatu secara langsung untuk dikuasai , yang sebenarnya harus Anda lakukan, Anda dapat melakukan hal berikut.
Dari klon lokal garpu Anda, buat remote hulu Anda. Anda hanya perlu melakukannya sekali:
Maka setiap kali Anda ingin mengejar ketinggalan dengan cabang master repositori hulu Anda perlu:
Dengan asumsi Anda tidak pernah melakukan apa pun pada menguasai diri sendiri, Anda harus sudah melakukannya. Sekarang Anda dapat mendorong master lokal Anda ke garpu GitHub jauh asal Anda. Anda juga bisa rebase cabang pengembangan Anda pada master lokal Anda yang sekarang up-to-date.
Setelah pengaturan awal upstream dan checkout master, yang perlu Anda lakukan adalah menjalankan perintah berikut untuk menyinkronkan master Anda dengan upstream: git pull upstream master .
sumber
Kata Pengantar: Garpu Anda adalah "asal" dan repositori yang Anda gunakan adalah "upstream".
Mari kita asumsikan bahwa Anda sudah menggandakan garpu Anda ke komputer Anda dengan perintah seperti ini:
Jika itu diberikan maka Anda harus melanjutkan dalam urutan ini:
Tambahkan "hulu" ke repositori hasil kloning Anda ("asal"):
Ambil komit (dan cabang) dari "hulu":
Beralih ke cabang "master" garpu Anda ("asal"):
Simpan perubahan cabang "master" Anda:
Gabungkan perubahan dari cabang "master" dari "hulu" ke cabang "master" dari "asal" Anda:
Selesaikan konflik penggabungan jika ada dan lakukan penggabungan Anda
Dorong perubahan ke garpu Anda
Dapatkan kembali perubahan simpanan Anda (jika ada)
Kamu sudah selesai! Selamat!
GitHub juga menyediakan instruksi untuk topik ini: Menyinkronkan garpu
sumber
git remote add upstream [email protected]:original_author/project_name.git
hanya alias untukgit remote add upstream https://github.com/original_author/project_name.git
?git stash
dangit stash pop
bagian yang sangat membantuSejak November 2013 telah ada permintaan fitur tidak resmi terbuka dengan GitHub untuk meminta mereka menambahkan metode yang sangat sederhana dan intuitif untuk menjaga garpu lokal tetap sinkron dengan upstream:
https://github.com/isaacs/github/issues/121
Catatan: Karena permintaan fitur tidak resmi, disarankan untuk menghubungi
[email protected]
untuk menambahkan dukungan Anda agar fitur seperti ini diterapkan. Permintaan fitur tidak resmi di atas dapat digunakan sebagai bukti jumlah minat dalam penerapan ini.sumber
Pada tanggal jawaban ini, GitHub belum ( atau harus saya katakan tidak lagi? ) Fitur ini di antarmuka web. Anda dapat, bagaimanapun, meminta
[email protected]
untuk menambahkan suara Anda untuk itu.Sementara itu, pengguna GitHub bardiharborow telah menciptakan alat untuk melakukan hal ini: https://upriver.github.io/
Sumber ada di sini: https://github.com/upriver/upriver.github.io
sumber
Jika Anda menggunakan GitHub untuk Windows atau Mac maka sekarang mereka memiliki fitur satu-klik untuk memperbarui garpu:
sumber
Sebenarnya, dimungkinkan untuk membuat cabang di garpu Anda dari komit apa pun dari hulu di browser:
https://github.com/<repo>/commits/<hash>
, di mana repo adalah garpu Anda, dan hash adalah hash penuh komit yang dapat Anda temukan di antarmuka web hulu. Sebagai contoh, saya dapat membuka https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 , yang menunjuk padalinux
master
saat penulisan.Anda kemudian dapat mengambil cabang itu ke klon lokal Anda, dan Anda tidak perlu mendorong semua data itu kembali ke GitHub ketika Anda mendorong suntingan di atas komit itu. Atau gunakan antarmuka web untuk mengubah sesuatu di cabang itu.
Cara kerjanya (ini adalah dugaan, saya tidak tahu bagaimana tepatnya GitHub melakukannya): fork berbagi penyimpanan objek dan menggunakan ruang nama untuk memisahkan referensi pengguna. Jadi, Anda dapat mengakses semua komit melalui fork Anda, bahkan jika itu tidak ada pada saat forking.
sumber
Ikuti langkah-langkah di bawah ini. Saya mencobanya dan itu membantu saya.
Periksa ke cabang Anda
Tarik cabang repositori sumber untuk mendapatkan kode terbaru
sumber
git push HttpsForYourForkOfTheRepo BRANCH_NAME
Saya memperbarui repositori bercabang saya dengan satu baris ini:
Gunakan ini jika Anda tidak ingin menambahkan titik akhir jarak jauh lain ke proyek Anda, seperti solusi lain yang diposting di sini.
sumber
pull
.Sebagai pelengkap jawaban ini, saya mencari cara untuk memperbarui semua cabang terpencil repo kloning saya ( asal ) dari cabang-cabang hulu dalam sekali jalan. Beginilah cara saya melakukannya.
Ini mengasumsikan Anda telah mengkonfigurasi remote remote upstream di repositori sumber (dari mana asal bercabang) dan telah disinkronkan dengan
git fetch upstream
.Lalu lari:
Bagian pertama dari perintah ini mencantumkan semua kepala di repo jarak jauh hulu dan menghapus SHA-1 diikuti oleh
refs/heads/
awalan nama cabang.Kemudian untuk masing-masing cabang ini, mendorong salinan lokal dari cabang pelacakan jarak jauh hulu (
refs/remotes/upstream/<branch>
di sisi lokal) langsung ke cabang jauh di asal (refs/heads/<branch>
di sisi terpencil).Salah satu dari perintah sinkronisasi cabang ini mungkin gagal karena salah satu dari dua alasan: cabang upstream telah ditulis ulang, atau Anda telah mendorong komit pada cabang itu ke fork Anda. Dalam kasus pertama di mana Anda belum melakukan sesuatu pada cabang pada garpu Anda, aman untuk mendorong dengan paksa (Tambahkan -f switch; yaitu
git push -f
dalam perintah di atas). Dalam kasus lain, ini normal karena cabang fork Anda telah menyimpang dan Anda tidak dapat mengharapkan perintah sinkronisasi berfungsi sampai komit Anda digabungkan kembali ke hulu .sumber
Aplikasi "Tarik" adalah solusi pengaturan-dan-lupa otomatis. Ini akan menyinkronkan cabang default dari garpu Anda dengan repositori hulu.
Kunjungi URL, klik tombol hijau "Instal" dan pilih repositori tempat Anda ingin mengaktifkan sinkronisasi otomatis.
Cabang diperbarui sekali per jam langsung di GitHub, pada mesin lokal Anda, Anda perlu menarik cabang master untuk memastikan bahwa salinan lokal Anda sinkron.
sumber
mergemethod
. Lebih lanjut tentang ini di siniAndroid Studio sekarang telah belajar untuk bekerja dengan repositori garpu GitHub (Anda bahkan tidak perlu menambahkan repositori jarak jauh "upstream" dengan perintah konsol).
Buka menu VCS → Git
Dan perhatikan dua item menu popup terakhir:
Rebase garpu GitHub saya
Buat Permintaan Tarik
Coba mereka. Saya menggunakan yang pertama untuk menyinkronkan repositori lokal saya. Pokoknya cabang-cabang dari repositori jarak jauh induk ("upstream") akan dapat diakses di Android Studio setelah Anda mengklik "Rebase my GitHub fork", dan Anda akan dapat mengoperasikannya dengan mudah.
(Saya menggunakan Android Studio 3.0 dengan plugin "Integrasi Git" dan "GitHub".)
sumber
Ketika Anda telah mengkloning repositori bercabang Anda, pergi ke jalur direktori di mana klon Anda berada dan beberapa baris di Terminal Git Bash Anda.
Dan di sana Anda baik untuk pergi. Semua perubahan yang diperbarui di repositori utama akan dimasukkan ke repositori fork Anda.
Perintah "fetch" sangat diperlukan untuk tetap up-to-date dalam suatu proyek: hanya ketika melakukan "git fetch" Anda akan diberi tahu tentang perubahan yang didorong oleh kolega Anda ke server jarak jauh.
Anda masih dapat mengunjungi di sini untuk pertanyaan lebih lanjut
sumber
Jika Anda mengatur hulu Anda. Periksa dengan
git remote -v
, maka ini sudah cukup.sumber
Itu tergantung pada ukuran repositori Anda dan bagaimana Anda melakukannya.
Jika itu adalah repositori yang cukup besar, Anda mungkin ingin mengelolanya dengan cara khusus (misalnya, jatuhkan riwayat). Pada dasarnya, Anda bisa mendapatkan perbedaan antara versi saat ini dan versi hulu, komit dan kemudian pilih kembali untuk dikuasai.
Coba baca yang ini . Ini menjelaskan cara menangani repositori Git besar dan bagaimana meng-upstreamnya dengan perubahan terbaru.
sumber
Saya ingin menambahkan jawaban @ krlmlr .
Awalnya, repositori bercabang memiliki satu cabang bernama:
master
. Jika Anda sedang mengerjakan fitur baru atau perbaikan, Anda biasanya akan membuat cabang barufeature
dan melakukan perubahan.Jika Anda ingin repositori bercabang untuk disinkronkan dengan repositori induk, Anda bisa mengatur file konfigurasi (
pull.yml
) untuk aplikasi Tarik ( di cabang fitur ), seperti ini:Ini membuat
master
cabang repo bercabang up-to-date dengan repo induk. Itu membuatfeature
cabang repo bercabang diperbarui melaluimaster
cabang repo bercabang dengan menggabungkan yang sama. Ini mengasumsikan bahwafeature
cabang adalah cabang default yang berisi file konfigurasi.Di sini ada dua
mergemethods
yang bermain, satu adalahhardreset
yang membantu memaksa perubahan sinkronisasi dimaster
cabang repo bercabang dengan repo induk dan metode lainnya adalahmerge
. Metode ini digunakan untuk menggabungkan perubahan yang dilakukan oleh Anda difeature
cabang dan perubahan yang dilakukan karena memaksa sinkronisasi dimaster
cabang. Jika terjadi konflik penggabungan, aplikasi tarik akan memungkinkan Anda untuk memilih tindakan selanjutnya selama permintaan tarik.Anda dapat membaca tentang konfigurasi dasar dan lanjutan dan beragam di
mergemethods
sini .Saat ini saya menggunakan konfigurasi ini di repo bercabang saya di sini untuk memastikan peningkatan yang diminta di sini tetap diperbarui.
sumber
Ada dua hal utama tentang menjaga repositori bercabang yang selalu diperbarui untuk selamanya.
Jadi ketika Permintaan Tarik Anda diterima maka Anda dapat menghapus cabang dengan aman karena kode kontribusi Anda akan tinggal di master repositori bercabang Anda saat Anda memperbaruinya dengan hulu. Dengan ini master Anda akan selalu dalam kondisi bersih untuk membuat cabang baru untuk melakukan perubahan lain.
Ini bisa dilakukan dengan cron . Ini adalah contoh kode jika Anda melakukannya di linux.
letakkan kode ini pada
crontab file
untuk menjalankan pekerjaan dalam basis per jam.kemudian buat
cron.sh
file skrip dan interaksi git dengan ssh-agent dan / atau harapkan seperti di bawah iniPeriksa repositori bercabang Anda. Dari waktu ke waktu akan selalu menampilkan pemberitahuan ini:
sumber
Gunakan perintah ini (dalam kasus beruntung)
sumber