Masalah Dasar
Saya baru saja menghapus SEMUA kode dari sebuah file di proyek saya dan melakukan perubahan ke git lokal saya (sengaja). aku melakukannya
git pull upstream master
untuk mengambil dan menggabungkan dari upstream (sehingga secara teori kode yang dihapus harus kembali).
Git memberi tahu saya bahwa semuanya mutakhir.
Semuanya pasti TIDAK mutakhir - semua kode yang dihapus itu masih dihapus.
Info Relevan Lainnya
Saya hanya memiliki satu cabang yang disebut "master".
Saya baru-baru ini menyiapkan "master" untuk melacak upstream seperti ini:
Master cabang disiapkan untuk melacak master cabang jarak jauh dari hulu.
Perintah tersebut git branch -vv
menghasilkan:
* master 7cfcb29 [upstream/master: ahead 9] deletion test
Mengapa mengapa mengapa ini terjadi? Saya hampir saja mengirim email ke manajer proyek saya setiap perubahan yang saya buat pada kode kami.
Memperbarui
Saya pikir itu sudah jelas, tetapi bagaimanapun ini adalah tujuan saya:
Dapatkan kode terbaru di sistem saya.
Maafkan amarah saya di sini, tetapi mengapa tugas sesederhana itu harus begitu sulit?
Jawaban:
Saya pikir masalah dasar Anda di sini adalah bahwa Anda salah menafsirkan dan / atau salah memahami apa yang dilakukan git dan mengapa git melakukannya.
Saat Anda mengkloning beberapa repositori lain, git membuat salinan apa pun yang ada "di sana". Ia juga mengambil label cabang "mereka", seperti
master
, dan membuat salinan dari label itu yang "nama lengkapnya" di pohon git Anda adalah (biasanya)remotes/origin/master
(tetapi dalam kasus Anda,remotes/upstream/master
). Seringkali Anda juga bisa menghilangkanremotes/
bagian tersebut, jadi Anda bisa merujuk ke salinan aslinya sebagaiupstream/master
.Jika sekarang Anda membuat dan melakukan beberapa perubahan ke beberapa file, Anda adalah satu-satunya yang memiliki perubahan tersebut. Sementara itu, orang lain dapat menggunakan repositori asli (tempat Anda membuat klon) untuk membuat klon lain dan mengubah klon tersebut. Mereka adalah satu-satunya yang memiliki perubahan, tentunya. Namun pada akhirnya, seseorang mungkin memiliki perubahan yang mereka kirim kembali ke pemilik aslinya (melalui "push" atau tambalan atau apa pun).
The
git pull
perintah kebanyakan hanya singkatan untukgit fetch
diikuti olehgit merge
. Ini penting karena artinya Anda perlu memahami apa yang sebenarnya dilakukan oleh kedua operasi tersebut.The
git fetch
perintah mengatakan untuk kembali ke mana pun Anda kloning dari (atau telah ditetapkan sebagai tempat untuk mengambil dari) dan menemukan "baru barang-barang orang lain ditambahkan atau diubah atau dihapus". Perubahan tersebut disalin dan diterapkan ke salinan Anda dari apa yang Anda dapatkan dari mereka sebelumnya . Mereka tidak diterapkan pada pekerjaan Anda sendiri, hanya pada pekerjaan mereka.The
git merge
perintah lebih rumit dan adalah di mana Anda akan kacau. Apa yang dilakukannya, sedikit disederhanakan, adalah membandingkan "apa yang Anda ubah dalam salinan Anda" dengan "perubahan yang Anda ambil dari orang lain dan dengan demikian ditambahkan ke salinan-karya-karya-orang lain". Jika perubahan Anda dan perubahannya tidak menimbulkan konflik,merge
operasi menggabungkannya dan memberi Anda "komit gabungan" yang mengikat pengembangan Anda dan perkembangannya bersama-sama (meskipun ada kasus "mudah" yang sangat umum di mana Anda tidak memiliki berubah dan Anda mendapatkan "maju cepat").Situasi yang Anda hadapi sekarang adalah situasi di mana Anda telah membuat perubahan dan melakukannya — sembilan kali, pada kenyataannya, karena itu "9 di depan" —dan mereka tidak membuat perubahan. Jadi, dengan
fetch
patuh tidak mengambil apa-apa, dan kemudianmerge
mengambil kekurangan-perubahan mereka dan juga tidak melakukan apa-apa.Yang Anda inginkan adalah melihat, atau mungkin bahkan "menyetel ulang" ke, versi kode "mereka".
Jika Anda hanya ingin melihatnya, Anda dapat melihat versi itu:
Itu memberitahu git bahwa Anda ingin memindahkan direktori saat ini ke cabang yang nama lengkapnya sebenarnya
remotes/upstream/master
. Anda akan melihat kode mereka sejak terakhir kali Anda menjalankangit fetch
dan mendapatkan kode terbaru mereka.Jika Anda ingin mengabaikan semua perubahan Anda sendiri, yang perlu Anda lakukan adalah mengubah gagasan git tentang revisi label mana
master
, yang harus diberi nama. Saat ini, ini memberi nama komit terbaru Anda. Jika Anda kembali ke cabang itu:maka
git reset
perintah tersebut akan memungkinkan Anda untuk "memindahkan label", sebagaimana mestinya. Satu-satunya masalah yang tersisa (dengan asumsi Anda benar-benar siap untuk meninggalkan semua yang telah Anda lakukan) adalah menemukan di mana label harus menunjuk.git log
akan membiarkan Anda menemukan nama numerik — hal-hal seperti7cfcb29
—yang merupakan nama permanen (tidak pernah berubah), dan ada banyak cara lain untuk menamainya, tetapi dalam hal ini Anda hanya menginginkan namanyaupstream/master
.Untuk memindahkan label, memusnahkan perubahan Anda sendiri (apapun yang Anda telah berkomitmen sebenarnya dipulihkan untuk cukup lama tapi itu jauh lebih sulit setelah ini jadi sangat yakin):
Perintah itu
--hard
memberitahu git untuk menghapus apa yang telah Anda lakukan, memindahkan label cabang saat ini, dan kemudian memeriksa komit yang diberikan.Tidak terlalu umum untuk benar - benar ingin
git reset --hard
dan menghapus banyak pekerjaan. Metode yang lebih aman (membuatnya jauh lebih mudah untuk memulihkan pekerjaan itu jika Anda memutuskan beberapa di antaranya bermanfaat) adalah dengan mengganti nama cabang Anda yang ada:dan kemudian buat cabang lokal baru bernama
master
"trek" (Saya tidak terlalu suka istilah ini karena menurut saya ini membingungkan orang, tetapi itu istilah git :-)) master asal (atau upstream):yang kemudian dapat Anda lakukan sendiri:
Apa yang dilakukan tiga perintah terakhir (ada pintasan untuk menjadikannya hanya dua perintah) adalah mengubah nama yang ditempelkan pada label yang ada, lalu membuat label baru, lalu beralih ke label itu:
sebelum melakukan apapun:
setelah
git branch -m
:setelah
git branch -t master upstream/master
:Berikut
C0
adalah komit terbaru (pohon sumber lengkap) yang Anda dapatkan saat pertama kali melakukangit clone
. C1 hingga C9 adalah komitmen Anda.Perhatikan bahwa jika Anda menjadi
git checkout bunchofhacks
dan kemudiangit reset --hard HEAD^^
, ini akan mengubah gambar terakhir menjadi:Alasannya adalah
HEAD^^
menamai revisi dua dari kepala cabang saat ini (yang tepat sebelum reset akan dilakukanbunchofhacks
), danreset --hard
kemudian memindahkan label. Commits C8 dan C9 sekarang sebagian besar tidak terlihat (Anda dapat menggunakan hal-hal seperti reflog dangit fsck
menemukannya tetapi tidak lagi sepele). Label Anda adalah milik Anda untuk dipindahkan sesuka Anda. Thefetch
perintah mengurus orang-orang yang memulai denganremotes/
. Adalah konvensional untuk mencocokkan "milik Anda" dengan "milik mereka" (jadi jika mereka memilikiremotes/origin/mauve
Anda akan menamai Andamauve
juga), tetapi Anda dapat mengetikkan "milik mereka" kapan pun Anda ingin memberi nama / melihat komitmen yang Anda dapatkan "dari mereka". (Ingatlah bahwa "satu komit" adalah keseluruhan pohon sumber. Anda dapat memilih satu file tertentu dari satu komit, dengangit show
misalnya,sumber
git merge
perintah baris perintah (yang saya lakukan sendiri, ini metode yang masuk akal). Namun, perhatikan bahwa itugit pull
dimulai dengan menjalankannya terlebih dahulugit fetch
, kemudian menjalankannyagit merge
(ataugit rebase
jika Anda menyuruhnya untuk melakukannya). Ini adalah langkah pengambilan yang benar-benar membawa komitmen baru untuk digabungkan (atau hanya didasarkan pada basis).git status
, yang dapat saya gunakan untuk melihat apakah repo upstream berada di depan repo saya saat ini? Pesan yang saya dapatkan dengangit status
mengatakan "Cabang Anda up-to-date dengan 'origin / master'" membingungkan saya sehingga berpikir saya telah mendapatkan perubahan terbaru, padahal tidak. Kadang-kadang, saya mendapatkan pesan yang mengatakan sesuatu seperti "origin / master adalah 5 komit sebelum cabang Anda" (parafrase). Tapi itu tidak konsisten.git status
mengatakan "Cabang Anda up to date" ketika segeragit fetch
kemudian menarik lebih dari seratus objek dan menyelesaikan hampir seratus delta, menyebutkan beberapa cabang baru dan beberapa tag baru dan mengubah utama (jarak jauh tracking) branch head commit - lalu status git lainnya dengan riang, dan tidak jujur, masih menyatakan "Cabang Anda sudah diperbarui". Jelas banyak yang turun dari asalnya tapi cabangnya "up to date with origin" baik sebelum maupun sesudah?git pull
dijalankangit fetch
terlebih dahulu, lalugit merge
(atau perintah kedua pilihan Anda). Thegit fetch
langkah update Anda memori Git untuk mereka statusnya Git ini, dengan memanggil mereka Git dan mendapatkan sesuatu yang baru dari mereka. Andagit status
hanya memeriksa memori Git Anda tentang Git mereka.Saya memiliki masalah yang sama dengan Anda.
Ya
git status
git fetch
git pull
, tapi cabang saya masih tertinggal. Saya memiliki folder dan file yang didorong ke jarak jauh dan saya melihat file di web, tetapi di lokal saya mereka hilang.Akhirnya, perintah ini memperbarui semua file dan folder di lokal saya:
atau jika Anda menginginkan cabang
sumber
Setiap perubahan yang Anda lakukan, seperti menghapus semua file proyek Anda, akan tetap ada setelah penarikan. Semua yang dilakukan oleh penarikan adalah menggabungkan perubahan terbaru dari tempat lain ke dalam cabang Anda sendiri, dan jika cabang Anda telah menghapus semuanya, maka paling baik Anda akan mendapatkan konflik penggabungan ketika perubahan upstream memengaruhi file yang telah Anda hapus. Jadi, singkatnya, ya semuanya sudah up to date.
Jika Anda mendeskripsikan hasil yang Anda inginkan daripada "semua file dihapus", mungkin seseorang dapat menyarankan tindakan yang sesuai.
Memperbarui:
Apa yang tampaknya tidak Anda pahami adalah bahwa Anda sudah memiliki kode terbaru, yang menjadi milik Anda. Jika Anda benar-benar ingin melihat karya terbaru orang lain yang ada di cabang master, lakukan saja:
Perhatikan bahwa ini tidak akan membuat Anda berada dalam posisi untuk segera (kembali) memulai pekerjaan Anda sendiri. Jika Anda perlu mengetahui cara membatalkan sesuatu yang telah Anda lakukan atau mengembalikan perubahan yang Anda atau orang lain buat, berikan detailnya. Juga, pertimbangkan untuk membaca tentang untuk apa kontrol versi itu, karena Anda tampaknya salah memahami tujuan dasarnya.
sumber
upstream/master
. Memperbarui jawaban saya.Seperti yang dikatakan poster lain, tarik menggabungkan perubahan dari hulu ke repositori Anda. Jika Anda ingin mengganti apa yang ada di repositori Anda dengan yang ada di hulu, Anda memiliki beberapa opsi. Langsung saja, saya akan pergi dengan
sumber
Jawaban teratas jauh lebih baik dalam hal luas dan kedalaman informasi yang diberikan, tetapi sepertinya jika Anda ingin masalah Anda segera diperbaiki, dan tidak keberatan menginjak beberapa prinsip dasar kontrol versi, Anda dapat ...
Beralih ke master
Hapus cabang yang tidak Anda inginkan. (Catatan: harus memiliki -D, bukan flag -d normal karena cabang Anda memiliki banyak komit sebelum master.)
Buat cabang baru
sumber
Meskipun tidak ada dari jawaban ini yang berhasil untuk saya, saya dapat memperbaiki masalah tersebut menggunakan perintah berikut.
git fetch origin
Ini menipu saya.
sumber
Hanya pengingat yang ramah jika Anda memiliki file secara lokal yang tidak ada di github namun Anda
git status
berkataItu bisa terjadi jika file ada di
.gitignore
Coba lari
dan melihat apakah file-file ini muncul di sana. Itu akan menjelaskan mengapa git tidak ingin memindahkannya ke remote.
sumber