Menggabungkan antar garpu di GitHub

259

Saya bercabang repositori GitHub. Lalu saya mendorong beberapa perubahan ke garpu saya. Kemudian repositori asli menggabungkan perubahan saya dan beberapa lainnya. Sekarang, saya ingin menggabungkan perubahan yang saya lewatkan. Saya mencoba tarikan sederhana diikuti oleh dorongan, tetapi ini menghasilkan komitmen saya dalam rangkap dua. Apa cara terbaik untuk melakukannya?

R. Martinho Fernandes
sumber

Jawaban:

352

Anda mungkin memiliki "remote" untuk setiap repositori. Anda perlu menarik dari satu remote dan mendorong ke yang lain.

Jika Anda awalnya diklon dari fork Anda, remote itu akan disebut "asal". Jika Anda belum menambahkannya, Anda harus menambahkan repositori orang pertama sebagai remote lain:

git remote add firstrepo git://github.com/first/repo.git

Setelah itu semua diatur, Anda memang harus bisa

git pull firstrepo master
git push origin

Ingat, git pulltidak lebih dari makro yang berfungsi git fetchdan git merge, dalam urutan itu. Anda hanya perlu mengambil daftar commit dari repositori orang pertama dan kemudian menggabungkan cabang mereka ke pohon Anda. Penggabungan harus melakukan hal yang benar dengan komitmen Anda di kedua cabang.

GitHub, dalam segala keanggunannya yang abadi, tentu saja memberi Anda jalan pintas. Ada tombol "fast-forward" pada fork repositori yang dapat Anda gunakan untuk menangkap fork up jika Anda sepenuhnya tergabung ke sisi lain.

Jim Puls
sumber
1
Apakah ada cara untuk melakukan ini sepenuhnya dengan operasi jarak jauh? Jika saya mengerti dengan benar, dengan metode ini Anda akan mengunduh semua perubahan ke repositori lokal dan kemudian mengunggah (mendorong) semuanya kembali ke fork di github. Saya lebih suka entah bagaimana menarik semua perubahan langsung ke garpu di github.
Ken Liu
1
Tidak. Git tidak mendukung itu. Untungnya, Github memiliki tombol gabungan di antarmuka web sekarang.
cweiske
13
@cweiske - di mana tombol Gabung ini? Saya telah melihat-lihat halaman admin dan halaman utama, tetapi tidak dapat menemukannya :(.
Adam
2
@ Adam, ada di halaman Tarik Permintaan. Jadi forker akan membuka Permintaan Tarik untuk menggabungkan salah satu cabang mereka ke salah satu cabang Anda. Di sana Anda dapat mengklik tombol gabung.
Rob Barreca
2
Tombol Fast-forward sepertinya tidak tersedia lagi. Sebagai informasi, saya telah menggunakan URL git lain dalam perintah saya:git remote add snaury [email protected]:snaury/script-runner
olibre
72

Jadi jawaban yang diterima di atas tidak bekerja untuk saya dengan sempurna. Yaitu, tampaknya kehilangan tautan ke penulis github asli ketika itu bekerja, dan kemudian tampaknya tidak berfungsi lagi setelah itu. Saya pikir masalahnya adalah bahwa jawabannya meninggalkan / antara nama jarak jauh dan cabang. Jadi itu akan mengambil cabang yang disebut master dari jarak jauh, tetapi kemudian tidak dapat melakukan apa pun dengan itu. Tidak begitu yakin mengapa.

Inilah cara yang direkomendasikan github dari situs mereka .

Setelah Anda mengkloning repo bercabang Anda, Anda perlu menambahkan remote menunjuk ke aslinya seperti jawaban sebelumnya. Mereka suka menyebutnya hulu, tetapi tidak masalah.

git remote add upstream git://github.com/octocat/Spoon-Knife.git

Maka Anda mengambil

git fetch upstream

dan Anda akan melihat versi yang tersedia untuk digabung

From git://github.com/octocat/Spoon-Knife.git
 * [new branch]      gh-pages   -> upstream/gh-pages
 * [new branch]      master     -> upstream/master

Maka Anda hanya perlu memilih cabang yang ingin Anda gabungkan. Ingatlah Anda ini bukan cabang lokal, mereka disimpan dalam remote. Tetapi asalkan Anda tidak memiliki cabang lokal yang disebut hulu / master (yang diizinkan), Anda harus menggabungkan dengan garis di bawah ini:

git merge upstream/master

Atau Anda dapat memintas pengambilan / penggabungan (setelah pengambilan awal setidaknya) dengan baris ini:

git pull upstream/master
Bob Spryn
sumber
Masalahnya adalah bahwa jika Anda sudah memiliki perubahan, perubahan yang Anda sertakan akan membuat komit gabungan. Berguna dalam beberapa kasus, tetapi seringkali tidak ada gunanya.
Pablo Olmos de Aguilera C.
1
Dalam hal penggunaannya, git rebaseitu akan bekerja jauh lebih baik, dan
mengabaikan