Menyinkronkan repositori Git lokal dengan repositori jarak jauh

297

Saya ingin menyinkronkan repositori lokal saya dengan repositori jarak jauh sehingga repositori lokal saya menjadi 100% salinan repositori jarak jauh - artinya jika file tertentu berbeda dalam repositori ini, kami menimpa repositori lokal dengan repositori jarak jauh, dan jika ada file dalam repositori lokal yang tidak ada di remote, file lokal bisa dihapus.

Apakah ada cara untuk mencapai itu selain dengan melakukan klon baru repositori jarak jauh?

Pertanyaan serupa sebagai Sinkronisasi git repo lokal dengan remote dalam satu kesempatan yang membuang perubahan / commit lokal .

Axl
sumber
4
Selalu ketika saya datang ke sini, saya mencari Menyinkronkan garpu
Martin Thoma
1
git fetch --prune
hassanzadeh.sd

Jawaban:

342
git fetch --prune

-p, --prune
Setelah mengambil, hapus cabang pelacakan jarak jauh yang tidak lagi ada di remote. opsi prune

jobwat
sumber
6
Itu yang saya cari! PS Lain kali saya akan membaca halaman manual lebih hati-hati sebelum menggali stackoverflow :-)
Sergiy Sokolenko
5
Ya, git pull -papakah hal yang sama - 'git pull menjalankan git mengambil dengan parameter yang diberikan dan memanggil git menggabungkan untuk menggabungkan kepala cabang yang diambil ke cabang saat ini' - git-scm.com/docs/git-pull
jobwat
2
Gunakan git fetch <remote> --prune, jika seseorang hanya perlu --pruneremote tertentu. misalnya. git fetch upstream --prune.
Fery Wardiyanto
git fetch origin --pruneuntuk menyinkronkan repo lokal Anda dengan garpu upstreamproyek Anda
Stuart Cardall
2
@SergiySokolenko itulah yang kita semua katakan, tetapi jauh di lubuk hati kita tahu SO menjadi lebih nyaman dengan halaman manual :-P
Marcello Romani
144

Langkah-langkah ini akan melakukannya:

git reset --hard HEAD
git clean -f -x -d -n

lalu tanpa -n

Ini akan menangani semua perubahan lokal. Sekarang komit ...

git status

dan perhatikan baris seperti:

Your branch is ahead of 'xxxx' by N commits.

Catat angka 'N' sekarang:

git reset --hard HEAD~N
git pull

dan akhirnya:

git status

seharusnya tidak menunjukkan apa pun untuk ditambahkan / dikomit. Semua bersih.

Namun, klon baru dapat melakukan hal yang sama (tetapi jauh lebih lambat).

=== Diperbarui ===

Saat pengetahuan git saya sedikit meningkat dari waktu ke waktu, saya telah menemukan cara lain yang lebih sederhana untuk melakukan hal yang sama. Begini caranya (#dengan penjelasan). Saat berada di cabang kerja Anda:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

Meskipun komit dan perubahan lokal Anda akan menghilang dari pandangan setelah ini, dimungkinkan untuk memulihkan perubahan yang dilakukan, jika perlu.

FractalSpace
sumber
1
terima kasih banyak untuk pembaruan bekerja dengan baik dengan github dan bitbucket :)
CommonSenseCode
jawaban ini telah menjadi solusi paling andal di sini untuk saya.
AlanH
95

Anda perlu memahami bahwa repositori Git bukan hanya pohon direktori dan file, tetapi juga menyimpan sejarah pohon-pohon tersebut - yang mungkin berisi cabang dan gabungan.

Saat mengambil dari repositori, Anda akan menyalin semua atau beberapa cabang di sana ke repositori Anda. Ini kemudian di repositori Anda sebagai "cabang pelacakan jarak jauh", misalnya cabang bernama like remotes/origin/masteratau semacamnya.

Mengambil komit baru dari repositori jarak jauh tidak akan mengubah apa pun tentang copy pekerjaan lokal Anda.

Salinan kerja Anda biasanya memiliki komit yang diperiksa, dipanggil HEAD. Komit ini biasanya merupakan ujung dari salah satu cabang lokal Anda.

Saya pikir Anda ingin memperbarui cabang lokal Anda (atau mungkin semua cabang lokal?) Ke cabang jarak jauh yang sesuai, dan kemudian memeriksa cabang terbaru.

Untuk menghindari konflik dengan copy pekerjaan Anda (yang mungkin memiliki perubahan lokal), Anda terlebih dahulu membersihkan segala sesuatu yang tidak versi (menggunakan git clean). Kemudian Anda memeriksa cabang lokal yang sesuai dengan cabang jarak jauh yang ingin Anda perbarui, dan gunakan git resetuntuk beralih ke cabang jarak jauh yang diambil. ( git pullakan memasukkan semua pembaruan cabang jarak jauh di cabang lokal Anda, yang mungkin melakukan hal yang sama, atau membuat komit gabungan jika Anda memiliki komit lokal.)

(Tapi kemudian Anda benar-benar akan kehilangan perubahan lokal - baik dalam copy pekerjaan dan komit lokal. Pastikan Anda benar-benar menginginkan ini - jika tidak lebih baik gunakan cabang baru, ini menyimpan komit lokal Anda. Dan gunakan git stashuntuk menyimpan perubahan yang belum dilakukan. .)


Sunting: Jika Anda hanya memiliki satu cabang lokal dan melacak satu cabang jarak jauh, yang perlu Anda lakukan adalah

git pull

dari dalam direktori kerja.

Ini akan mengambil versi saat ini dari semua cabang jarak jauh yang dilacak dan memperbarui cabang saat ini (dan direktori kerja) ke versi saat ini dari cabang jarak jauh yang dilacaknya.

Paŭlo Ebermann
sumber
Jika saya mengubah TIDAK ADA di repositori lokal saya, hanya a.) Ingin memiliki salinan semuanya dari jarak jauh, dan b.) Ingin menampilkan kemungkinan perbedaan di antara versi. Jadi saya TIDAK berkomitmen, tidak mengubah apa pun = tidak ada pembaruan / perubahan lokal. Perintah apa yang harus saya gunakan secara berkala (misalnya setiap minggu atau lebih) untuk mencapai dua fungsi di atas? Tolong, jawab KISS (Keep It Simple Stupid) - saya juga git noob, dan ofc akan RTFM - tapi untuk awalnya butuh bantuan. ;)
kobame
Dalam kasus sederhana Anda, git pullseharusnya sudah cukup, saya pikir. (Saya memperbarui jawabannya.)
Paŭlo Ebermann
bagaimana jika saya memiliki beberapa perubahan lokal yang tidak ingin saya komit. Sekarang ketika saya melakukan tarikan itu mengatakan saya untuk melakukan atau menyembunyikan mereka. Jadi dalam hal ini bagaimana saya bisa memberitahu git untuk menimpanya dan melakukan tarikan?
Harshana
89

Anda ingin melakukannya

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

Ini membuat repo lokal Anda persis seperti repo jarak jauh Anda.

Ingatlah untuk mengganti asal dan master dengan remote dan cabang yang ingin Anda sinkronkan.

aanda
sumber
2
itu juga menghapus semua direktori dari npm install dan bower install, tidak disarankan kecuali Anda ingin menginstal ulang semua dependensi yang ada di .gitignore
chwagssd
Itu tidak menghapus saya node_modules, itu berfungsi persis seperti yang saya inginkan.
Vahid Amiri
PERINGATAN: Ini menghapus file yang tidak terlacak
Amit Yadav
Saya kehilangan semua data saya menggunakan kode ini, saya mencoba menyinkronkan repositori lokal saya dengan repositori git. Tetapi itu membuat repositori global saya bersinkronisasi dengan repositori lokal saya.
Zahid Khan
10

Atur ulang dan sinkronkan repositori lokal dengan cabang jarak jauh

Perintah: Ingatlah untuk mengganti asal dan master dengan remote dan cabang yang ingin Anda sinkronkan.

git fetch origin && git reset --hard origin/master && git clean -f -d

Atau langkah demi langkah:

git fetch origin
git reset --hard origin/master
git clean -f -d

Cabang lokal Anda sekarang adalah salinan persis (melakukan dan semua) dari cabang jarak jauh.

Output perintah:

Berikut adalah contoh menjalankan perintah pada klon lokal dari Forge a git repository.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$
Mahendra Pratap
sumber
4

(Info ini dari Manual Pengguna Git )

Saya juga belajar, jadi ini mungkin bukan jawaban yang tepat untuk pertanyaan itu tetapi mungkin membantu seseorang:

  1. Ketika repositori jarak jauh awalnya salinan dari semua cabang disimpan di repositori lokal Anda (lihat dengan git branch -r)
  2. Untuk memperbarui salinan ini dan menjadikannya terkini (mis. Menyelaraskannya dengan cabang jarak jauh) gunakan git fetch. Ini tidak akan memengaruhi Anda yang ada, cabang yang dibuat khusus.
  3. Untuk mengganti cabang lokal Anda checkout versi baru dari cabang apa pun yang sedang Anda kerjakan (Dengan anggapan bahwa Anda telah mengeksekusi git add origin /path/to/repository) gunakan git checkout origin/branch_name, ini akan menimpa perubahan penduduk lokal Anda pada cabangbranch_name
tjb
sumber
3

Kedengarannya seperti Anda ingin mirror dari repositori jarak jauh:

git clone --mirror url://to/remote.git local.git

Perintah itu menciptakan repositori kosong. Jika Anda tidak ingin repositori kosong, segalanya menjadi lebih rumit.

Richard Hansen
sumber
3

Jika Anda berbicara tentang menyinkronkan repo bercabang maka Anda dapat mengikuti langkah-langkah ini.

Cara menyinkronkan repositori garpu dari git

  1. periksa cabang git Anda saat ini

    git branch

  2. checkout untuk menguasai jika Anda tidak menguasai

    git checkout master

  3. Ambil repositori hulu jika Anda memiliki hak akses yang benar

    git fetch upstream

  4. Jika Anda mendapatkan kesalahan di bawah ini maka jalankan

    git remote add upstream [email protected]:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. Sekarang jalankan perintah di bawah ini.

    git fetch upstream

  6. Sekarang jika Anda berada di master lalu gabungkan upstream / master ke cabang master

    git merge upstream/master

    Itu dia!!

    Periksa kembali melalui git remoteperintah, lebih spesifikgit remote -v

    Jika saya juga memiliki hak komitmen untuk repo hulu, saya dapat membuat cabang hulu lokal dan melakukan pekerjaan yang akan hulu di sana.

Nishant Upadhyay
sumber
Mengapa saya harus melakukan 5.git mengambil upstream ketika saya sudah mendapatkan kesalahan di dalamnya pada langkah ketiga?
Md Sifatul Islam
-2

Anda dapat menggunakan kait git untuk itu. Cukup buat kait yang mendorong diubah ke repo lain setelah pembaruan.

Tentu saja Anda mungkin mendapatkan konflik penggabungan sehingga Anda harus mencari cara untuk mengatasinya.

Makis
sumber