Bagaimana saya mengabaikan kesalahan pada 'git pull' tentang perubahan lokal saya yang akan ditimpa oleh penggabungan?


569

Bagaimana saya mengabaikan pesan kesalahan berikut pada Git pull?

Perubahan lokal Anda ke file berikut ini akan ditimpa oleh gabungan

Bagaimana jika saya ingin menimpa mereka?

Saya sudah mencoba hal-hal seperti git pull -f, tetapi tidak ada yang berhasil.

Agar jelas, saya hanya ingin menimpa perubahan spesifik, bukan segalanya.


Terkait tetapi tidak ada duplikat: stackoverflow.com/questions/52704/…
Daniel Hilgarth

7
@BrianKnoblauch sepenuhnya setuju! Plus, itu tidak banyak 'menggabungkan' jika 'menimpa' kan? Saya merindukan SVN setiap hari ...
user1944491

2
git config core.fileMode falsehemat waktu saya
Nolwennig


Bagaimana jika saya tidak ingin menimpa mereka?
Philip Rego

Jawaban:


439

Jika Anda ingin menghapus semua perubahan lokal - termasuk file yang tidak dapat dilacak oleh git - dari copy pekerjaan Anda, cukup sembunyikan saja:

git stash push --include-untracked

Jika Anda tidak membutuhkannya lagi, Anda sekarang dapat membuang simpanan itu:

git stash drop

Jika Anda tidak ingin menyembunyikan perubahan yang sudah Anda lakukan - misalnya dengan git add- lalu tambahkan opsi --keep-index. Namun perlu dicatat, bahwa ini masih akan mencegah penggabungan jika perubahan bertahap tersebut bertabrakan dengan yang dari hulu.


Jika Anda ingin menimpa hanya bagian tertentu dari perubahan lokal Anda, ada dua kemungkinan:

  1. Komit semua yang tidak ingin Anda timpa dan gunakan metode di atas untuk sisanya.

  2. Gunakan git checkout path/to/file/to/revertuntuk perubahan yang ingin Anda timpa. Pastikan file tersebut tidak dipentaskan melalui git reset HEAD path/to/file/to/revert.


Kemungkinan # 2 tidak berfungsi. Setelah menjalankan perintah tidak ada yang terjadi. Saat menarik saya masih mendapatkan kesalahan yang sama.
mae

1
@ user1132363: Ini berfungsi untuk saya. Silakan mengujinya terlebih dahulu dengan satu file. Selain itu, Anda harus memastikan bahwa file yang ingin Anda timpa tidak dipentaskan.
Daniel Hilgarth

3
Triknya adalah menggunakan git checkout HEAD^ path/to/file/to/revert. Menggunakan HEAD ^ membuat semua perbedaan.
mae

2
@ user1132363: Itu memeriksa versi sebelumnya dan bukan yang saat ini masuk. Saya tidak percaya bahwa ini adalah pendekatan yang benar.
Daniel Hilgarth

1
Saya harus meninggalkan " save --keep-index".
Peter Mortensen

318

Baiklah dengan bantuan dua jawaban lain saya telah datang dengan solusi langsung:

git checkout HEAD^ file/to/overwrite
git pull

7
Ini berhasil untuk saya. Bisakah Anda memperluas jawaban ini, yaitu. apa yang sebenarnya dilakukan?
AC Patrice

3
Itu menjatuhkan perubahan lokal, kembali ke referensi KEPALA yang mungkin merupakan komit terakhir di cabang utama
k3a

32
mengapa HEAD ^ bukannya HEAD?
Yura

19
KEPALA ^ adalah kependekan dari KEPALA ^ 1, yang pada dasarnya berarti seseorang berkomitmen sebelum KEPALA. Anda juga bisa melakukan HEAD ^ 2 untuk komit sebelum itu. Untuk informasi lebih lanjut, lihat git-scm.com/book/en/v2/… dan stackoverflow.com/questions/1955985/… .
davidneedham

4
tolong jelaskan apa yang dilakukan dalam jawaban ini
endolith

242

Ini berfungsi bagi saya untuk mengesampingkan semua perubahan lokal dan tidak memerlukan identitas:

git reset --hard
git pull

4
SO perlu mengerjakan algo peringkat mereka, rumit untuk menemukan jawaban yang berfungsi dan berperingkat tinggi sejauh ini.
Benedict K.

3
@BenedictK. Saya percaya bahwa sistem peringkat mencerminkan dengan tepat "apa yang paling bermanfaat bagi kebanyakan orang." Mereka diberi peringkat berdasarkan suara. Semakin banyak orang lebih menyukai solusi lain. Ini adalah solusi yang baik, tetapi lebih banyak orang menemukan jawaban lain lebih bermanfaat.
Kittsil

Bekerja dengan baik untuk saya
Ender

super mudah =) thx ^^
lestat_kim

tank, bekerja dengan baik untuk saya
Igor

76

Berikut adalah solusi yang membuang perubahan bertahap:

git reset file/to/overwrite
git checkout file/to/overwrite

11
Yang menjengkelkan, jika perbedaan yang dirasakan berasal dari fakta bahwa file baris baru berubah ketika diperiksa, ini tidak akan memperbaiki masalah.
DanielSank

1
Memecahkan masalah saya.
Loïc N.

ini adalah jawaban terbaik, imo, karena tidak mengganggu item yang dipentaskan, tetapi mengatasi masalah file mencegah tarikan
theRiley

65

Anda dapat melakukan perubahan sebelum melakukan penggabungan, atau menyimpannya:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
Intinya adalah, Anda tidak harus melakukan ini. Ambil saja materi KEPALA saat ini dan ..... gabungkan! Ini sangat sederhana, Git, semua VCS lain melakukannya ... tapi tidak. Linus harus membuatnya kesal untuk digunakan.
Jon

@ Jon Solusi ini untuk Ubuntu, saya belum menemukan yang lebih baik dari ini.
Suneel Kumar

Sayangnya --autostashopsi hanya tersedia dengan --rebaseopsi (
Eugen Konkov

Thats akan memperkenalkan banyak masalah yang tidak layak. Butuh 5 menit setidaknya untuk memuat juga. Juga memperkenalkan kesalahan "Putuskan tautan file". downvote
Philip Rego

51

Jika Anda ingin membuang perubahan lokal Anda pada satu file Anda dapat melakukan hal berikut:

git checkout -- <file>

Maka Anda dapat menimpa file dengan versi terbaru hanya dengan melakukan:

git pull

@pabloasc Ini menghancurkan perubahan lokal Anda di file itu.
Suneel Kumar

6
Ya itu: "Bagaimana jika saya ingin menimpa mereka?"
David

1
Pertanyaan asli tidak dapat ini, jawaban ini dapat memberikan seseorang mimpi buruk yang secara membabi buta dapat menyalin perintah.
Suneel Kumar

Jika Anda sudah melakukan komit, pertama-tama Anda harus mengembalikan komit via git reset HEAD~dan kemudian lakukangit checkout
dopexxx

git checkout -- <file>gagal denganerror: pathspec '<file>' did not match any file(s) known to git.
A__

18

Jika repositori Anda berisi beberapa file yang dihapus dari master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

Terkadang, tidak ada yang berhasil. Mengganggu, karena hal LF saya pikir, apa yang akan berhasil adalah menghapus file, lalu menarik. Bukannya saya merekomendasikan solusi ini, tetapi jika file tidak ada, git tidak akan memberi tahu Anda bahwa perubahan Anda (yang mungkin bukan perubahan) akan ditimpa, dan akan membiarkan Anda melanjutkan.

Gunakan dengan risiko Anda sendiri.


Ketika Anda terjebak karena akhir baris, metode ini adalah penyelamat
Dan Pisarski

Ini tidak bekerja untuk saya. File tidak ada secara lokal dan saya masih mendapatkan kesalahan.
PRMan

11

git stash save --keep-index tidak bekerja untuk saya.

perintah di bawah ini berfungsi seperti yang diharapkan.

git reset --hard
git pull

Itu menimpa semua perubahan lokal jika Anda tidak membutuhkannya.


10

Begitu banyak jawaban di sini yang saya benci menambahkan satu lagi, tetapi semua di atas adalah clunkier daripada yang seharusnya. Saya harus melakukan ini sepanjang waktu karena Git tampaknya menjadi bingung dan mengatakan saya telah memodifikasi file yang tidak berubah (tidak dapat kembali karena mereka tidak berubah, tetapi saya tidak dapat menarik karena mereka seharusnya telah berubah) Sederhana dan tercepat yang saya temukan sejauh ini adalah:

git stash
git stash drop
git pull

bekerja seperti pesona
Blaze

Luar biasa! solusi sederhana dan berhasil.
naïveRSA

brilian, terima kasih banyak
Hamza

8

Di Git baru-baru ini, Anda dapat menambahkan -r/ --rebasepada pullperintah untuk rebase cabang Anda saat ini di atas cabang hulu setelah mengambil. Peringatan itu seharusnya hilang, tetapi ada risiko Anda akan mendapatkan beberapa konflik yang harus Anda selesaikan.


Atau Anda dapat mengecek cabang berbeda dengan paksa, lalu kembali masterlagi, misalnya:

git checkout origin/master -f
git checkout master -f

Kemudian tarik lagi seperti biasa:

git pull origin master

Menggunakan metode ini dapat menghemat waktu Anda dari menyembunyikan ( git stash) dan kemungkinan masalah izin, mengatur ulang file ( git reset HEAD --hard), menghapus file ( git clean -fd), dll. Juga hal di atas lebih mudah diingat.


8

Masalah ini adalah karena Anda telah membuat perubahan secara lokal ke file / s dan file yang sama ada dengan perubahan dalam repositori Git, jadi sebelum menarik / mendorong Anda perlu menyimpan perubahan lokal:

Untuk menimpa perubahan lokal dari satu file:

git reset file/to/overwrite
git checkout file/to/overwrite

Untuk menimpa semua perubahan lokal (perubahan dalam semua file):

git stash
git pull
git stash pop

Juga masalah ini mungkin karena Anda berada di cabang yang tidak digabungkan dengan cabang master.


5

git reset --hard && git clean -df

Perhatian : Ini akan mengatur ulang dan menghapus file yang tidak terlacak.


27
Seseorang tidak menggunakan kapak untuk menghilangkan lalat dari dahi teman.
HonoredMule

3
JANGAN gunakan ini tanpa kesadaran bahwa beberapa file akan DIHAPUS.
andromeda

4

Anda dapat menggunakan ini untuk menimpa file

git checkout file_to_overwrite

4

Cara terbaik untuk mengatasi masalah ini adalah:

git checkout -- <path/file_name>

Setelah itu, Anda dapat menimpa file dengan:

git pull origin master

Saya memiliki masalah yang disebutkan karena saya telah memperbarui indeks untuk menganggap file tidak berubah. Masih tidak membiarkan saya melakukan tarikan. Saya menggunakan git checkout -- path/*sekali saja, dan itu memungkinkan saya untuk melakukan tarikan setelah.
Stephen O'Flynn

4

Ini berhasil bagi saya untuk membuang perubahan pada server remote langsung dan menarik dari kontrol sumber GitHub:

git reset --hard
git pull origin master

4

Inilah strategi saya untuk menyelesaikan masalah.

Pernyataan masalah

Kami perlu melakukan perubahan di lebih dari 10 file. Kami mencoba PULL (git pull origin master), tetapi Git berteriak:

kesalahan: Perubahan lokal Anda ke file berikut akan ditimpa oleh gabungan: Tolong, komit perubahan Anda atau simpan sebelum Anda dapat bergabung.

Kami mencoba mengeksekusi commitdan kemudian pull, tetapi mereka juga tidak berhasil.

Larutan

Kami sebenarnya berada di tahap kotor , karena file-file berada di "Staging Area" alias "Area Indeks" dan beberapa berada di "Head Area" alias "direktori Git lokal". Dan kami ingin menarik perubahan dari server.

Periksa tautan ini untuk informasi tentang berbagai tahapan Git dengan cara yang jelas: Tahapan GIT

Kami mengikuti langkah-langkah berikut

  • git stash (ini membuat direktori kerja kami bersih. Perubahan Anda disimpan di stack oleh Git).
  • git pull origin master (Tarik perubahan dari server)
  • git stash apply (Diterapkan semua perubahan dari tumpukan)
  • git commit -m 'message' (Mengkomit perubahan)
  • git push origin master (Mendorong perubahan ke server)
  • git stash drop (Jatuhkan tumpukan)

Mari kita pahami kapan dan mengapa Anda perlu menyembunyikan

Jika Anda dalam keadaan kotor , berarti Anda membuat perubahan pada file Anda dan kemudian Anda terpaksa, karena alasan apa pun, untuk menarik atau beralih ke cabang lain untuk beberapa pekerjaan yang sangat mendesak, jadi pada titik ini Anda tidak dapat menarik atau beralih sampai Anda melakukan perubahan Anda. The stashperintah di sini sebagai tangan membantu.

Dari buku ProGIT , Edisi ke-2:

Seringkali, ketika Anda sedang mengerjakan bagian dari proyek Anda, banyak hal berada dalam keadaan berantakan dan Anda ingin berganti cabang sedikit untuk mengerjakan sesuatu yang lain. Masalahnya adalah, Anda tidak ingin melakukan komitmen pekerjaan setengah jadi hanya agar Anda bisa kembali ke titik ini nanti. Jawaban untuk masalah ini adalah perintah git stash. Stashing mengambil kondisi kotor dari direktori kerja Anda - yaitu, file yang Anda lacak yang dimodifikasi dan melakukan perubahan - dan menyimpannya di tumpukan perubahan yang belum selesai yang dapat Anda aplikasikan kembali kapan saja.


3

Jika Anda ingin menimpa perubahan tertentu, Anda perlu beberapa cara untuk mengatakannya mana yang ingin Anda lupakan.

Anda dapat mencoba menyimpan perubahan yang ingin Anda abaikan dengan menggunakan git stash --patchdan kemudian menyimpan simpanan itu secara selektif git stash drop. Anda kemudian dapat menarik perubahan jarak jauh dan menggabungkannya seperti biasa.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Saya tidak tahu mengapa ini belum dijawab, tetapi solusi, seperti yang Anda lihat sederhana. Semua jawaban di sini menyarankan hal yang sama: untuk menghapus / menyimpan perubahan lokal Anda dan menerapkan upstream, lalu (jika Anda save) menerapkan perubahan lokal Anda di atas.

Apa yang git pull --rebase --autostashdilakukan langkah demi langkah:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Kasus saya (mungkin juga Anda):

Saya memiliki perubahan lokal (perubahan di direktori kerja):

masukkan deskripsi gambar di sini

Ketika saya mencoba untuk menarik perubahan jarak jauh saya mendapatkan kesalahan:

masukkan deskripsi gambar di sini

Perubahan ini tidak berpotongan dengan perubahan lokal:

masukkan deskripsi gambar di sini

Jadi ketika saya pull --rebase --autostashperubahan lokal disimpan dan diterapkan tanpa masalah secara otomatis

masukkan deskripsi gambar di sini

Sekarang perubahan lokal saya sedikit lebih rendah: masukkan deskripsi gambar di sini


2

Saya punya kasus khusus ini: Saya punya file dengan --assume-tidak berubah. Sulit ditemukan, karena git statusperintah tidak menunjukkan perubahan


Saya punya masalah yang sama. Apakah Anda menemukan cara untuk menyiasatinya? Saya kira saya bisa menghapus dan kemudian menambahkan kembali asumsi-tidak berubah ... apa yang saya lakukan hanya checkout file-file secara manual untuk mendapatkan versi yang tidak berubah ... hanya ingin tahu apakah ada cara untuk hanya membuat checkout / rebase / penggabungan hanya menimpa mereka.
David

1
Tidak, saya harus meninggalkan semua hal "anggap tidak berubah".

2

Jika Anda ingin menyimpan perubahan produksi di server, cukup gabungkan menjadi item konfigurasi baru. Metode pemrosesan adalah sebagai berikut:

git stash
git pull
git stash pop

Mungkin Anda tidak menjalankan semua operasi. Anda bisa tahu apa yang bisa Anda lakukan selanjutnya.


Anda kemudian dapat menggunakan Git diff - w + nama file untuk mengonfirmasi penggabungan kode secara otomatis
YanQing

1

Saya mengabaikan file di repo saya dan ketika saya melakukannya git pull upstream mastersaya mendapat kesalahan berikut:

galat: Perubahan lokal Anda ke file berikut akan ditimpa oleh gabungan: myfile.js Tolong, komit perubahan Anda atau sembunyikan sebelum Anda dapat bergabung. Batalkan

Untuk mengatasinya saya melakukan hal berikut

git update-index --no-assume-unchanged myfile.js

Saya kemudian melakukannya git statusdan menerima pesan ini

Pada master cabang Cabang Anda berada di belakang 'asal / master' sebanyak 4 komit, dan dapat diteruskan dengan cepat. (gunakan "git pull" untuk memperbarui cabang lokal Anda)

Perubahan yang tidak dilakukan untuk komit: (gunakan "git add ..." untuk memperbarui apa yang akan dilakukan) (gunakan "git checkout - ..." untuk membuang perubahan dalam direktori kerja)

diubah: myfile.js

tidak ada perubahan yang ditambahkan ke komit (gunakan "git add" dan / atau "git commit -a")

Kemudian saya git checkout myfile.jsdiikuti oleh git pull upstream master. Kali ini operasi git pull berhasil.


1

Saya menemukan ini ketika menarik dari master.

Cara saya menanganinya, menggunakan Visual Studio;

  1. Pertama, saya melakukan Undo commit pada solusi saya.
  2. Lalu saya melakukan proses tarik Git.

Semoga ini membantu!


1

Solusi paling sederhana adalah:

git reset --hard && git pull

1

Saya baru di git dan tidak yakin apakah solusi saya adalah ide yang bagus.

Saya telah menguji SEMUA jawaban dan tidak satupun yang berhasil untuk saya!

Tetapi saya menemukan solusi lain:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Semoga ini membantu.


1

Kesalahan "Perubahan lokal Anda ke file berikut akan ditimpa oleh gabungan" muncul karena Anda memiliki beberapa perubahan pada repo lokal yang belum pernah dilakukan, jadi sebelum menarik dari repo jarak jauh, cukup lakukan perubahan pada repo lokal.

Katakanlah repo jarak jauh Anda memiliki beberapa cabang xyz dan Anda ingin agar cabang repo xyz jarak jauh digabungkan menjadi (disalin ke) cabang repo xyz lokal,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

Jika kesalahan ini karena akhir baris,

git add
git checkout mybranch

akan bekerja. Saya tidak begitu yakin mengapa itu berhasil.


0

Untuk Pycharm, Anda dapat melakukan Git -> Kembalikan dan kemudian tarik.


0

Pesan ini juga bisa terjadi jika git-lfs digunakan dan penunjuk file ditimpa oleh file nyata.

maka Anda menggunakan:

git stash
git lfs migrate import
git pull

output penuh dari kasing saya

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

lihat https://github.com/git-lfs/git-lfs/issues/2839


0

Saya sudah mencoba dan berhasil, sebelum menarik, biarkan komit semua file yang belum Anda komit, maka Anda tidak akan menerima pesan itu dari AS.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.