Cara menarik cabang jauh dari repo orang lain

266

Saya punya proyek yang di-host di GitHub yang telah dicabuti seseorang. Di cabang mereka, mereka telah membuat cabang baru "foo" dan membuat beberapa perubahan. Bagaimana cara menarik "foo" mereka ke cabang baru yang juga bernama "foo" di repo saya?

Saya mengerti mereka bisa mengirimkan permintaan tarik kepada saya, tetapi saya ingin memulai proses ini sendiri.

Asumsikan yang berikut:

  1. Karena mereka bercabang proyek saya, kedua repo kami berbagi 'sejarah' yang sama
  2. Meskipun GitHub menunjukkan proyek mereka diambil dari tambang, repositori lokal saya tidak memiliki referensi ke proyek orang ini. Apakah saya perlu menambahkannya sebagai remote?
  3. Saya belum memiliki cabang bernama "foo" - Saya tidak tahu apakah saya harus membuat ini secara manual terlebih dahulu.
  4. Saya pasti ingin ini ditarik ke cabang terpisah dan bukan tuan saya.
Colin O'Dell
sumber

Jawaban:

349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Ini akan mengatur cabang lokal foo, melacak cabang jarak jauh coworker/foo. Jadi, ketika rekan kerja Anda membuat beberapa perubahan, Anda dapat dengan mudah menariknya:

git checkout foo
git pull

Tanggapan terhadap komentar:

Keren :) Dan jika saya ingin membuat perubahan sendiri ke cabang itu, haruskah saya membuat "bar" cabang lokal kedua dari "foo" dan bekerja di sana alih-alih langsung di "foo" saya?

Anda tidak perlu membuat cabang baru, meskipun saya merekomendasikannya. Anda mungkin juga berkomitmen langsung foodan meminta rekan kerja Anda menarik cabang Anda. Tapi cabang itu sudah ada dan cabang Anda fooharus disetel sebagai cabang upstream untuk itu:

git branch --set-upstream foo colin/foo

dengan asumsi colinrepositori Anda (sebuah remote ke repositori rekan kerja Anda) didefinisikan dengan cara yang sama:

git remote add colin git://path/to/colins/repo.git
ralphtheninja
sumber
3
Itu sangat cepat :) Anda mungkin ingin menambahkan bahwa ia harus menggunakan git://URL dari halaman repositori GitHub orang lain sebagai gantinya //path/to/coworkers/repo.git. (Menjelaskan bahwa itulah yang membuat jawaban saya terlalu lambat;))
Mark Longair
Keren :) Dan jika saya ingin membuat perubahan sendiri ke cabang itu, haruskah saya membuat "bar" cabang lokal kedua dari "foo" dan bekerja di sana alih-alih langsung di "foo" saya?
Colin O'Dell
Atau amankah bekerja langsung di "foo" saya dan menarik / menggabungkan perubahannya nanti? Yang merupakan praktik terbaik di sini?
Colin O'Dell
1
Sempurna, itulah yang saya cari :) Terima kasih atas bantuan Anda !!
Colin O'Dell
1
Jawaban bagus dalam 3 menit!
Tieme
103

Tidak, Anda tidak perlu menambahkannya sebagai remote. Itu akan merepotkan dan menyusahkan setiap kali melakukannya.

Meraih komitmen mereka:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Ini menciptakan cabang lokal bernama ournameforbranchyang persis sama dengan apa theirbranchyang mereka miliki. Sebagai contoh pertanyaan, argumen terakhir adalah foo:foo.

Catatan :ournameforbranchbagian dapat lebih jauh ditinggalkan jika memikirkan nama yang tidak bertentangan dengan salah satu cabang Anda sendiri merepotkan. Dalam hal itu, referensi yang disebut FETCH_HEADtersedia. Anda dapat git log FETCH_HEADmelihat komit mereka kemudian melakukan hal-hal seperti cherry-pickedceri memilih komitmen mereka.

Mendorongnya kembali kepada mereka:

Seringkali, Anda ingin memperbaiki sesuatu milik mereka dan mendorongnya kembali. Itu mungkin juga:

git fetch [email protected]:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push [email protected]:theirusername/reponame.git HEAD:theirbranch

Jika bekerja dalam keadaan terpisah membuat Anda khawatir, berarti membuat cabang menggunakan :ournameforbranchdan mengganti FETCH_HEADdan di HEADatas dengan ournameforbranch.

antak
sumber
2
Terima kasih untuk ini, jawaban yang lain tidak berfungsi jika Anda dan orang lain memiliki nama yang identik dengan cabang (seperti mastercabang default )
Ayub
2
Patut disebutkan bahwa metode ini tidak akan berfungsi jika Anda tidak memiliki hal-hal seperti kunci SSH yang terkait dengan akun github Anda, lihat stackoverflow.com/questions/12940626
Przemek D
tidakkah Anda harus ditambahkan sebagai kolaborator sehingga Anda dapat mendorong ke repo mereka?
Sayang
@ Madu Tentu saja! Mendorong menganggap Anda memiliki izin yang diperlukan pada ujung jarak jauh untuk mendorong. Mengambil juga mengasumsikan jalur dapat diakses.
antak
Jika Anda menjalankan git branch -m newbranchsementara dalam keadaan terpisah ini, git akan kehilangan akal dan mulai mengatakan repo Anda tidak valid lagi. git inittampaknya untuk memperbaikinya dan mengembalikan Anda ke kondisi sebelumnya, dengan cabang bernama "newbranch".
Ian Hickson
14

Jika jawaban antak:

git fetch [email protected]:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

Memberi anda:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Kemudian (mengikuti saran Przemek D) gunakan

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>
Peter
sumber
6

Berikut ini adalah solusi bijaksana yang bagus yang bekerja dengan GitHub untuk memeriksa cabang PR dari garpu pengguna lain. Anda perlu mengetahui ID permintaan tarik (yang ditampilkan GitHub bersama dengan judul PR).

Contoh:

Memperbaiki kode tidak aman Anda # 8
alice ingin menggabungkan 1 commit your_repo:masterdariher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Gantikan remote Anda jika berbeda dengan origin.
Pengganti 8dengan ID permintaan tarik yang benar.

Subfuzion
sumber
2
Ini Membutuhkan lebih banyak upvotes. bekerja secara sempurna dan menghindari kesalahan "fatal: Tidak dapat menemukan remote ref" yang saya dapatkan dengan jawaban terpilih. Terima kasih!
Michael Romrell
2 baris kode mudah. Terima kasih telah berbagi ini! Satu-satunya hal yang lebih manis dari ini adalah menggabungkan pembaruan kembali ke permintaan tarik mereka dengan cara yang mudah.
klewis
4

GitHub memiliki opsi baru relatif terhadap jawaban sebelumnya, cukup salin / tempelkan baris perintah dari PR:

  1. Gulir ke bagian bawah PR untuk melihat tombol MergeatauSquash and merge
  2. Klik tautan di sebelah kanan: view command line instructions
  3. Tekan ikon Salin di sebelah kanan Langkah 1
  4. Rekatkan perintah di terminal Anda
Robert Monfera
sumber
2

Jika repo bercabang dilindungi sehingga Anda tidak dapat mendorong langsung ke dalamnya, dan tujuan Anda adalah untuk membuat perubahan pada foo mereka, maka Anda perlu memasukkan foo cabang mereka ke dalam repo Anda seperti:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Sekarang Anda memiliki salinan foo lokal tanpa hulu yang terkait dengannya. Anda dapat melakukan perubahan padanya (atau tidak) dan kemudian mendorong foo Anda ke repo jarak jauh Anda sendiri.

git push --set-upstream origin foo

Sekarang foo ada di repo Anda di GitHub dan foo lokal Anda melacaknya. Jika mereka terus melakukan perubahan pada foo, Anda dapat mengambilnya dan bergabung dengan foo Anda.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
J Smith
sumber