Bagaimana cara membuat git pull menimpa file lokal?

Bagaimana cara menimpa file lokal secara paksa di git pull ?

Scriptnya adalah sebagai berikut:

  • Anggota tim memodifikasi templat untuk situs yang sedang kami kerjakan
  • Mereka menambahkan beberapa gambar ke katalog gambar (tetapi lupa menambahkannya di bawah kendali kode sumber)
  • Mereka mengirim gambar melalui surat, nanti, ke saya
  • Saya menambahkan gambar di bawah kendali kode sumber dan meletakkannya di GitHub bersama dengan perubahan lainnya.
  • Mereka tidak dapat menerima pembaruan dari GitHub karena Git tidak ingin menimpa file mereka.

Ini adalah kesalahan yang saya dapatkan:

error: file pohon kerja 'publik / gambar / ikon.gif' yang tidak dilacak akan ditimpa oleh gabungan

Bagaimana membuat Git menimpanya? Orang ini adalah seorang desainer. Saya biasanya menyelesaikan semua konflik secara manual, jadi versi terbaru diinstal di server, yang hanya perlu mereka perbarui di komputer mereka.

5705
14 июля '09 в 17:58 2009-07-14 17:58 ditanya oleh Jakub Troszok pada 14 Juli 2009 pada 17:58 2009-07-14 17:58
@ 39 jawaban
  • 1
  • 2

Penting: jika Anda memiliki perubahan lokal, mereka akan hi>--hard atau tanpa --hard semua komit lokal yang belum ditransmisikan akan hi>[*]

Jika Anda memiliki file yang tidak dilacak oleh Git (misalnya, konten pengguna yang diunduh), file-file ini tidak akan terpengaruh.


Saya pikir ini adalah cara yang benar:

 git fetch --all 

Maka Anda memiliki dua opsi:

 git reset --hard origin/master 

ATAU Jika Anda berada di cabang lain:

 git reset --hard origin/<branch_name> 

Penjelasan:

git fetch unduhan data terbaru dari komputer jarak jauh, tanpa berusaha menggabungkan atau memindahkan apa pun.

Kemudian git reset me-reset cabang utama ke apa yang baru saja Anda terima. Opsi --hard mengubah semua file di pohon kerja Anda sesuai dengan file dalam origin/master


Pertahankan komitmen lokal saat ini

[*] : Perlu dicatat bahwa Anda dapat menyimpan komit lokal saat ini dengan membuat cabang dari master untuk mengatur u>

 git checkout master git branch new-branch-to-save-current-commits git fetch --all git reset --hard origin/master 

Setelah itu, semua commit lama akan disimpan di commit new-branch-to-save-current-commits .

Perubahan yang tertunda

Namun, perubahan yang tidak tetap (bahkan bertahap) akan hi>

 git stash 

Dan kemudian menerapkan kembali perubahan yang tidak dikomit ini:

 git stash pop 
7980
17 янв. jawabannya diberikan RNA 17 Januari. 2012-01-17 03:02 '12 pada 3:02 2012-01-17 03:02

Coba yang berikut ini:

 git reset --hard HEAD git pull 
border=0

Dia harus melakukan apa yang Anda inginkan.

798
09 мая '10 в 22:45 2010-05-09 22:45 membalas Travis Reeder 09 Mei, '10 jam 10:45 2010-05-09 22:45

PERHATIAN: git clean menghapus semua file / direktori Anda yang tidak bisa dilacak dan tidak dapat diurungkan.


Terkadang hanya clean -f tidak membantu. Jika Anda tidak memiliki direktori yang dilacak, opsi -d juga diperlukan:

 # WARNING: this can't be undone! git reset --hard HEAD git clean -f -d git pull 

PERHATIAN: git clean menghapus semua file / direktori Anda yang tidak bisa dilacak dan tidak dapat diurungkan.

Coba -n menggunakan -n ( --dry-run ). Ini akan menunjukkan kepada Anda apa yang akan dihapus tanpa benar-benar menghapus apa pun:

 git clean -n -f -d 

Contoh output:

 Would remove untracked-file-1.txt Would remove untracked-file-2.txt Would remove untracked/folder ... 
406
19 марта '11 в 12:10 2011-03-19 12:10 jawabannya diberikan oleh David Avsajanishvili 19 Maret '11 pada 12:10 2011-03-19 12:10

Seperti landak, saya pikir jawabannya mengerikan. Tetapi meskipun jawaban Hedgehog mungkin lebih baik, saya tidak berpikir itu seanggun mungkin. Cara saya menemukan ini adalah menggunakan "pengambilan sampel" dan "penggabungan" dengan strategi tertentu. Ini harus memastikan bahwa perubahan lokal Anda disimpan sampai mereka adalah salah satu file yang Anda coba timpa.

Pertama-tama lakukan perubahan.

  git add * git commit -a -m "local file server commit message" 

Kemudian ambil perubahan dan tulis u>
  git fetch origin master git merge -s recursive -X theirs origin/master 

"- X" adalah nama opsi, dan "milik mereka" adalah nilai untuk opsi ini. Anda lebih suka menggunakan perubahan "Anda" daripada perubahan "Anda" jika ada konflik.

347
11 апр. Jawaban diberikan oleh Richard Kersey 11 Apr 2012-04-11 23:13 '12 pada 11:13 PM 2012-04-11 23:13

Sebaliknya:

 git fetch --all git reset --hard origin/master 

Saya akan menyarankan untuk melakukan hal berikut:

 git fetch origin master git reset --hard origin/master 

Tidak perlu mengambil semua konsol dan cabang, jika Anda pergi untuk mengatur u>

248
26 апр. Johanneke memposting pada 26 April 2013-04-26 16:48 '13 pada 16:48 2013-04-26 16:48

Sepertinya hal terbaik untuk dilakukan adalah ini:

 git clean 

Untuk menghapus semua file yang tidak digunakan dan kemudian melanjutkan dengan ...

125
14 июля '09 в 18:16 2009-07-14 18:16 jawabannya diberikan oleh Jakub Troszok pada 14 Juli 2009 pukul 18:16 2009-07-14 18:16

Perhatian, ini akan menghapus file Anda secara permanen jika Anda memiliki entri direktori / * di file gitignore Anda.

Beberapa jawaban tampak mengerikan. Mengerikan dalam arti apa yang terjadi pada @Lauri, mengikuti saran David Avsadjanishvili.

Sebaliknya (git> v1.7.6):

 git stash --include-untracked git pull 

Anda nanti dapat menghapus cache riwayat.

Secara manual, satu per satu:

 $ git stash list stash@{0}: WIP on <branch>: ... stash@{1}: WIP on <branch>: ... $ git stash drop stash@{0} $ git stash drop stash@{1} 

Kejam, sekaligus:

 $ git stash clear 

Tentu saja, jika Anda ingin kembali ke apa yang Anda sembunyikan:

 $ git stash list ... $ git stash apply stash@{5} 
102
12 февр. Jawabannya diberikan oleh Hedgehog pada 12 Februari 2012-02-12 02:00 '12 pada pukul 2:00 2012-02-12 02:00

Anda mungkin menemukan perintah ini berguna untuk menghapus perubahan lokal:

 git checkout <your-branch> -f 

Dan kemudian lakukan pembersihan (menghapus file mentah dari pohon kerja):

 git clean -f 

Jika Anda ingin menghapus direktori yang tidak perlu selain file tanpa jejak:

 git clean -fd 
88
05 авг. jawabannya diberikan oleh Vishal 05 Agustus. 2010-08-05 21:06 '10 pada 21:06 2010-08-05 21:06

Alih-alih bergabung dengan git pull coba ini:

git fetch --all

diikuti oleh:

git reset --hard origin/master .

81
22 нояб. Jawabannya diberikan oleh Lloyd Moore pada 22 November. 2012-11-22 13:56 '12 pada 13:56 2012-11-22 13:56

Satu-satunya hal yang berhasil bagi saya adalah:

 git reset --hard HEAD~5 

Ini akan memberi Anda lima komitmen, dan kemudian

 git pull 

Saya menemukan bahwa dengan melihat cara membatalkan git merge .

54
06 мая '11 в 0:53 2011-05-06 00:53 jawabannya diberikan oleh Chris BIllante pada 06 Mei '11 di 0:53 2011-05-06 00:53

Masalah dengan semua solusi ini adalah mereka terlalu kompleks, atau bahkan masalah yang lebih serius adalah mereka menghapus semua file mentah dari server web, yang tidak kita inginkan, karena file konfigurasi yang selalu ada di server selalu diperlukan dan tidak di repositori git.

Berikut adalah solusi terbersih yang kami gunakan:

51
06 нояб. jawaban yang diberikan oleh Strahinja Kustudic 06 November 2012-11-06 02:32 '12 pada 2:32 2012-11-06 02:32

Saya memiliki masalah yang sama. Tidak ada yang memberi saya solusi ini, tetapi itu berhasil untuk saya.

Saya memutuskan ini:

  1. Hapus semua file. Biarkan hanya direktori .git .
  2. git reset --hard HEAD
  3. git pull
  4. git push

Sekarang berhasil.

38
13 янв. Balasan diberikan oleh John John Pichler pada 13 Januari 2011-01-13 02:58 '11 pada 2:58 2011-01-13 02:58

Pertama-tama, coba cara standar:

 git reset HEAD --hard # To remove all not committed changes! git clean -fd # To remove all untracked (non-git) files and folders! 

Peringatan : perintah di atas dapat menyebabkan hi> Jika Anda tidak yakin, pertama-tama buat cadangan seluruh folder repositori Anda.

Kemudian tarik lagi.

Jika hal di atas tidak membantu dan Anda tidak memerlukan file / direktori Anda yang tidak dilacak (cukup buat cadangan terlebih dahulu, untuk berjaga-jaga), coba >

 cd your_git_repo # where 'your_git_repo' is your git repository folder rm -rfv * # WARNING: only run inside your git repository! git pull # pull the sources again 

Ini akan menghapus semua file git (kecuali untuk .git/ dir, di mana Anda memiliki semua komit) dan mengekstraknya lagi.


Mengapa git reset HEAD --hard mungkin tidak berfungsi dalam beberapa kasus?

  1. Aturan pengguna dalam .gitattributes file

    Kehadiran aturan eol eol=lf dalam .gitattributes dapat menyebabkan git mengubah beberapa perubahan file, mengubah akhir baris CRLF ke LF dalam beberapa file teks.

    Jika demikian, Anda harus melakukan perubahan CRLF / LF ini (dengan melihatnya dalam git status ) atau mencoba: git config core.autcrlf false untuk sementara mengabaikannya.

  2. Ketidakcocokan sistem file

    Ketika Anda menggunakan sistem file yang tidak mendukung atribut izin. Misalnya, Anda memiliki dua repositori, satu untuk Linux / Mac ( ext3 / hfs+ ) dan yang lainnya untuk 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 u>--hard Anda mencoba, git selalu mendeteksi beberapa "perubahan".

33
26 окт. jawabannya diberikan kenorb 26 oktober. 2012-10-26 12:17 '12 pada 12:17 2012-10-26 12:17

Bonus:

Berbicara tentang menarik / mengambil / menggabungkan jawaban sebelumnya, saya ingin berbagi trik yang menarik dan produktif:

git pull --rebase

Tim ini adalah tim paling berguna dalam hidup saya di Git, yang telah menghemat banyak waktu.

Sebelum mengirim komit baru Anda ke server, coba perintah ini dan itu akan secara otomatis menyinkronkan perubahan server terbaru (dengan mengambil + gabungan) dan meletakkan komit Anda di bagian atas log Git. Tidak perlu khawatir tentang ekstraksi / penggabungan manual.

Temukan bagian dalam Apa yang membuat "git pull --rebase"? ,

31
23 дек. Jawabannya diberikan oleh Sazzad Hissain Khan pada 23 Desember. 2015-12-23 18:41 '15 pada 18:41 2015-12-23 18:41

Saya merangkum jawaban lainnya. Anda dapat melakukan git pull tanpa kesalahan:

 git fetch --all git reset --hard origin/master git reset --hard HEAD git clean -f -d git pull 

Peringatan Skrip ini sangat kuat, sehingga Anda bisa kehi>

27
07 авг. jawabannya diberikan oleh Robert Moon 07 Agustus. 2015-08-07 06:03 '15 pada 6:03 2015-08-07 06:03

Saya punya masalah serupa. Saya harus melakukan ini:

 git reset --hard HEAD git clean -f git pull 
27
14 янв. Jawaban diberikan oleh Ryan 14 Januari 2011-01-14 18:18 '11 pada 18:18 2011-01-14 18:18

Berdasarkan pengalaman saya sendiri seperti ini, solusi yang ditawarkan oleh Strahinja Kustudic di atas sejauh ini adalah yang terbaik. Seperti yang telah dicatat oleh orang lain, cukup melakukan hard reset akan menghapus semua file yang belum diuji, yang mungkin mencakup banyak hal yang tidak ingin Anda hapus, seperti file konfigurasi. Lebih aman, Anda hanya perlu menghapus file yang perlu ditambahkan, dan, dalam hal ini, Anda mungkin juga ingin memeriksa file yang dimodifikasi secara lokal yang perlu diperbarui.

Itu sebabnya saya memperbarui skrip Kustudis untuk melakukan hal itu. Saya juga memperbaiki kesalahan ketik (hi>

26
27 февр. Balasan yang diberikan oleh Rolf Kaiser pada 27 Februari 2013-02-27 17:43 '13 pada 17:43 2013-02-27 17:43

Saya percaya bahwa ada dua kemungkinan penyebab konflik yang perlu diselesaikan secara terpisah, dan sejauh yang saya tahu, tidak ada jawaban di atas yang terkait dengan keduanya:

  • File lokal yang tidak dipantau harus dihapus secara manual (lebih aman) atau, seperti yang disarankan dalam balasan lain, untuk mendapatkan git clean -f -d

  • Komit lokal yang tidak ada di cabang jarak jauh juga harus dihapus. IMO adalah cara termudah untuk mencapai ini: git reset --hard origin/master (ganti "master" dengan cabang mana pun yang sedang Anda kerjakan, dan jalankan pertama git fetch origin )

23