Git menarik cabang tertentu dari GitHub

631

Saya punya proyek dengan banyak cabang. Saya telah mendorong mereka ke GitHub , dan sekarang setelah orang lain mengerjakan proyek ini, saya harus menarik cabangnya dari GitHub. Ini berfungsi baik di master. Tetapi katakan bahwa seseorang membuat cabang xyz. Bagaimana saya bisa menarik cabang xyzdari GitHub dan menggabungkannya ke cabang xyzdi saya localhost?

Saya sebenarnya punya jawaban di sini: Dorong dan tarik cabang di Git

Tapi saya mendapatkan kesalahan "! [Ditolak]" dan sesuatu tentang "non fast forward".

Ada saran?

tybro0103
sumber
3
apa perintah sebenarnya yang Anda jalankan?
Alex N.
1
Ini adalah pengambilan yang dapat gagal dengan pesan 'non fast forward'. Apakah Anda memodifikasi cabang pelacakan jarak jauh (asal / xyz), atau apakah cabang memutar ulang / ditulis ulang di repositori jarak jauh? Anda harus menggunakan " git fetch origin --force", tetapi harap baca dokumentasi sebelum melakukannya.
Jakub Narębski

Jawaban:

758

Tapi saya mendapatkan kesalahan "! [Ditolak]" dan sesuatu tentang "non fast forward"

Itu karena Git tidak dapat menggabungkan perubahan dari cabang menjadi master Anda saat ini. Katakanlah Anda telah memeriksa cabang master, dan Anda ingin bergabung dengan cabang jarak jauh other-branch. Ketika Anda melakukan ini:

$ git pull origin other-branch

Git pada dasarnya melakukan ini:

$ git fetch origin other-branch && git merge other-branch

Artinya, pullhanya fetchdiikuti oleh a merge. Namun, ketika pull-ing, Git hanya akan bergabung other-branch jika ia dapat melakukan penggabungan maju-cepat . Sebuah fast-forward merge adalah gabungan di mana kepala cabang Anda mencoba untuk menggabungkan ke dalam adalah keturunan langsung dari kepala cabang yang ingin bergabung. Misalnya, jika Anda memiliki pohon sejarah ini, maka penggabungan other-branchakan menghasilkan penggabungan maju-cepat:

O-O-O-O-O-O
^         ^
master    other-branch

Namun, ini bukan penggabungan maju-cepat:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Untuk mengatasi masalah Anda, pertama ambil cabang jarak jauh:

$ git fetch origin other-branch

Kemudian gabungkan ke cabang Anda saat ini (saya akan menganggap itu master), dan memperbaiki konflik penggabungan:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!
mipadi
sumber
Tidak, masalahnya adalah mengambil, bukan dengan langkah penggabungan.
Jakub Narębski
3
Biasanya, remote diatur sedemikian rupa sehingga mengambil paksa, bahkan jika mereka tidak menghasilkan komit maju cepat, jadi itu tidak boleh terjadi pada mengambil kecuali OP mengubah sesuatu dengan konfigurasi yang biasa. Masalah fast-forward dapat terjadi selama pengambilan atau penggabungan. Apa yang membuat Anda mengatakan bahwa masalahnya pasti dalam mengambil, dan bukan dalam penggabungan?
mipadi
Saya ikuti langkah-langkah ini (ambil, gabungkan). Git memberitahuku tidak ada yang bisa dilakukan. Ketika saya mencoba untuk berkomitmen, itu jatuh di atas mengeluh tentang cepat-maju.
Jean Jordaan
1
@Mipadi Saya memiliki masalah yang sama dengan Jean dan, sementara saya tidak bisa mengatakan remote diatur dengan cara non-default yang Anda sebutkan saya dapat mengatakan menggunakan git fetch -ftelah memperbaiki masalah saya! Terima kasih!
cregox
1
Ini menggabungkan cabang jarak jauh xzymenjadi cabang lokal master, yang tidak tersirat oleh pertanyaan awal; "Bagaimana saya bisa menarik xyz cabang dari GitHub dan menggabungkannya menjadi xyz cabang di localhost saya?"
user5359531
301

Cukup lacak cabang jarak jauh Anda secara eksplisit dan sederhana git pullakan melakukan apa yang Anda inginkan:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Yang terakhir adalah operasi lokal.

Atau bahkan lebih cocok dengan dokumentasi GitHub tentang forking :

git branch -f new_local_branch_name upstream/remote_branch_name
innaM
sumber
39
Jika Anda mendapatkan 'Bukan nama objek yang valid:' origin / remote_branch_name ', lakukan' git fetch origin 'terlebih dahulu.
Martin Konicek
130

Anda bisa menarik cabang ke cabang dengan perintah berikut.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Ketika Anda berada di cabang master, Anda juga dapat terlebih dahulu checkout cabang seperti:

git checkout -b xyz

Ini menciptakan cabang baru, "xyz", dari master dan langsung memeriksanya.

Maka Anda melakukannya:

git pull origin xyz

Ini menarik cabang baru ke xyzcabang lokal Anda .

Robert Cabri
sumber
1
Sempurna! Saya hanya tidak tahu sintaksis itu: git pull {repo} {remotebranchname}: {localbranchname}. Pertanyaan, jika tarikan itu tidak berfungsi (mungkin seseorang memperbarui cabang dan akan ada konflik gabungan) apa saja pilihan saya?
Costa
7
Saya downvoting ini karena mencoba untuk menggabungkan cabang jarak jauh ke cabang Anda saat ini (misalnya master). Ini bukan yang ingin dilakukan kebanyakan orang, dan bukan itu yang diminta OP. Jawaban oleh @mohit adalah pilihan yang tepat.
Phrogz
1
Phrogz - sepertinya perilaku ini berubah di Git versi terbaru. Saya menggunakan ini sebelumnya dan bekerja dengan sangat baik.
Pawan
88

Cara terbaik adalah:

git checkout -b <new_branch> <remote repo name>/<new_branch>
mohit
sumber
1
Setelah membuat cabang "dev" baru di github, dan mencoba yang di atas, saya mendapat pesan galat berikut: "fatal: origin / dev bukan komit dan cabang 'dev' tidak dapat dibuat darinya" Solution was to "git ambil "per solusi Bradley Flood di bawah, dan kemudian jalankan kembali jawaban mohit.
TomEberhard
46

git fetch akan mengambil daftar cabang terbaru.

Sekarang kamu bisa git checkout MyNewBranch

Selesai :)


Untuk info lebih lanjut lihat dokumen: git fetch

Bradley Flood
sumber
37

Saya tidak yakin saya sepenuhnya memahami masalahnya, tetapi menarik cabang yang ada dilakukan seperti ini (setidaknya itu bekerja untuk saya :)

git pull origin BRANCH

Ini dengan asumsi bahwa cabang lokal Anda dibuat dari asal / CABANG.

Alex N.
sumber
15

Ini membantu saya untuk mendapatkan cabang jauh sebelum menggabungkannya ke yang lain:

git fetch repo xyz:xyz
git checkout xyz
techtonik anatoly
sumber
8

Sederhananya, Jika Anda ingin menarik dari GitHub cabang the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want
Adrien Renaud
sumber
3
git pull <gitreponame> <branchname>

Biasanya jika Anda hanya memiliki repo yang ditugaskan untuk kode Anda maka gitreponame akan menjadi asal.

Jika Anda bekerja pada dua repo seperti satu adalah lokal dan satu lagi untuk remote seperti Anda dapat memeriksa daftar repo dari git remote -v . ini menunjukkan berapa banyak repo yang ditugaskan ke kode Anda saat ini.

BranchName harus ada ke dalam gitreponame yang sesuai.

Anda dapat menggunakan dua perintah berikut untuk menambah atau menghapus repo

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
prathap
sumber
2

Anda juga dapat melakukannya

git pull -r origin master

memperbaiki konflik gabungan jika ada

git rebase --continue

-r adalah untuk rebase. Ini akan membuat struktur cabang Anda

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

untuk

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Ini akan mengarah pada riwayat bersih. Catatan: Jika Anda telah mendorong cabang lain ke asal (atau remote lainnya), Anda mungkin harus mendorong cabang Anda setelah rebase.

git push -f origin other-branch
PKV
sumber
1

aku melakukannya

git branch -f new_local_branch_name origin/remote_branch_name

Dari pada

git branch -f new_local_branch_name upstream/remote_branch_name

Seperti yang disarankan oleh @innaM. Ketika saya menggunakan versi upstream, katanya 'fatal: Bukan nama objek yang valid:' upstream / remote_branch_name ''. Saya tidak melakukan git fetch originseperti yang disarankan komentar, tetapi hanya diganti upstreamdengan origin. Saya kira mereka setara.

Vicky
sumber
0

untuk menarik cabang dari GitHub dapat Anda gunakan

git checkout --track origin/the-branch-name

Pastikan bahwa nama cabang persis sama.

Kode Fradely
sumber