Bagaimana cara mengatasi git yang mengatakan "Lakukan perubahan atau sembunyikan sebelum Anda dapat bergabung"?


763

Saya membuat beberapa pembaruan pada mesin lokal saya, mendorongnya ke repositori jarak jauh, dan sekarang saya mencoba untuk menarik perubahan ke server dan saya mendapatkan pesan;

kesalahan: Perubahan lokal Anda ke file berikut akan ditimpa oleh gabungan:

wp-content / w3tc-config / master.php

Tolong, komit perubahan Anda atau simpan sebelum Anda dapat bergabung.

Jadi saya berlari,

git checkout -- wp-content/w3tc-config/master.php

dan mencoba lagi dan saya mendapatkan pesan yang sama. Saya berasumsi bahwa w3tcmengubah sesuatu dalam file konfigurasi di server. Saya tidak peduli apakah salinan lokal atau salinan jarak jauh berjalan di server (saya kira yang jauh adalah yang terbaik), saya hanya ingin dapat menggabungkan sisa perubahan saya (pembaruan plugin).

Ada ide?



11
Ini adalah pertanyaan yang lebih eksplisit dengan lebih banyak detail dan jawaban yang lebih baik. Saya pikir sangat berharga untuk menjaga yang ini. Ya, yang lain secara teknis diminta terlebih dahulu, tetapi menghapus yang satu ini akan membuat lebih sulit bagi orang untuk menemukan jawaban yang mereka cari.
Jo Sprague

Jawaban:


1301

Anda tidak dapat bergabung dengan modifikasi lokal. Git melindungi Anda dari kehilangan kemungkinan perubahan penting.

Anda memiliki tiga opsi:

  • Komit perubahan menggunakan

    git commit -m "My message"
    
  • Simpan itu.

    Menyimpan berfungsi sebagai tumpukan, tempat Anda dapat mendorong perubahan, dan Anda membuatnya terbalik.

    Untuk menyimpan, ketikkan

    git stash
    

    Lakukan penggabungan, lalu tarik simpanan:

    git stash pop
    
  • Buang perubahan lokal

    menggunakan git reset --hard
    ataugit checkout -t -f remote/branch

    Atau: Buang perubahan lokal untuk file tertentu

    menggunakan git checkout filename


104
Anda juga dapat membuang perubahan lokal untuk file tertentu dengan melakukan: git checkout filename
ckb

6
Terima kasih. Saya akan menambahkan ini, jika Anda melakukannya, git reset --hardAnda mungkin juga ingin menghapus file yang tidak terlacak dengangit clean -dfx
Jo Sprague

13
Secara default git stashtidak akan menyimpan file yang tidak ada riwayatnya. Jadi jika Anda memiliki file yang belum Anda tambahkan tetapi yang akan ditimpa atau "dibuat" oleh penggabungan, maka gabungan tersebut akan tetap memblokir. Dalam situasi itu, Anda dapat menggunakan git stash -uuntuk menyimpan file yang tidak dikomit juga. Atau Anda bisa menghapusnya!
joeytwiddle

25
berlari git clean -dfxadalah ide yang buruk. Menghapus beberapa file .gitignored yang sebenarnya saya butuhkan.
ezuk

5
Saya mengalami situasi di mana seorang pengguna, setelah melakukan git reset --hard, masih memiliki perubahan yang tidak dihapus!
Amedee Van Gasse

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

Perintah pertama menyimpan perubahan Anda sementara di simpanan dan menghapusnya dari direktori kerja.

Perintah kedua beralih cabang.

Perintah ketiga mengembalikan perubahan yang telah Anda simpan di simpanan ( --indexopsi berguna untuk memastikan bahwa file yang dipentaskan masih dipentaskan).



2
untuk menjelaskan @ titik vikramvi ini: kita juga bisa menggunakan git stash popbukan git stash apply. Yang pertama menghapusnya dari simpanan sementara yang terakhir masih menyimpannya di sana
Anupam

27

Anda dapat mencoba salah satu metode berikut:

rebase

Untuk perubahan sederhana cobalah rebasing di atasnya sambil menarik perubahan, misalnya

git pull origin master -r

Jadi itu akan menerapkan cabang Anda saat ini di atas cabang hulu setelah mengambil.

Ini setara dengan: checkout master, fetchdan rebase origin/masterperintah git.

Ini adalah mode operasi yang berpotensi berbahaya. Itu menulis ulang sejarah, yang bukan pertanda baik ketika Anda sudah menerbitkan sejarah itu. Jangan gunakan opsi ini kecuali Anda telah membaca git-rebase(1)dengan seksama.


Periksa

Jika Anda tidak peduli dengan perubahan lokal Anda, Anda dapat beralih ke cabang lain sementara (dengan paksa), dan mengubahnya kembali, misalnya

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

atur ulang

Jika Anda tidak peduli dengan perubahan lokal Anda, cobalah untuk mengatur ulang ke HEAD (kondisi asal), mis

git reset HEAD --hard

Jika di atas tidak akan membantu, itu mungkin aturan dalam file normalisasi git Anda ( .gitattributes) jadi lebih baik untuk melakukan apa yang dikatakannya. Atau sistem file Anda tidak mendukung izin, jadi Anda harus menonaktifkan filemodedi konfigurasi git Anda.

Terkait: Bagaimana cara memaksa "git pull" untuk menimpa file lokal?


1
Tidak berfungsi: Saya masih menerima pesan yang sama seperti "sembunyikan perubahan Anda terlebih dahulu". Ketika saya mengetik "git stash" dan kemudian "git pull" -> "error: Anda memiliki perubahan yang belum disimpan .. lakukan simpanan dulu". Sesaat sebelum menghancurkan komputer saya
trinity420

@ trinity420 Mungkinkah itu izin file Anda, periksa git statusperubahan apa yang Anda miliki setelah menyimpan. Jika tidak ada jawaban yang membantu, pertimbangkan untuk menambahkan pertanyaan baru.
kenorb

terima kasih tetapi masalah saya terpecahkan, mencoba semuanya di sini, tidak ada yang berhasil, lalu mengklik "komit perubahan" "bergabung" di PHPStorm dan kemudian saya melepaskan perubahan dan itu berhasil ..
trinity420


13

Jadi situasi yang saya temui adalah sebagai berikut:

galat: Perubahan lokal Anda ke file berikut akan ditimpa oleh gabungan: wp-content / w3tc-config / master.php Tolong, komit perubahan Anda atau sembunyikan sebelum Anda dapat bergabung.

kecuali, tepat sebelum itu, jauh: jadi sebenarnya ini:

remote: error: Perubahan lokal Anda ke file-file berikut akan ditimpa oleh gabungan: some / file.ext Tolong, komit perubahan Anda atau sembunyikan sebelum Anda dapat bergabung.

Apa yang terjadi adalah (saya pikir, bukan 100% positif) git post hook menerima mulai berjalan dan mengacaukan karena perubahan gerakan dalam repositori server jarak jauh, yang secara teori, seharusnya tidak disentuh.

Jadi apa yang akhirnya saya lakukan dengan menelusuri kait pasca-terima dan menemukan ini, harus pergi ke repositori jarak jauh di server, dan ada perubahan (yang tidak ada di repositori lokal saya, yang, pada kenyataannya, mengatakan bahwa itu cocok, tidak ada perubahan, tidak ada komitmen, mutakhir, dll.) Jadi sementara di lokal, tidak ada perubahan, di server, saya kemudian melakukan git checkout -- some/file.extdan kemudian repositori lokal dan jarak jauh benar-benar cocok dan saya bisa terus bekerja, dan gunakan. Tidak sepenuhnya yakin bagaimana situasi ini terjadi, meskipun beberapa pengembang ditambah perubahan IT mungkin ada hubungannya dengan itu.


2
Apakah ini pertanyaan atau jawaban?
stdcall

2
@ stdcall - Sedikit dari keduanya. Ketika saya mengalami situasi ini seperti yang dijelaskan dalam pertanyaan, inilah yang harus saya lakukan untuk memperbaikinya. Itu jelas bukan penyelesaian git yang normal, dan dari pertanyaan, sepertinya itu bisa menjadi situasi abnormal yang sama (yaitu, konfigurasi perubahan pada server, tetapi lokal tidak memiliki perubahan). Jika ada yang punya lebih banyak ide mengapa (atau bagaimana) ini terjadi, saya akan menyambut setiap wawasan.
Mike

7

PERINGATAN: Ini akan menghapus file yang tidak terlacak, jadi itu bukan jawaban yang bagus untuk pertanyaan ini.

Dalam kasus saya, saya tidak ingin menyimpan file, jadi ini bekerja untuk saya:

Git 2.11 dan yang lebih baru:

git clean  -d  -fx .

Git yang lebih tua:

git clean  -d  -fx ""

Referensi: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x berarti file yang diabaikan juga dihapus serta file yang tidak diketahui git.

  • -d berarti menghapus direktori yang tidak dilacak selain file yang tidak dilacak.

  • -f diperlukan untuk memaksanya berjalan.


4

Untuk menyimpan file Anda yang baru dibuat saat menyelesaikan masalah ini:

Jika Anda memiliki file yang baru dibuat , Anda dapat membuat tambalan perubahan lokal, menarik penggabungan jarak jauh dan menerapkan tambalan lokal Anda setelah penggabungan jauh selesai seperti yang didefinisikan langkah demi langkah di bawah ini:

  1. Tahap perubahan lokal Anda. (jangan melakukan). Pementasan diperlukan untuk membuat tambalan dari file-file baru yang dibuat (karena masih belum dilacak)

git add .

  1. Buat tambalan untuk menyimpan catatan

git diff --cached > mypatch.patch

  1. Buang perubahan lokal dan hapus file lokal baru

git reset --hard

  1. Tarik perubahan

git pull

  1. Terapkan tambalan Anda

git apply mypatch.patch

Git akan menggabungkan perubahan dan membuat file .rej untuk perubahan yang tidak digabungkan.

Seperti yang disarankan oleh Anu, jika Anda memiliki masalah menerapkan tambalan, coba:

git apply --reject --whitespace=fix mypatch.patchGit jawaban ini : tambalan tidak menerapkan pembicaraan secara detail tentang masalah ini

Nikmati pekerjaan lanjutan Anda pada fitur Anda, dan komit perubahan lokal Anda ketika selesai.


Saya ingin mendorong sebagian kode dengan perubahan baru jadi saya lakukan: 1. membuat patch dari cabang dev lokal saya 2. melakukan hard reset 3. menarik perubahan baru dari master ke dev (untuk menghindari konflik gabungan) 4 melakukan perubahan kecil di dev lokal saya 5. mendorong ke remote dev 6. menerapkan patch kembali -> Mendapat kesalahan error: patch failed: yourfile.py:33 error: yourfile.py: patch does not apply:, saya masih memiliki mypatch.patch, tetapi tidak tahu mengapa itu tidak diterapkan dan saya kehilangan perubahan saya !
Anu

Saya mengerti, perintah yang benar adalah git apply --reject --whitespace=fix mypatch.patch, saya mendapatkan perubahan saya kembali phew !!! [Terima kasih] ( stackoverflow.com/a/15375869/6484358 )
Anu

1
Anu, perintah git apply mypatch.patch benar untuk menerapkan tambalan, inilah yang saya gunakan sepanjang waktu, mungkin ada beberapa masalah dengan tambalan yang dibuat itu sendiri, dan Anda tidak akan pernah kehilangan perubahan Anda jika Anda memiliki tambalan di tangan, itu berisi semua perubahan konsolidasi.
Manpreet

2

Meminta komit sebelum menarik

  • simpanan git
  • git pull origin << branchname >>

Jika diperlukan :

  • git simpanan berlaku

1
Gunakan simpanan git ketika Anda ingin merekam keadaan saat ini dari direktori kerja dan indeks, tetapi ingin kembali ke direktori kerja yang bersih. Perintah ini menyimpan modifikasi lokal Anda dan mengembalikan direktori kerja agar sesuai dengan komit HEAD.
Pushpak Sharma

2

Bagi saya, hanya git reset --hardberhasil.

Berkomitmen bukanlah pilihan, karena tidak ada komitmen.

Menyimpan bukanlah pilihan karena tidak ada yang perlu disimpan.

Sepertinya itu bisa dari file yang dikecualikan .git/info/excludedan memiliki git update-index --assume-unchanged <file>beberapa file.


0

Dalam kasus saya, saya mencadangkan dan kemudian menghapus file yang dikeluhkan Git, dikomit, kemudian akhirnya saya bisa memeriksa cabang lain.

Saya kemudian mengganti file, menyalin kembali konten dan melanjutkan seolah-olah tidak ada yang terjadi.



0

Saya mencoba jawaban pertama: git stashdengan skor tertinggi tetapi pesan kesalahan masih muncul, dan kemudian saya menemukan artikel ini untuk melakukan perubahan alih-alih simpanan 'Reluctant Commit'

dan pesan kesalahan akhirnya hilang:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

lalu berhasil. semoga jawaban ini membantu. :)


0

Jika Anda menggunakan Git Extensions Anda seharusnya dapat menemukan perubahan lokal Anda seperti pada gambar di Working directorybawah ini:

masukkan deskripsi gambar di sini

Jika Anda tidak melihat perubahan, itu mungkin karena Anda salah sub-modul. Jadi, periksa semua item dengan ikon kapal selam seperti yang ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Ketika Anda menemukan beberapa perubahan yang tidak dikomit:

Pilih garis dengan Working directory, navigasikan ke tab Diff , Klik kanan pada baris dengan ikon pensil (atau +atau -), pilih Reset untuk pertama melakukan atau komit atau simpanan atau apa pun yang ingin Anda lakukan dengannya.


0

Bagi saya ini berhasil:

git reset --hard

lalu

git pull origin <*current branch>

setelah itu

git checkout <*branch>


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.