Bagaimana cara memaksa file lokal ditimpa git pull
?
Skenarionya adalah sebagai berikut:
- Anggota tim memodifikasi templat untuk situs web yang sedang kami kerjakan
- Mereka menambahkan beberapa gambar ke direktori gambar (tetapi lupa menambahkannya di bawah kendali sumber)
- Mereka mengirim gambar melalui pos, nanti, ke saya
- Saya menambahkan gambar di bawah kontrol sumber dan mendorongnya ke GitHub bersama dengan perubahan lainnya
- Mereka tidak dapat menarik pembaruan dari GitHub karena Git tidak ingin menimpa file mereka.
Ini kesalahan yang saya dapatkan:
kesalahan: File pohon yang tidak dapat dilacak 'publik / images / icon.gif' akan ditimpa oleh gabungan
Bagaimana cara memaksa Git untuk menimpa mereka? Orang tersebut adalah seorang desainer - biasanya, saya menyelesaikan semua konflik dengan tangan, sehingga server memiliki versi terbaru yang hanya perlu mereka perbarui di komputer mereka.
git reset --hard origin/branch_to_overwrite
git branch <branch> -D
2. Reset ke komit sebelum konflik:git reset <commit> --hard
3. Buat ulang cabang:git branch <branch>
4. Atur pelacakan ke server:git --set-upstream-to=origin/<branch> <branch> 5. Pull:
git pull`git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .
Jawaban:
Penting: Jika Anda memiliki perubahan lokal, itu akan hilang. Dengan atau tanpa
--hard
opsi, komit lokal apa pun yang tidak didorong akan hilang. [*]Jika Anda memiliki file apa pun yang tidak dilacak oleh Git (misalnya konten pengguna yang diunggah), file-file ini tidak akan terpengaruh.
Saya pikir ini adalah cara yang benar:
Kemudian, Anda memiliki dua opsi:
ATAU Jika Anda berada di cabang lain:
Penjelasan:
git fetch
mengunduh yang terbaru dari jarak jauh tanpa mencoba menggabungkan atau mengubah apa pun.Kemudian
git reset
reset cabang master ke apa yang baru saja Anda ambil. The--hard
pilihan perubahan semua file dalam pohon kerja Anda untuk mencocokkan file dalamorigin/master
Pertahankan komitmen lokal saat ini
[*] : Perlu dicatat bahwa dimungkinkan untuk mempertahankan komit lokal saat ini dengan membuat cabang dari
master
sebelum mengatur ulang:Setelah ini, semua komitmen lama akan disimpan
new-branch-to-save-current-commits
.Perubahan tidak dikomit
Namun, perubahan yang tidak dikomit (bahkan dipentaskan), akan hilang. Pastikan untuk menyimpan dan melakukan apa pun yang Anda butuhkan. Untuk itu Anda dapat menjalankan yang berikut ini:
Dan kemudian menerapkan kembali perubahan yang tidak dikomit ini:
sumber
git reset --hard origin/branch-name
git pull -f
git reflog
, yang mencantumkan semua komit, juga yang tanpa basis. Sampai Anda membersihkan salinan lokal Anda menggunakangit gc
, maka semua hilangCoba ini:
Itu harus melakukan apa yang Anda inginkan.
sumber
PERINGATAN:
git clean
menghapus semua file / direktori Anda yang tidak dilacak dan tidak dapat diurungkan.Terkadang
clean -f
tidak membantu. Jika Anda memiliki DIRECTORIES yang tidak dilacak, opsi -d juga diperlukan:PERINGATAN:
git clean
menghapus semua file / direktori Anda yang tidak dilacak dan tidak dapat diurungkan.Pertimbangkan untuk menggunakan
-n
(--dry-run
) flag terlebih dahulu. Ini akan menunjukkan kepada Anda apa yang akan dihapus tanpa benar-benar menghapus apa pun:Contoh output:
sumber
.gitignore
git clean -dfx
. The-x
abaikan Gitignore. Biasanya produk build Anda akan berada di .gitignore.Seperti Landak, saya pikir jawabannya mengerikan. Tetapi meskipun jawaban Hedgehog mungkin lebih baik, saya tidak berpikir itu seanggun mungkin. Cara saya menemukan untuk melakukan ini adalah dengan menggunakan "ambil" dan "bergabung" dengan strategi yang ditentukan. Yang seharusnya membuatnya agar perubahan lokal Anda dipertahankan selama mereka bukan salah satu file yang Anda coba paksa timpa.
Pertama, lakukan komitmen terhadap perubahan Anda
Kemudian ambil perubahan dan timpa jika ada konflik
"-X" adalah nama opsi, dan "milik mereka" adalah nilai untuk opsi itu. Anda memilih untuk menggunakan perubahan "mereka", alih-alih perubahan "Anda" jika ada konflik.
sumber
get fetch other-repo
; 2)git merge -s recursive -X theirs other-repo/master
git merge -X theirs origin/master
Alih-alih melakukan:
Saya menyarankan melakukan hal berikut:
Tidak perlu mengambil semua remote dan cabang jika Anda akan mengatur ulang ke cabang asal / master bukan?
sumber
git add .
terlebih dahulu, sebelumgit reset --hard
Sepertinya cara terbaik adalah pertama-tama melakukannya:
Untuk menghapus semua file yang tidak dilacak dan kemudian melanjutkan dengan
git pull
...sumber
git fetch origin && git reset --hard origin/master
git clean
jawaban terbaik di sini? Sepertinya menghapus file belum tentu seperti yang diinginkan OP. Mereka meminta 'timpa file lokal' bukan penghapusan.Peringatan, melakukan ini akan menghapus file Anda secara permanen jika Anda memiliki entri direktori / * di file gitignore Anda.
Beberapa jawaban tampaknya mengerikan. Mengerikan dalam arti apa yang terjadi pada @Lauri dengan mengikuti saran David Avsajanishvili.
Sebaliknya (git> v1.7.6):
Nanti Anda bisa membersihkan simpanan sejarah.
Secara manual, satu per satu:
Secara brutal, sekaligus:
Tentu saja jika Anda ingin kembali ke apa yang Anda sembunyikan:
sumber
--include-untracked
hanya dengan sementaragit add
-ing seluruh repo Anda, kemudian segera menyimpannya.git stash apply
mengembalikan semua file saya yang tidak terlacak dengan pengecualian (yang benar) dari yang telah dibuat gabungan: "sudah ada, tidak perlu checkout." Bekerja dengan sempurna.git stash -u
.Anda mungkin menemukan perintah ini berguna untuk membuang perubahan lokal:
Dan kemudian lakukan pembersihan (menghapus file yang tidak terlacak dari pohon yang berfungsi):
Jika Anda ingin menghapus direktori yang tidak dilacak selain file yang tidak dilacak:
sumber
Alih-alih bergabung dengan
git pull
, coba ini:git fetch --all
diikuti oleh:
git reset --hard origin/master
.sumber
Satu-satunya hal yang berhasil bagi saya adalah:
Ini akan membawa Anda kembali lima komit dan kemudian dengan
Saya menemukan bahwa dengan mencari cara membatalkan penggabungan Git .
sumber
work around
tetapi sangat efektif. Karena beberapa konflik dapat terjadi hanya dalam beberapa komit maka mengembalikan 5 komit akan memastikan tidak ada konflik dengan kode jarak jauh.Masalah dengan semua solusi ini adalah bahwa semuanya terlalu kompleks, atau, masalah yang lebih besar, adalah mereka menghapus semua file yang tidak terlacak dari server web, yang tidak kita inginkan karena selalu ada file konfigurasi yang diperlukan yang ada di server dan bukan di repositori Git.
Berikut adalah solusi terbersih yang kami gunakan:
Perintah pertama mengambil data terbaru.
Perintah kedua memeriksa apakah ada file yang sedang ditambahkan ke repositori dan menghapus file-file yang tidak dilacak dari repositori lokal yang akan menyebabkan konflik.
Perintah ketiga memeriksa semua file yang dimodifikasi secara lokal.
Akhirnya kami melakukan pembaruan untuk memperbarui ke versi terbaru, tetapi kali ini tanpa konflik, karena file yang tidak terlacak dalam repo tidak ada lagi dan semua file yang dimodifikasi secara lokal sudah sama seperti di repositori.
sumber
git merge origin/master
akan lebih cepat dan mungkin bahkan lebih aman. Karena jika seseorang mendorong perubahan baru selama penghapusan file skrip ini (yang tidak mungkin terjadi, tetapi mungkin), seluruh tarikan dapat gagal. Satu-satunya alasan saya menempatkanpull
di sana adalah karena seseorang mungkin tidak bekerja pada cabang master, tetapi beberapa cabang lainnya dan saya ingin skripnya menjadi universal..gitignore
.Pertama-tama, coba cara standar:
Peringatan : Perintah di atas dapat menyebabkan hilangnya data / file hanya jika Anda tidak membuatnya! Jika Anda tidak yakin, buat cadangan terlebih dahulu dari seluruh folder repositori Anda.
Lalu tarik lagi.
Jika di atas tidak akan membantu dan Anda tidak peduli dengan file / direktori yang tidak dilacak (buat cadangan terlebih dahulu untuk berjaga-jaga), coba langkah-langkah sederhana berikut:
Ini akan MENGHAPUS semua file git (pengecualian
.git/
dir, di mana Anda memiliki semua komit) dan tarik lagi.Mengapa
git reset HEAD --hard
bisa gagal dalam beberapa kasus?Aturan khusus di
.gitattributes file
Memiliki
eol=lf
aturan dalam .gitattributes dapat menyebabkan git untuk memodifikasi beberapa perubahan file dengan mengubah CRLF akhir baris menjadi LF di beberapa file teks.Jika demikian, Anda harus melakukan perubahan CRLF / LF ini (dengan memeriksanya di
git status
), atau mencoba:git config core.autcrlf false
untuk mengabaikannya sementara.Ketidakmampuan sistem file
Ketika Anda menggunakan sistem file yang tidak mendukung atribut izin. Sebagai contoh, Anda memiliki dua repositori, satu di Linux / Mac (
ext3
/hfs+
) dan satu lagi di sistem file berbasis FAT32 / NTFS.Seperti yang Anda perhatikan, ada dua jenis sistem file, jadi yang tidak mendukung izin Unix pada dasarnya tidak dapat mengatur ulang izin file pada sistem yang tidak mendukung izin semacam itu, jadi tidak masalah bagaimana
--hard
Anda mencoba, git selalu deteksi beberapa "perubahan".sumber
Saya memiliki masalah yang sama. Tidak ada yang memberi saya solusi ini, tetapi itu berhasil untuk saya.
Saya menyelesaikannya dengan:
.git
direktori saja.git reset --hard HEAD
git pull
git push
Sekarang berhasil.
sumber
Bonus:
Dalam berbicara tentang menarik / mengambil / menggabungkan jawaban sebelumnya, saya ingin berbagi trik yang menarik dan produktif,
git pull --rebase
Perintah di atas adalah perintah yang paling berguna dalam hidup Git saya yang menghemat banyak waktu.
Sebelum mendorong komit baru Anda ke server, coba perintah ini dan itu akan secara otomatis menyinkronkan perubahan server terbaru (dengan mengambil + gabungan) dan akan menempatkan komit Anda di bagian atas dalam log Git. Tidak perlu khawatir tentang tarikan / penggabungan manual.
Temukan detail di Apa yang "git pull --rebase" lakukan? .
sumber
git pull -r
.Saya punya masalah serupa. Saya harus melakukan ini:
sumber
git clean
dengan hatiSaya merangkum jawaban lain. Anda dapat mengeksekusi
git pull
tanpa kesalahan:Peringatan : Skrip ini sangat kuat, sehingga Anda bisa kehilangan perubahan.
sumber
git reset --hard HEAD
mungkin berlebihan; halaman manual lokal saya (2.6.3) mengatakan bahwareset
pada baris keduagit reset --hard origin/master
"default ke HEAD dalam segala bentuk."Berdasarkan pengalaman saya yang serupa, solusi yang ditawarkan oleh Strahinja Kustudic di atas sejauh ini adalah yang terbaik. Seperti yang telah ditunjukkan orang lain, cukup melakukan hard reset akan menghapus semua file yang tidak terlacak yang dapat mencakup banyak hal yang tidak ingin Anda hapus, seperti file konfigurasi. Yang lebih aman, adalah menghapus hanya file yang akan ditambahkan, dan dalam hal ini, Anda mungkin juga ingin checkout file yang dimodifikasi secara lokal yang akan diperbarui.
Itu dalam pikiran, saya memperbarui skrip Kustudic untuk melakukan hal itu. Saya juga memperbaiki kesalahan ketik (yang hilang 'di aslinya).
sumber
Saya percaya ada dua kemungkinan penyebab konflik, yang harus diselesaikan secara terpisah, dan sejauh yang saya bisa katakan, tidak satu pun jawaban di atas yang membahas keduanya:
File lokal yang tidak terlacak perlu dihapus, baik secara manual (lebih aman) atau seperti yang disarankan dalam jawaban lain, oleh
git clean -f -d
Komit lokal yang tidak ada di cabang jarak jauh perlu dihapus juga. IMO cara termudah untuk mencapai ini adalah dengan:
git reset --hard origin/master
(ganti 'master' dengan cabang apa pun yang sedang Anda kerjakan, dan jalankan yanggit fetch origin
pertama)sumber
Cara yang lebih mudah adalah:
Ini akan menimpa file lokal Anda dengan file pada git
sumber
Sepertinya sebagian besar jawaban di sini difokuskan pada
master
cabang; Namun, ada saat-saat ketika saya mengerjakan cabang fitur yang sama di dua tempat berbeda dan saya ingin rebase di salah satu tercermin di yang lain tanpa banyak melompat melalui lingkaran.Berdasarkan kombinasi jawaban RNA dan jawaban torek untuk pertanyaan serupa , saya telah menemukan ini yang bekerja sangat baik:
Jalankan ini dari cabang dan itu hanya akan mereset cabang lokal Anda ke versi hulu.
Ini juga dapat dimasukkan ke alias git (
git forcepull
):git config alias.forcepull "!git fetch ; git reset --hard @{u}"
Atau, di
.gitconfig
file Anda :Nikmati!
sumber
Saya memiliki masalah yang sama dan untuk beberapa alasan, bahkan
git clean -f -d
tidak akan melakukannya. Inilah sebabnya: Untuk beberapa alasan, jika file Anda diabaikan oleh Git (melalui entri .gitignore, saya berasumsi), itu masih mengganggu tentang menimpa ini dengan tarikan yang kemudian , tetapi clean tidak akan menghapusnya, kecuali jika Anda menambahkan-x
.sumber
Saya tahu metode yang jauh lebih mudah dan tidak menyakitkan:
Itu dia!
sumber
Saya baru saja menyelesaikan ini sendiri dengan:
di mana perintah terakhir memberikan daftar apa perubahan lokal Anda. Terus memodifikasi cabang "tmp" sampai diterima dan kemudian bergabung kembali ke master dengan:
Untuk waktu berikutnya, Anda mungkin dapat menangani ini dengan cara yang lebih bersih dengan mencari "git stash branch" meskipun simpanan kemungkinan akan menyebabkan Anda bermasalah pada beberapa percobaan pertama, jadi lakukan percobaan pertama pada proyek yang tidak penting ...
sumber
Saya memiliki situasi aneh yang tidak berhasil
git clean
atau tidakgit reset
. Saya harus menghapus file yang bertentangangit index
dengan menggunakan skrip berikut pada setiap file yang tidak dilacak:Maka saya bisa menarik dengan baik.
sumber
git fetch --all && git reset --hard origin/master && git pull
sumber
Terlepas dari pertanyaan awal, jawaban teratas dapat menyebabkan masalah bagi orang yang memiliki masalah serupa, tetapi tidak ingin kehilangan file lokal mereka. Misalnya, lihat komentar Al-Punk dan crizCraig.
Versi berikut melakukan perubahan lokal Anda ke cabang sementara (
tmp
), memeriksa cabang asli (yang saya asumsikanmaster
) dan menggabungkan pembaruan. Anda dapat melakukan ini denganstash
, tetapi saya telah menemukan itu biasanya lebih mudah untuk hanya menggunakan pendekatan cabang / gabungan.di mana kami menganggap repositori lainnya adalah
origin master
.sumber
Keempat perintah ini bekerja untuk saya.
Untuk memeriksa / menarik setelah menjalankan perintah ini
Saya mencoba banyak tetapi akhirnya berhasil dengan perintah ini.
sumber
Kerjakan saja
Jadi Anda menghindari semua efek samping yang tidak diinginkan, seperti menghapus file atau direktori yang ingin Anda simpan, dll.
sumber
Setel ulang indeks dan kepala ke
origin/master
, tetapi jangan mengatur ulang pohon kerja:sumber
Persyaratan:
Larutan:
Ambil dengan bersih dari file dan direktori mengabaikan Gitignore dan hard reset ke asal .
sumber