Bagaimana cara saya memperbarui repositori bercabang GitHub?

3606

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?

Lea Hayes
sumber
120
Ini juga dapat dilakukan dari UI github. Saya ingin memberikan penghargaan [untuk poster lain ini] [1]. [1]: stackoverflow.com/a/21131381/728141
Mike Schroll
2
Posting blog bagus lainnya tentang ini - Keeping A GitHub Fork Updated
Arup Rakshit
3
Menemukan ini di artikel bantuan Github: help.github.com/articles/syncing-a-fork
Pranav
2
Apakah ini duplikat dari stackoverflow.com/questions/3903817/… ?
David Cary
Berikut ini adalah video demo yang melakukan ini menggunakan dua akun github youtube.com/watch?v=kpE0gTX4ycE
lifebalance

Jawaban:

3983

Di klon lokal repositori bercabang Anda, Anda bisa menambahkan repositori GitHub asli sebagai "remote". ("Remote" seperti nama panggilan untuk URL repositori - originmisalnya, 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:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

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/masterAnda, Anda mungkin harus mendorongnya untuk mendorongnya ke repositori bercabang sendiri di GitHub. Anda akan melakukannya dengan:

git push -f origin master

Anda hanya perlu menggunakan -fyang pertama kali setelah rebased.

Mark Longair
sumber
94
Karena fork Anda hanya ada di github, dan github tidak memiliki alat untuk melakukan penggabungan melalui antarmuka web, maka jawaban yang tepat adalah melakukan penggabungan upstream secara lokal dan mendorong perubahan kembali ke fork Anda.
Tim Keating
29
Berikut ini adalah tutorial hebat yang saya temukan saat bekerja dengan github: gun.io/blog/how-to-github-fork-branch-and-pull-request
Tim Keating
50
Catatan singkat bahwa daripada harus rebase cabang master Anda sendiri untuk memastikan Anda memulai dengan kondisi bersih, Anda mungkin harus bekerja pada cabang terpisah dan membuat permintaan tarik dari itu. Ini membuat master Anda tetap bersih untuk penggabungan di masa depan dan menghentikan Anda dari keharusan menulis ulang sejarah -fyang mengacaukan semua orang yang bisa mengkloning versi Anda.
Mateusz Kowalczyk
11
Alih-alih perintah rebase, saya menggunakan yang berikut: git merge --no-ff upstream/masterDengan begini komit Anda tidak di atas lagi.
Steckdoserich
52
Kegagalan Git lainnya. Jika alat ini seharusnya mendukung kolaborasi terdistribusi, lalu mengapa begitu sulit untuk melakukan alur kerja dasar? 4 juta orang dan 2.200 suara positif berarti alat gagal. "Anda dapat menambahkan repositori GitHub asli sebagai" remote " - Mengapa orang harus melakukan ini? Mengapa tidak dilakukan selama garpu? Apa yang sangat rusak dengan alat ini?
jww
740

Mulai Mei 2014, dimungkinkan untuk memperbarui garpu langsung dari GitHub. Ini masih berfungsi sampai September 2017, TAPI itu akan menyebabkan sejarah komit yang kotor.

  1. Buka garpu Anda di GitHub.
  2. Klik pada Pull Requests.
  3. Klik pada New Pull Request. Secara default, GitHub akan membandingkan yang asli dengan garpu Anda, dan seharusnya tidak ada yang bisa dibandingkan jika Anda tidak melakukan perubahan apa pun.
  4. Klik switching the basejika Anda melihat tautan itu. Jika tidak, atur secara manual base forkdrop-down ke garpu Anda, dan head forkke hulu. Sekarang GitHub akan membandingkan garpu Anda dengan yang asli, dan Anda akan melihat semua perubahan terbaru. masukkan deskripsi gambar di sini
  5. Create pull requestdan menetapkan nama yang dapat diprediksi untuk permintaan tarik Anda (misalnya, Update from original).
  6. Gulir ke bawah untuk Merge pull request, tetapi jangan mengklik apa pun.

Sekarang Anda memiliki tiga opsi, tetapi masing-masing akan menghasilkan riwayat komit yang kurang bersih.

  1. Default akan membuat komit gabungan jelek.
  2. Jika Anda mengklik dropdown dan memilih "Squash and merge", semua komit intervensi akan tergencet menjadi satu. Ini paling sering adalah sesuatu yang tidak Anda inginkan.
  3. Jika Anda mengklik Rebase and merge, semua komit akan dibuat "dengan" Anda, PR asli akan ditautkan ke PR Anda, dan GitHub akan ditampilkan 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.

lobzik
sumber
19
Ini berhasil sekali. Kedua kalinya proses ini tidak bekerja dengan cara yang sama: tautan "Switching the base" tidak muncul. Dan ketika saya menekan "Klik untuk membuat permintaan tarik" itu menciptakan PR pada repo SUMBER. BUKAN apa yang saya inginkan ..
javadba
29
Masih berfungsi (Marchi 2015), meskipun tautan "Switching the base" sudah tidak ada lagi. Anda harus mengubah drop-down "Basis" sehingga keduanya menunjuk ke garpu Anda dan kemudian Anda akan mendapatkan prompt untuk "Membandingkan seluruh repo", yang akan membawa Anda ke tempat yang Anda inginkan.
mluisbrown
8
April 2015. Pekerjaan. Terima kasih. Saya mendapatkan "Switching to base". Namun, langkah 6 adalah "Buat permintaan tarik" -> masukkan komentar -> "Buat permintaan tarik". Berakhir dengan 1 komit di depan yang asli.
cartland
5
@cartland (atau yang lain) - ya, katanya "Cabang ini adalah 1 berkomitmen di depan ..." Apakah ini sesuatu yang perlu dikhawatirkan? Apakah mungkin menyingkirkan pesan itu?
RenniePet
11
bukankah lebih baik, dengan hanya memperbarui atau menyinkronkan tombol!
transformer
457

Berikut adalah dokumen resmi GitHub tentang Menyinkronkan garpu :

Menyinkronkan garpu

Pengaturan

Sebelum Anda bisa menyinkronkan, Anda perlu menambahkan remote yang menunjuk ke repositori hulu. Anda mungkin telah melakukan ini ketika Anda awalnya bercabang.

Tip: Menyinkronkan garpu Anda hanya akan memperbarui salinan lokal repositori Anda; itu tidak memperbarui repositori Anda di GitHub.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Sinkronisasi

Ada dua langkah yang diperlukan untuk menyinkronkan repositori Anda dengan upstream: pertama Anda harus mengambil dari jarak jauh, kemudian Anda harus menggabungkan cabang yang diinginkan ke cabang lokal Anda.

Mengambil

Mengambil dari repositori jarak jauh akan membawa cabang dan komitmen masing-masing. Ini disimpan di repositori lokal Anda di bawah cabang khusus.

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Kami sekarang memiliki cabang master hulu yang disimpan di cabang lokal, hulu / master

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

Penggabungan

Sekarang kami telah mengambil repositori hulu, kami ingin menggabungkan perubahannya ke cabang lokal kami. Ini akan membuat cabang itu sinkron dengan hulu, tanpa kehilangan perubahan lokal kami.

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Jika cabang lokal Anda tidak memiliki komitmen unik, git akan melakukan "fast-forward":

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Tip: Jika Anda ingin memperbarui repositori di GitHub, ikuti instruksi di sini

jumpnett
sumber
1
Ini memperbarui garpu lokal saya, tetapi garpu saya di Github.com masih mengatakan "43 komit di belakang". Saya harus menggunakan teknik lobzik untuk membuat permintaan tarik bagi diri saya untuk menggabungkan perubahan master ke garpu Github.com saya.
Michael McGinnis
11
@MichaelMcGinnis Setelah bergabung secara lokal, Anda harus mendorong perubahan Anda ke github. git push origin master
jumpnett
1
Mungkin pintar untuk mendorong dengan --follow-tags: stackoverflow.com/a/26438076/667847
kenny
1
Saya harus melakukannya untuk semua cabang secara terpisah git merge upstream/master, kemudian memeriksa untuk mengembangkan cabang dan melakukangit merge upstream/develop
Shobi
stackoverflow.com/a/14074925/470749 membantu saya karena saya mendapatkan Permission denied (publickey). fatal: Could not read from remote repository.ketika mencoba mengambil dari akun Github Facebook hulu.
Ryan
98

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 .

  1. Ubah direktori ke repositori lokal Anda.

    • Beralihlah ke cabang utama jika Anda tidak git checkout master
  2. Tambahkan induk sebagai repositori jarak jauh, git remote add upstream <repo-location>

  3. Isu git fetch upstream
  4. Isu git rebase upstream/master

    • Pada tahap ini Anda memeriksa yang melakukan apa yang akan digabungkan dengan mengetik git status
  5. Isu git push origin master

Untuk informasi lebih lanjut tentang perintah ini, lihat langkah 3 .

Sahar Rabinoviz
sumber
13
@ MT: Di mana Anda memasukkan perintah ini, meskipun? Inti dari pertanyaan, seperti yang saya mengerti, adalah bagaimana menyinkronkan ulang garpu GitHub pribadi Anda dengan proyek utama, dan melakukan ini semua dari GitHub . Dengan kata lain, bagaimana Anda bisa memperbarui garpu jarak jauh tanpa repositori lokal?
John Y
4
@JohnY Menggunakan GitHub akan selalu membuat komit ekstra. Anda perlu melakukan semua ini di shell pada repo lokal untuk menghindari komit ekstra.
Jonathan Cross
49

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:

git remote add upstream https://github.com/whoever/whatever.git

Maka setiap kali Anda ingin mengejar ketinggalan dengan cabang master repositori hulu Anda perlu:

git checkout master
git pull upstream master

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 .

Slion
sumber
48

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:

git clone [email protected]:your_name/project_name.git
cd project_name

Jika itu diberikan maka Anda harus melanjutkan dalam urutan ini:

  1. Tambahkan "hulu" ke repositori hasil kloning Anda ("asal"):

    git remote add upstream [email protected]:original_author/project_name.git
    
  2. Ambil komit (dan cabang) dari "hulu":

    git fetch upstream
    
  3. Beralih ke cabang "master" garpu Anda ("asal"):

    git checkout master
    
  4. Simpan perubahan cabang "master" Anda:

    git stash
    
  5. Gabungkan perubahan dari cabang "master" dari "hulu" ke cabang "master" dari "asal" Anda:

    git merge upstream/master
    
  6. Selesaikan konflik penggabungan jika ada dan lakukan penggabungan Anda

    git commit -am "Merged from upstream"
    
  7. Dorong perubahan ke garpu Anda

    git push
    
  8. Dapatkan kembali perubahan simpanan Anda (jika ada)

    git stash pop
    
  9. Kamu sudah selesai! Selamat!

GitHub juga menyediakan instruksi untuk topik ini: Menyinkronkan garpu

Benny Neugebauer
sumber
1
Sebagian terbantu: Apakah git remote add upstream [email protected]:original_author/project_name.githanya alias untuk git remote add upstream https://github.com/original_author/project_name.git?
Wolf
2
Serigala , tebak kamu tahu ini sekarang, tapi untuk keturunan ... Ini adalah format untuk ssh. help.github.com/articles/configuring-a-remote-for-a-fork
Brad Ellis
2
Terima kasih banyak. git stashdan git stash popbagian yang sangat membantu
सत्यमेव जयते
Ini berhasil. Setelah git merge upstream / master, auto gabung gagal karena jalur yang tidak terputus yang harus saya jalankan git add -A lalu git commit -m "message" maka itu up to date.
highcenbug
45

Sejak 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.

isedwards
sumber
23

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

Lucero
sumber
2
Sementara saya menemukan alat ide bagus kenyataannya adalah itu RUSAK. Itu memuat hanya 20 repo dari akun saya dan bahkan footer redirect ke situs web yang tidak ada. Jika itu diperbaiki saya akan menjadi advokat besar.
Sorin
2
Sampai hari ini, saya telah berhasil menggunakan hulu untuk menyinkronkan garpu dengan repo hulu, jadi itu berfungsi untuk tujuan saya dan saya akan terus menggunakannya.
NauticalMile
1
@sorin Batasan 20 repo / cabang ini (lebih tepatnya 30 sekarang) berasal dari pengaturan paging default GitHub. Perlu ada beberapa penyesuaian terhadap kode untuk menangani hal ini.
Andreas
11

Sebenarnya, dimungkinkan untuk membuat cabang di garpu Anda dari komit apa pun dari hulu di browser:

Masukkan deskripsi gambar di sini

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.

max630
sumber
2
Ini bagus! Ini menghindari unggahan komitmen yang sama sekali tidak berguna ke github.
Rotsor
9

Ikuti langkah-langkah di bawah ini. Saya mencobanya dan itu membantu saya.

Periksa ke cabang Anda

Sintaksis: git branch yourDevelopmentBranch
Contoh: master checkout git

Tarik cabang repositori sumber untuk mendapatkan kode terbaru

Sintaks: git pull https://github.com/tastejs/awesome-app-ideas master
Contoh: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

Venkat.R
sumber
1
Jika Anda menggunakan GitHub, Anda mungkin juga ingin mendorong perubahan Anda ke cabang GitHub Anda. git push HttpsForYourForkOfTheRepo BRANCH_NAME
user3731622
9

Saya memperbarui repositori bercabang saya dengan satu baris ini:

git pull https://github.com/forkuser/forkedrepo.git branch

Gunakan ini jika Anda tidak ingin menambahkan titik akhir jarak jauh lain ke proyek Anda, seperti solusi lain yang diposting di sini.

R.Bravo
sumber
2
Apakah ada batasan untuk ini? yaitu apakah itu berlaku hanya untuk kasus-kasus di mana Anda belum menambahkan komit, menggabungkan, menarik permintaan, atau menarik permintaan digabung menjadi hulu sejak pembaruan terakhir?
LightCC
1
itu bekerja seperti tarikan normal dari cabang jarak jauh. Jika Anda melakukan X melakukan repo lokal Anda dan sekarang Anda Y komit di belakang repo asli, itu akan membawa Y komit ke cabang lokal Anda dan, mungkin, membuat Anda beberapa konflik untuk diselesaikan.
R.Bravo
1
@LightCC Ini tidak berbeda dengan menarik dari remote yang sebelumnya ditambahkan sama sekali, kecuali kenyataan bahwa Anda belum menambahkan remote . Jadi kerugiannya adalah Anda harus memasukkan URL repositori penuh setiap kali Anda mau pull.
Marc.2377
1
Ini adalah solusi sempurna jika Anda tidak perlu menarik berkali-kali dari repo asli, atau proyek bercabang relatif sederhana.
AxeEffect
7

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:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

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 -fdalam 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 .

Thomas Guyot-Sionnest
sumber
6

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.

krlmlr
sumber
2
Harap dicatat bahwa dengan pengaturan dasar, Anda dapat kehilangan perubahan yang dibuat dalam repositori bercabang Anda. Untuk menyimpan perubahan, atur file konfigurasi dan tentukan a mergemethod. Lebih lanjut tentang ini di sini
Saurabh P Bhandari
1
Saya memang mencatat bahwa pengaturan dasar mengirimkan permintaan tarikan dan menggabungkannya (sebagai lawan dari apa yang dinyatakan dalam dokumentasi). Ini sedikit menjengkelkan tetapi memecahkan masalah kehilangan data?
krlmlr
4

Android Studio sekarang telah belajar untuk bekerja dengan repositori garpu GitHub (Anda bahkan tidak perlu menambahkan repositori jarak jauh "upstream" dengan perintah konsol).

Buka menu VCSGit

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".)

Masukkan deskripsi gambar di sini

alexshr
sumber
4

Ketika Anda telah mengkloning repositori bercabang Anda, pergi ke jalur direktori di mana klon Anda berada dan beberapa baris di Terminal Git Bash Anda.

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream

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

Prateek Chanda
sumber
4

Jika Anda mengatur hulu Anda. Periksa dengan git remote -v, maka ini sudah cukup.

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push
prosti
sumber
2

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.

s0nicYouth
sumber
2

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 baru featuredan 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:

version: "1"
rules:
  - base: feature
    upstream: master
    mergeMethod: merge
  - base: master
    upstream: parent_repo:master
    mergeMethod: hardreset

Ini membuat mastercabang repo bercabang up-to-date dengan repo induk. Itu membuat featurecabang repo bercabang diperbarui melalui mastercabang repo bercabang dengan menggabungkan yang sama. Ini mengasumsikan bahwa featurecabang adalah cabang default yang berisi file konfigurasi.

Di sini ada dua mergemethodsyang bermain, satu adalah hardresetyang membantu memaksa perubahan sinkronisasi di mastercabang repo bercabang dengan repo induk dan metode lainnya adalah merge. Metode ini digunakan untuk menggabungkan perubahan yang dilakukan oleh Anda di featurecabang dan perubahan yang dilakukan karena memaksa sinkronisasi di mastercabang. 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.

Saurabh P Bhandari
sumber
1

Ada dua hal utama tentang menjaga repositori bercabang yang selalu diperbarui untuk selamanya.

1. Buat cabang dari master garpu dan lakukan perubahan di sana .

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.

2. Buat pekerjaan yang dijadwalkan untuk master garpu untuk melakukan pembaruan secara otomatis .

Ini bisa dilakukan dengan cron . Ini adalah contoh kode jika Anda melakukannya di linux.

$ crontab -e

letakkan kode ini pada crontab fileuntuk menjalankan pekerjaan dalam basis per jam.

0 * * * * sh ~/cron.sh

kemudian buat cron.shfile skrip dan interaksi git dengan ssh-agent dan / atau harapkan seperti di bawah ini

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="[email protected]:<username>/$REPOSITORY.git"   
[email protected]:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

Periksa repositori bercabang Anda. Dari waktu ke waktu akan selalu menampilkan pemberitahuan ini:

Cabang ini bahkan dengan <upstream>: master .

masukkan deskripsi gambar di sini

Chetabahana
sumber
0

Gunakan perintah ini (dalam kasus beruntung)

git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v
Apakah Nhu Vy
sumber