Tarik pembaruan baru dari repositori GitHub asli ke repositori GitHub bercabang


615

Saya bercabang repositori seseorang di GitHub dan ingin memperbarui versi saya dengan komit dan pembaruan yang dibuat dalam repositori asli. Ini dibuat setelah saya mengambil salinan saya.

Bagaimana saya bisa menarik perubahan yang dibuat di tempat asal dan memasukkannya ke dalam repositori saya?


1
Kemungkinan duplikat, atau mungkin hanya terkait: Penggabungan antar garpu di GitHub .

Jika ada tag tambahan yang mungkin ingin Anda sinkronkan, lakukan git push --force origin --tagssetelah solusi yang diajukan!
MediaVince

Jawaban:


716

Anda harus menambahkan repositori asli (yang Anda garpu) sebagai remote.

Dari halaman manual garpu GitHub :

garpu

Setelah klon selesai, repo Anda akan memiliki remote bernama " origin" yang menunjuk ke garpu Anda di GitHub.
Jangan biarkan nama itu membingungkan Anda, ini tidak menunjuk pada repo asli yang Anda potong. Untuk membantu Anda melacak repo itu, kami akan menambahkan remote lain bernama "upstream":

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

Anda juga memiliki permata ruby ​​yang dapat memfasilitasi operasi GitHub tersebut .

bercabang dua

Lihat juga " Garpu git adalah klon git? ".


14
Lihat juga bassistance.de/2010/06/25/git-fu-updating-your-github-fork untuk ringkasan yang bagus.
VonC

2
@syedrakib Saya lebih suka git rebase upstream/master, tapi saya telah menambahkan dua kemungkinan dalam jawabannya.
VonC

1
@PaBLoX jika Anda telah forked repo, Anda sedang mengerjakan repo Anda , di cabang Anda : rebase dan paksa dorongan: tidak ada kekacauan yang terlibat. Bahkan permintaan penarikan sedang berlangsung akan diperbarui dengan benar.
VonC

2
@PaBLoX Anda tidak membuat kekacauan: Anda git push --force, mengganti riwayat cabang Anda di GitHub dengan cabang lokal Anda yang baru saja Anda rebase. Karena hanya Anda yang menggunakan cabang sedih, tidak ada kekacauan yang terlibat.
VonC

2
Saya mengerti. Saya masih berpikir itu sulit, tidak trivial, dan tidak intuitif. Masih aneh bahwa perubahan saya akan selalu di atas (terakhir), padahal sebenarnya mereka dibuat sebelumnya. Solusi yang saya posting sebelumnya terlihat lebih baik (masih nontrivial juga). Masalahnya adalah bahwa melakukan perubahan hash (jelas, karena ada orang tua baru) dan menghasilkan banyak suara di dalam github ketika masalah dipanggil. Tetap mengejutkan saya bahwa tidak ada cara untuk tetap memperbarui dengan upstream dan mengelola garpu Anda sendiri tanpa membuat komit penggabungan yang tidak berguna atau "berbohong" tentang sejarah.
Pablo Olmos de Aguilera C.

99

Selain jawaban VonC, Anda dapat menyesuaikannya sesuai dengan keinginan Anda lebih jauh.

Setelah mengambil dari cabang jauh, Anda masih harus menggabungkan komit. Saya akan ganti

$ git fetch upstream

dengan

$ git pull upstream master

karena git pull pada dasarnya adalah git fetch + git merge.


Bagaimana jika saya tahu bahwa cabang hulu tidak memiliki perubahan pada file yang ada, tetapi hanya beberapa file sumber daya ditambahkan - apakah saya masih perlu digabung?
azec-pdx

4
Tentunya itu hanya akan melakukan fast-forward dalam kasus itu
Domness

bagaimana seseorang membuat master upstream menimpa semua file lokal (sehingga tidak ada konflik gabungan) master upstream memimpin dalam hal ini sehingga kami percaya 100% ... telah berhasil melakukan ini
snh_nl

1
@ snh_nl git rebase upstream masterPerhatikan bahwa ini bukan bebas konflik jika Anda cukup menyimpang dari upstream/master. Lihat git-scm.com/docs/git-rebase (tl; dr: hard ini me-reset master lokal Anda ke upstream, dan kemudian mencoba untuk menghapus semua komit lokal dari titik divergensi ke depan)
cowbert

68

Video ini menunjukkan cara memperbarui garpu langsung dari GitHub

Langkah:

  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 pada switching the base. Sekarang GitHub akan membandingkan garpu Anda dengan yang asli, dan Anda akan melihat semua perubahan terbaru.
  5. Klik Create a pull requestuntuk perbandingan ini dan tentukan nama yang dapat diprediksi untuk permintaan tarik Anda (misalnya, Perbarui dari aslinya).
  6. Klik pada Create pull request.
  7. Gulir ke bawah dan klik Merge pull requestdan akhirnya Confirmbergabung. Jika garpu Anda tidak memiliki perubahan, Anda dapat menggabungkannya secara otomatis.

3
Sayangnya, metode grafis yang bagus ini menciptakan kebisingan tambahan di garpu Anda seperti yang disebutkan di atas di komentar untuk jawaban yang diterima. Oleh karena itu disarankan metode baris perintah: help.github.com/articles/syncing-a-fork
Jonathan Cross

Saya tidak dapat menemukan switching the baseopsi
alper

64

Menggunakan:

git remote add upstream ORIGINAL_REPOSITORY_URL

Ini akan mengatur upstream Anda ke repositori tempat Anda bercabang. Kemudian lakukan ini:

git fetch upstream      

Ini akan mengambil semua cabang termasuk master dari repositori asli.

Gabungkan data ini di cabang master lokal Anda:

git merge upstream/master

Dorong perubahan ke repositori bercabang Anda yaitu ke asal:

git push origin master

Voila! Anda selesai dengan menyinkronkan repositori asli.


bagaimana seseorang membuat master upstream menimpa semua file lokal (jadi tidak ada konflik gabungan) master upstream memimpin dalam hal ini sehingga kami percaya 100% ... telah berhasil melakukan ini
snh_nl

Salah satu caranya adalah dengan cukup menghapus salinan lokal, dan melakukan kloning baru :)
ARK

1

Jika Anda menggunakan aplikasi desktop GitHub, ada tombol sinkronisasi di sudut kanan atas. Klik di atasnya kemudian di Update from <original repo>dekat kiri atas.

Jika tidak ada perubahan yang akan disinkronkan, ini akan menjadi tidak aktif.

Berikut adalah beberapa tangkapan layar untuk mempermudah ini.


1

Jika tidak ada ruginya Anda juga bisa menghapus garpu Anda saja pergi ke pengaturan ... pergi ke bagian zona bahaya di bawah ini dan klik hapus repositori. Ini akan meminta Anda untuk memasukkan nama repositori dan kata sandi Anda setelahnya. Setelah itu Anda baru saja garpu asli.


1

Jika Anda ingin melakukannya tanpa cli, Anda dapat melakukannya sepenuhnya di situs web Github.

  1. Buka repositori garpu Anda.
  2. Klik pada New pull request.
  3. Pastikan untuk mengatur garpu Anda sebagai repositori dasar, dan repositori asli (hulu) sebagai repositori kepala. Biasanya Anda hanya ingin menyinkronkan cabang master.
  4. Create new pull request.
  5. Pilih panah di sebelah kanan tombol penggabungan, dan pastikan untuk memilih rebase daripada penggabungan. Kemudian klik tombolnya. Dengan cara ini, itu tidak akan menghasilkan komit gabungan yang tidak perlu.
  6. Selesai

0

Untuk secara otomatis menyinkronkan repositori bercabang Anda dengan repositori induk, Anda bisa menggunakan Pull App di GitHub.

Lihat Readme untuk detail lebih lanjut.

Untuk pengaturan lanjutan di mana Anda ingin menyimpan perubahan yang Anda lakukan pada repositori bercabang, lihat jawaban saya pada pertanyaan serupa di sini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.