File pohon kerja yang tidak terlacak berikut ini akan ditimpa oleh gabungan, tapi saya tidak peduli

344

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?

CQM
sumber
3
kemungkinan duplikat dari Force git untuk menimpa file lokal saat tarik
Balog Pal
1
Ini adalah jawaban terbaik karena hanya akan menghapus file yang menghalangi Anda untuk bergabung: stackoverflow.com/a/52255219/551045
RedX

Jawaban:

539

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

git add * 
git stash
git pull

Ini akan melacak semua file, menghapus semua perubahan lokal Anda ke file-file itu, dan kemudian mendapatkan file dari server.

userFog
sumber
59
git add -A .; git stashbekerja untukku. The git add *varian mengeluhkan jalur diabaikan.
imsky
11
Saya mencoba git add., Git simpanan, git tarik. Itu berhasil, tapi saya masih belum mengerti kenapa?
BAHKAN
1
Bagi saya, saya memiliki file jarak jauh yang dilacak dan saya memiliki file dengan nama yang sama di repo lokal saya yang tidak terlacak. Jadi, jika Anda menambahkan file lokal simpanan perubahan dan kemudian tarik, file jauh harus menimpa file lokal.
userFog
2
Berikut ini tautan yang bagus untuk memahami cara kerjanya, jika ada yang tertarik. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay
2
//, ini tidak terlalu jauh dari tujuan kesalahan ini, sungguh.
Nathan Basanese
137

Anda dapat mencoba perintah untuk menghapus file yang tidak terlacak dari lokal

Git 2.11 dan versi yang lebih baru:

git clean  -d  -f .

Git versi lama:

git clean  -d  -f ""

Di mana -dbisa 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.

shan
sumber
23
Saya akan menambahkan -iuntuk mode interaktif. Selain menghapus direktori yang tidak diinginkan, saya juga baru saja menghapus pengaturan pengguna saya untuk proyek :-(
dumbledad
6
Sebaiknya memindai melalui komentar ke jawaban yang sama seperti yang -xbisa menyakitkan.
dumbledad
10
Tapi ini sangat berbahaya, dan bukan tugas yang tidak bisa dihancurkan !! Anda mungkin kehilangan banyak file! HATI-HATI!!
Mohamed Kawsara
16
Ini menghapus semua direktori vendor saya di Slim Framework . HATI-HATI DENGAN PERINTAH INI
RousseauAlexandre
2
Anda harus menghapus 'x' dari jawaban Anda. Sangat berbahaya!
earl3s
107

Satu-satunya perintah yang bekerja untuk saya adalah:

git fetch --all
git reset --hard origin/{{your branch name}}
Asaf Manassen
sumber
5
Perlu dicatat bahwa jawaban ini diperlukan jika Anda telah menghapus submodul dan membacanya sebagai pustaka dalam repo asli. Saya membutuhkan jawaban dan ini yang berhasil.
Routhinator
Saya tidak punya submodules, dan mencoba git clean dan git simpanan seperti yang disarankan dalam jawaban lain, tetapi hanya ini yang membantu.
kslstn
Setelah menyelesaikan berbagai submodul, ini adalah satu-satunya hal yang bekerja untuk saya juga. Catatan khusus, saya punya masalah sensitivitas kasus juga pada file. Ex. XML.php ke Xml.php di folder vendor saya dari komposer.
KazaJhodo
1
Ini juga berhasil untuk saya. Bisakah Anda jelaskan apa yang sedang terjadi? Saya tidak mengerti.
Dimitris Karamanis
1
Ini menghapus dua komit lokal saya, berhati-hatilah sebelum menggunakan ini!
David Cian
27

Pengganti untuk git mergeitu akan menimpa file yang tidak dilacak

Komentar di bawah ini menggunakan 'FOI' untuk 'file yang menarik', file itu

  • ada di cabang donor,
  • tidak ada di cabang penerima,
  • dan memblokir penggabungan karena mereka ada dan tidak terlacak di direktori kerja Anda.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Pengganti untuk git pullitu akan menimpa file yang tidak dilacak

pull = fetch + merge, jadi kita lakukan git fetchdengan git checkout -f, git checkout, git mergetrik di atas.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Penjelasan detail

git merge -ftidak ada, tetapi git checkout -fada.

Kami akan menggunakan git checkout -f+ git checkoutuntuk 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).

git checkout -f donor-branch

Langkah 2. Langkah ini menghilangkan FOI karena mereka dilacak di cabang kami saat ini (donor), dan tidak ada di receiving-branchkami beralih ke.

git checkout receiving-branch

Langkah 3. Sekarang setelah FOI tidak ada, penggabungan dalam cabang donor tidak akan menimpa file yang tidak terlacak, jadi kami tidak mendapatkan kesalahan.

git merge donor-branch
Esteis
sumber
3
Ini terlalu bersih untuk menjadi 7 atau 8 Jawaban!
Majed DH
1
Terima kasih, @MajedDH, Anda membuat hari saya! <3
Esteis
1
Ini di sini adalah instafix yang saya cari! Terima kasih
AFM-Horizon
Senang telah membantu Anda, @ AFM-Horizon!
Esteis
20

Hapus semua file yang tidak dilacak:

git clean  -d  -fx .
Abhishek Goel
sumber
8
menghapus file yang mungkin digunakan dalam suatu proyek seharusnya tidak menjadi solusi nyata
Erdinç Çorbacı
4
Astaga, membersihkan file IDE juga :(
Kate
18

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;)

mnagel
sumber
15

Anda dapat mencoba perintah itu

git clean -df
Amr Mohammed
sumber
5
apa gunanya menghapus direktori yang tidak terlacak? .. mereka bisa berharga, lho.
zhekaus
Bisakah Anda menjelaskan apa fungsinya ??
Safak Ozkan
12

Perbarui - versi yang lebih baik

Alat ini ( https://github.com/mklepaczewski/git-clean-before-merge ) akan:

  • hapus file yang tidak dilacak yang identik dengan git pullpadanannya,
  • kembalikan perubahan ke file yang dimodifikasi yang versi versinya identik dengan git pullpadanannya,
  • melaporkan file yang dimodifikasi / tidak dilacak yang berbeda dari git pullversinya,
  • alat ini memiliki --pretendopsi 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 pulldan menghapusnya.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

dan kemudian lakukan saja:

git pull

Ini bukan perintah porselen git jadi selalu periksa kembali apa yang akan dilakukan dengan:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Penjelasan - karena satu kalimat menakutkan:

Berikut ini rincian dari fungsinya:

  1. git pull 2>&1- Tangkap git pulloutput dan arahkan semuanya ke stdout sehingga kita dapat dengan mudah menangkapnya grep.
  2. grep -E '^\s- maksudnya adalah untuk menangkap daftar file yang tidak terlacak yang akan ditimpa oleh git pull. Nama file memiliki banyak karakter spasi putih di depan mereka sehingga kami menggunakannya untuk mendapatkannya.
  3. cut -f2- - Hapus spasi dari awal setiap baris yang diambil dalam 2.
  4. xargs -I {} rm -rf "{}"- kami xargsuntuk beralih ke semua file, simpan nama mereka di "{}" dan panggil rmmasing-masing. Kami menggunakan -rfuntuk memaksa menghapus dan menghapus direktori yang tidak terlacak.

Akan bagus untuk mengganti langkah 1-3 dengan perintah porselen, tapi saya tidak mengetahui adanya persamaan.

matt
sumber
Terima kasih, saya sering memiliki file yang tidak terlacak dalam direktori kerja saya yang tidak ingin saya hapus atau komit. Dalam kasus saya, saya harus menggantikannya git pulldengangit checkout <branch_name>
mihow
6

Jika Anda mempertimbangkan untuk menggunakan -fflag, Anda mungkin menjalankannya terlebih dahulu sebagai dry-run. Hanya saja Anda tahu di muka seperti apa situasi menarik Anda akan berakhir selanjutnya ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.
Maarten
sumber
6

Selain jawaban yang diterima tentu saja Anda dapat menghapus file jika mereka tidak lagi diperlukan dengan menentukan file:

git clean -f '/path/to/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.

MMM
sumber
5

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.

git add -A
git stash
git pull

Anda dapat memeriksa file simpanan lokal Anda menggunakan perintah ini - git stash list

AHM Forhadul Islam
sumber
4

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 applyberhasil. Lalu, saya mengubah abaikanCase kembali ke false. 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 berlari git reset --hard HEADuntuk 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.

A. Davidson
sumber
Tidak bekerja untuk saya. Saya menghapus semua file di folder. Lalu git pull -fkemudian git checkout .. Sungguh mimpi buruk.
m.rufca
Betulkah? Itu bekerja dengan baik untuk saya hanya beberapa minggu yang lalu. Apakah Anda mencoba mengedit file gitconfig Anda untuk memulai / berhenti mengabaikan kasus yang sesuai?
A. Davidson
Terima kasih. Saya perlu menggabungkan dari master setelah memperbaiki casing di jalur folder. Saya dapat menggabungkannya dengan git abaikan case, setelah itu saya mengaktifkan kembali sensitivitas case.
Rubenisme
3

Baik clean / reset / hard checkout / rebase bekerja untuk saya.

Jadi saya baru saja menghapus file yang git komplain tentang *

rm /path/to/files/that/git/complained/about

* Saya memeriksa apakah file ini dapat dihapus dengan memeriksa repo baru di folder terpisah (file tidak ada di sana)

Michał Szkudlarek
sumber
1

Dalam kasus saya ketika saya memiliki masalah ini. Saya memiliki file lokal yang saya beri nama baru pada remote.

Ketika mencoba git pullGit 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 pullsampai saya lakukan git rmpada nama file lama (yang tidak jelas pada awalnya karena ide bodoh saya untuk menamainya kembali).

Tom Bush
sumber
0

Jika Anda memiliki file yang ditulis di bawah .gitignore, hapus file dan jalankan git pull lagi. Itu membantu saya.

uko akanowo
sumber
0

Masalahnya adalah ketika kita memiliki perubahan masuk yang akan menggabungkan file yang tidak dilacak, git mengeluh. Perintah-perintah ini membantu saya:

git clean -dxf
git pull origin master
Zohan
sumber