Di cabang saya, saya punya beberapa file di .gitignore
Pada cabang yang berbeda file-file itu bukan.
Saya ingin menggabungkan cabang yang berbeda menjadi milik saya, dan saya tidak peduli jika file-file itu tidak lagi diabaikan atau tidak.
Sayangnya saya mendapatkan ini:
File pohon kerja yang tidak terlacak berikut ini akan ditimpa oleh gabungan
Bagaimana saya memodifikasi perintah tarikan saya untuk menimpa file-file itu, tanpa saya harus menemukan, memindahkan atau menghapus file-file itu sendiri?
Jawaban:
Masalahnya adalah Anda tidak melacak file secara lokal tetapi file yang identik dilacak dari jarak jauh sehingga untuk "menarik" sistem Anda akan dipaksa untuk menimpa file lokal yang tidak dikontrol versi.
Coba jalankan
Ini akan melacak semua file, menghapus semua perubahan lokal Anda ke file-file itu, dan kemudian mendapatkan file dari server.
sumber
git add -A .; git stash
bekerja untukku. Thegit add *
varian mengeluhkan jalur diabaikan.Anda dapat mencoba perintah untuk menghapus file yang tidak terlacak dari lokal
Git 2.11 dan versi yang lebih baru:
Git versi lama:
Di mana
-d
bisa diganti dengan yang berikut ini:-x
file yang diabaikan juga dihapus serta file yang tidak diketahui oleh Git.-d
hapus direktori yang tidak dilacak selain file yang tidak dilacak.-f
diperlukan untuk memaksanya berjalan.Berikut ini tautan yang dapat membantu juga.
sumber
-i
untuk mode interaktif. Selain menghapus direktori yang tidak diinginkan, saya juga baru saja menghapus pengaturan pengguna saya untuk proyek :-(-x
bisa menyakitkan.Satu-satunya perintah yang bekerja untuk saya adalah:
sumber
Pengganti untuk
git merge
itu akan menimpa file yang tidak dilacakKomentar di bawah ini menggunakan 'FOI' untuk 'file yang menarik', file itu
Pengganti untuk
git pull
itu akan menimpa file yang tidak dilacakpull = fetch + merge
, jadi kita lakukangit fetch
dengangit checkout -f, git checkout, git merge
trik di atas.Penjelasan detail
git merge -f
tidak ada, tetapigit checkout -f
ada.Kami akan menggunakan
git checkout -f
+git checkout
untuk menghapus Files of Interest (lihat di atas), dan kemudian penggabungan Anda dapat berjalan secara normal.Langkah 1. Langkah ini secara paksa menggantikan FOI yang tidak terlacak dengan versi yang dilacak dari cabang donor (juga memeriksa cabang donor, dan memperbarui sisa dir kerja).
Langkah 2. Langkah ini menghilangkan FOI karena mereka dilacak di cabang kami saat ini (donor), dan tidak ada di
receiving-branch
kami beralih ke.Langkah 3. Sekarang setelah FOI tidak ada, penggabungan dalam cabang donor tidak akan menimpa file yang tidak terlacak, jadi kami tidak mendapatkan kesalahan.
sumber
Hapus semua file yang tidak dilacak:
sumber
Jika ini adalah operasi satu kali, Anda bisa menghapus semua file yang tidak terlacak dari direktori kerja sebelum melakukan tarikan. Baca Bagaimana cara menghapus file lokal (tidak terlacak) dari pohon kerja Git saat ini? untuk informasi tentang cara menghapus semua file yang tidak terlacak.
Pastikan untuk tidak secara tidak sengaja menghapus file yang tidak dilacak yang masih Anda butuhkan;)
sumber
Anda dapat mencoba perintah itu
sumber
Perbarui - versi yang lebih baik
Alat ini ( https://github.com/mklepaczewski/git-clean-before-merge ) akan:
git pull
padanannya,git pull
padanannya,git pull
versinya,--pretend
opsi yang tidak akan mengubah file apa pun.Versi lama
Bagaimana jawaban ini berbeda dari jawaban lainnya?
Metode yang disajikan di sini hanya menghapus file yang akan ditimpa oleh gabungan. Jika Anda memiliki file lain yang tidak terlacak (mungkin diabaikan) di direktori metode ini tidak akan menghapusnya.
Solusinya
Cuplikan ini akan mengekstrak semua file yang tidak terlacak yang akan ditimpa oleh
git pull
dan menghapusnya.dan kemudian lakukan saja:
Ini bukan perintah porselen git jadi selalu periksa kembali apa yang akan dilakukan dengan:
Penjelasan - karena satu kalimat menakutkan:
Berikut ini rincian dari fungsinya:
git pull 2>&1
- Tangkapgit pull
output dan arahkan semuanya ke stdout sehingga kita dapat dengan mudah menangkapnyagrep
.grep -E '^\s
- maksudnya adalah untuk menangkap daftar file yang tidak terlacak yang akan ditimpa olehgit pull
. Nama file memiliki banyak karakter spasi putih di depan mereka sehingga kami menggunakannya untuk mendapatkannya.cut -f2-
- Hapus spasi dari awal setiap baris yang diambil dalam 2.xargs -I {} rm -rf "{}"
- kamixargs
untuk beralih ke semua file, simpan nama mereka di "{}" dan panggilrm
masing-masing. Kami menggunakan-rf
untuk memaksa menghapus dan menghapus direktori yang tidak terlacak.Akan bagus untuk mengganti langkah 1-3 dengan perintah porselen, tapi saya tidak mengetahui adanya persamaan.
sumber
git pull
dengangit checkout <branch_name>
Jika Anda mempertimbangkan untuk menggunakan
-f
flag, Anda mungkin menjalankannya terlebih dahulu sebagai dry-run. Hanya saja Anda tahu di muka seperti apa situasi menarik Anda akan berakhir selanjutnya ;-Psumber
Selain jawaban yang diterima tentu saja Anda dapat menghapus file jika mereka tidak lagi diperlukan dengan menentukan file:
Ingatlah untuk menjalankannya dengan flag -n terlebih dahulu jika Anda ingin melihat file mana yang akan dihapus git. Perhatikan bahwa file-file ini akan dihapus. Dalam kasus saya, saya tidak peduli dengan mereka, jadi itu solusi yang lebih baik bagi saya.
sumber
Salah satu cara untuk melakukannya adalah dengan menyembunyikan perubahan lokal dan menarik dari repo jarak jauh. Dengan cara ini, Anda tidak akan kehilangan file lokal Anda karena file akan pergi ke simpanan.
Anda dapat memeriksa file simpanan lokal Anda menggunakan perintah ini -
git stash list
sumber
Bagi mereka yang tidak tahu, git mengabaikan perbedaan nama huruf besar / kecil dalam file dan folder. Ini ternyata menjadi mimpi buruk ketika Anda mengubah nama mereka menjadi nama yang sama persis dengan kasus yang berbeda.
Saya mengalami masalah ini ketika saya mengganti nama folder dari "Petstore" menjadi "petstore" (huruf besar ke huruf kecil). Saya telah mengedit file .git / config saya untuk berhenti mengabaikan kasus, membuat perubahan, menekan komitmen saya, dan menyembunyikan perubahan saya untuk pindah ke cabang lain. Saya tidak bisa menerapkan perubahan simpanan saya ke cabang lain ini.
Perbaikan yang saya temukan yang berfungsi adalah untuk sementara mengedit file .git / config saya untuk sementara mengabaikan kasus. Ini menyebabkan
git stash apply
berhasil. Lalu, saya mengubah abaikanCase kembali kefalse
. Saya kemudian menambahkan semuanya kecuali file-file baru di folder petstore yang git diklaim aneh telah dihapus, untuk alasan apa pun. Saya melakukan perubahan saya, kemudian berlarigit reset --hard HEAD
untuk menyingkirkan file-file baru yang tidak terlacak. Komit saya muncul persis seperti yang diharapkan: file dalam folder diganti namanya.Saya harap ini membantu Anda menghindari mimpi buruk yang sama.
sumber
git pull -f
kemudiangit checkout .
. Sungguh mimpi buruk.Baik clean / reset / hard checkout / rebase bekerja untuk saya.
Jadi saya baru saja menghapus file yang git komplain tentang *
* Saya memeriksa apakah file ini dapat dihapus dengan memeriksa repo baru di folder terpisah (file tidak ada di sana)
sumber
Dalam kasus saya ketika saya memiliki masalah ini. Saya memiliki file lokal yang saya beri nama baru pada remote.
Ketika mencoba
git pull
Git mengatakan kepada saya nama file baru tidak dilacak - yang ada di remote meskipun belum ada di lokal.Karena tidak ada instance dari itu secara lokal saya tidak bisa melakukan
git pull
sampai saya lakukangit rm
pada nama file lama (yang tidak jelas pada awalnya karena ide bodoh saya untuk menamainya kembali).sumber
Jika Anda memiliki file yang ditulis di bawah .gitignore, hapus file dan jalankan git pull lagi. Itu membantu saya.
sumber
Masalahnya adalah ketika kita memiliki perubahan masuk yang akan menggabungkan file yang tidak dilacak, git mengeluh. Perintah-perintah ini membantu saya:
sumber