Pertanyaan Bagaimana cara memperbarui repositori bercabang GitHub?


Saya baru-baru ini mengerjakan 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 mendapatkan perubahan itu ke dalam garpu saya? Apakah saya perlu menghapus dan membuat ulang garpu saya ketika saya memiliki perubahan lebih lanjut untuk berkontribusi? Atau apakah ada tombol pembaruan?


2829
2017-08-30 13:53


asal


Jawaban:


Dalam tiruan lokal dari repositori bercabang Anda, Anda dapat menambahkan repositori GitHub asli sebagai "remote". ("Remote" mirip dengan nama panggilan untuk URL repositori - origin adalah satu, misalnya.) Kemudian Anda dapat mengambil semua cabang dari repositori hulu tersebut, dan rebase pekerjaan Anda untuk terus mengerjakan 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 penarikan lebih lanjut yang sebersih mungkin, mungkin lebih baik untuk melakukan rebase.


Jika Anda telah mengubah cabang Anda upstream/master Anda mungkin perlu memaksakan push untuk mendorongnya ke repositori bercabang Anda sendiri di GitHub. Anda akan melakukannya dengan:

git push -f origin master

Anda hanya perlu menggunakan -f pertama kali setelah Anda melakukan rebase.


3098
2017-08-30 14:01



Mulai Mei 2014, dimungkinkan untuk memperbarui garpu langsung dari GitHub. Ini masih berfungsi sejak September 2017, TAPI itu akan mengarah pada sejarah komitmen kotor.

  1. Buka garpu Anda di GitHub.
  2. Klik Tarik Permintaan.
  3. Klik Permintaan Tarik Baru. Secara default, GitHub akan membandingkan yang asli dengan garpu Anda, dan tidak boleh ada apa pun untuk dibandingkan jika Anda tidak melakukan perubahan apa pun.
  4. Klik berpindah pangkalan jika Anda melihat tautan itu. Jika tidak, atur secara manual garpu dasar drop ke garpu Anda, dan garpu kepala ke hulu. Sekarang GitHub akan membandingkan garpu Anda dengan yang asli, dan Anda akan melihat semua perubahan terbaru. enter image description here
  5. Buat permintaan tarik dan tetapkan nama yang dapat diprediksi ke permintaan tarik Anda (misalnya, Update from original).
  6. Gulir ke bawah Gabungkan permintaan tarik, tapi jangan klik apa pun.

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

  1. Defaultnya akan membuat commit gabungan yang jelek.
  2. Jika Anda mengklik dropdown dan memilih "Squash and merge", semua komit mengintervensi akan disisipkan menjadi satu. Ini paling sering sesuatu yang tidak Anda inginkan.
  3. Jika Anda mengklik Rebase dan gabung, semua komit akan dibuat "dengan" Anda, PR asli akan menautkan ke PR Anda, dan GitHub akan ditampilkan This branch is X commits ahead, Y commits behind <original fork>.

Jadi ya, Anda dapat memperbarui repo dengan hulu menggunakan UI web GitHub, tetapi hal ini akan menyengat riwayat komitmen Anda. Pilih terus baris perintah sebaliknya - itu mudah.


642
2018-05-25 07:31



Ini adalah dokumen resmi GitHub Menyinkronkan garpu:

Menyinkronkan garpu

Pengaturan

Sebelum Anda dapat melakukan sinkronisasi, Anda perlu menambahkan remote yang mengarah ke repositori hulu. Anda mungkin telah melakukan ini ketika Anda awalnya bercabang.

Tip: Menyinkronkan fork hanya memutakhirkan salinan lokal Anda dari repositori; 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 hulu: pertama Anda harus mengambil dari remote, maka Anda harus menggabungkan cabang yang diinginkan ke cabang lokal Anda.

Mengambil

Mengambil dari repositori remote akan membawa cabang-cabangnya dan komit 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 induk 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 menjadi selaras 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 Anda di GitHub, ikuti petunjuknya sini


365
2017-10-21 23:04



Banyak jawaban yang akhirnya memindahkan garpu Anda satu komit ke depan dari repositori induk. Jawaban ini merangkum langkah-langkah yang ditemukan sini yang mana akan gerakkan garpu Anda ke komit yang sama dengan orang tua.

  1. Ubah direktori ke repositori lokal Anda.

    • Beralih 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 bahwa 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.


81
2017-08-05 14:59



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 sinkron dengan hulu:

https://github.com/isaacs/github/issues/121

Catatan: Karena permintaan fitur tidak resmi, Anda juga disarankan untuk menghubungi support@github.com untuk menambahkan dukungan Anda untuk fitur seperti ini yang akan diterapkan. Permintaan fitur tidak resmi di atas dapat digunakan sebagai bukti jumlah minat dalam hal ini sedang dilaksanakan.


39
2018-02-21 10:42



Kata pengantar: Garpu Anda adalah "asal" dan repositori Anda bercabang adalah "hulu".

Mari kita berasumsi bahwa Anda sudah mengkloning garpu Anda ke komputer dengan perintah seperti ini:

git clone git@github.com:your_name/project_name.git
cd project_name

Jika itu diberikan maka Anda perlu melanjutkan dalam urutan ini:

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

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Ambil komit (dan cabang) dari "hulu":

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

    git checkout master
    
  4. Menyimpan perubahan cabang "induk" Anda:

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

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

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

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

    git stash pop
    
  9. Kamu sudah selesai! Selamat!

GitHub juga menyediakan instruksi untuk topik ini: Menyinkronkan garpu


29
2018-03-16 12:24



Sampai tanggal jawaban ini, GitHub belum (atau haruskah saya katakan tidak lagi?) fitur ini di antarmuka web. Anda bisa, bagaimanapun, bertanya support@github.com untuk menambah suara Anda untuk itu.

Sementara itu, pengguna GitHub bardiharborow telah membuat alat untuk melakukan hal ini: https://upriver.github.io/

Sumber ada di sini: https://github.com/upriver/upriver.github.io


21
2017-09-14 14:22



Jika, seperti saya, kamu jangan pernah melakukan apa pun secara langsung untuk dikuasai, yang Anda harus benar-benar, 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

Kemudian kapan pun Anda ingin mengejar cabang master repositori hulu, Anda perlu:

git checkout master
git pull upstream master

Dengan asumsi Anda tidak pernah melakukan apa pun di master sendiri Anda harus sudah selesai. Sekarang Anda dapat mendorong guru lokal Anda ke garpu GitHub jarak jauh asal Anda. Anda juga bisa menyulut cabang pengembangan Anda di master lokal Anda yang sekarang sudah up-to-date.

Jadi setelah pengaturan awal hulu dan checkout master, semua yang perlu Anda lakukan adalah menjalankan perintah berikut untuk menyinkronkan master Anda dengan upstream: git tarik master hulu.


21
2018-01-03 16:59