Pertanyaan Bagaimana cara memaksa "git pull" untuk menimpa file lokal?


Bagaimana cara memaksa penimpaan file lokal pada file git pull?

Skenarionya adalah sebagai berikut:

  • Seorang anggota tim sedang memodifikasi templat untuk situs web yang kami kerjakan
  • Mereka menambahkan beberapa gambar ke direktori gambar (tetapi lupa untuk menambahkannya di bawah kontrol sumber)
  • Mereka mengirim gambar melalui surat, nanti, kepada saya
  • Saya menambahkan gambar di bawah kontrol sumber dan mendorongnya ke GitHub bersama dengan perubahan lainnya
  • Mereka tidak dapat menarik pembaruan dari GitHub karena Git tidak ingin menimpa file mereka.

Ini adalah kesalahan yang saya dapatkan:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

Bagaimana cara memaksa Git untuk menimpanya? Orang tersebut adalah seorang desainer - biasanya saya menyelesaikan semua konflik dengan tangan, sehingga server memiliki versi terbaru yang hanya perlu mereka perbarui di komputer mereka.


5198
2017-07-14 14:58


asal


Jawaban:


Penting: Jika Anda memiliki perubahan lokal, mereka akan hilang. Dengan atau tanpa --hard pilihan, semua komit lokal yang tidak didorong akan hilang.[*]

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


Saya pikir ini adalah cara yang benar:

git fetch --all

Kemudian, Anda memiliki dua opsi:

git reset --hard origin/master

ATAU Jika Anda berada di beberapa cabang lain:

git reset --hard origin/<branch_name>

Penjelasan:

git fetch unduh yang terbaru dari jauh tanpa mencoba menggabungkan atau me-rebase apa pun.

Maka itu git reset menyetel ulang cabang master ke apa yang baru saja Anda ambil. Itu --hard opsi mengubah semua file di pohon kerja Anda untuk dicocokkan dengan file origin/master


Mempertahankan komitmen lokal saat ini

[*]: Perlu dicatat bahwa memungkinkan untuk mempertahankan komitmen lokal saat ini dengan membuat cabang dari master sebelum mengatur ulang:

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

Setelah ini, semua komitmen lama akan disimpan new-branch-to-save-current-commits.

Perubahan tidak berkomitmen

Perubahan yang tidak berkomitmen, namun (bahkan dipentaskan), akan hilang. Pastikan untuk menyimpan dan melakukan apa pun yang Anda butuhkan. Untuk itu Anda bisa menjalankan yang berikut:

git stash

Dan kemudian untuk menerapkan kembali perubahan yang tidak terikat ini:

git stash pop

7275
2018-01-17 00:02



Coba ini:

git reset --hard HEAD
git pull

Ia harus melakukan apa yang Anda inginkan.


761
2018-05-09 19:45



PERINGATAN: git clean menghapus semua file / direktori yang tidak terlacak dan tidak dapat diurungkan.


Terkadang adil clean -f tidak membantu. Jika Anda memiliki DIRECTORIES yang tidak terlacak, -d opsi juga diperlukan:

git reset --hard HEAD
git clean -f -d
git pull

PERINGATAN: git clean menghapus semua file / direktori yang tidak terlacak dan tidak dapat diurungkan.


381
2018-03-19 09:10



Seperti Hedgehog, saya pikir jawabannya mengerikan. Tetapi meskipun jawaban Hedgehog mungkin lebih baik, saya tidak berpikir itu seunik mungkin. Cara yang saya temukan untuk melakukan ini adalah dengan menggunakan "fetch" dan "merge" dengan strategi yang ditentukan. Yang harus membuatnya agar perubahan lokal Anda dipertahankan selama mereka bukan salah satu dari file yang Anda coba paksa timpa.

Pertama lakukan komitmen dari perubahan Anda

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

Kemudian ambil perubahan dan timpa jika ada konflik

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"-X" adalah nama opsi, dan "mereka" adalah nilai untuk opsi itu. Anda memilih untuk menggunakan "mereka" perubahan, bukan "Anda" berubah jika ada konflik.


334
2018-04-11 20:13



Daripada melakukan:

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

Saya menyarankan melakukan hal berikut:

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

Tidak perlu mengambil semua remote dan cabang jika Anda akan me-reset ke cabang asal / master kan?


237
2018-04-26 13:48



Sepertinya cara terbaik adalah melakukan yang pertama:

git clean

Untuk menghapus semua file yang tidak terlacak dan kemudian lanjutkan dengan yang biasa git pull...


121
2017-07-14 15:16



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

Beberapa jawaban tampaknya mengerikan. Mengerikan dalam arti apa yang terjadi pada @Lauri dengan mengikuti saran David Avsajanishvili.

Sebaliknya (git> v1.7.6):

git stash --include-untracked
git pull

Nanti Anda bisa membersihkan sejarah simpanan.

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}

Brutally, all-at-once:

$ git stash clear

Tentu saja jika Anda ingin kembali ke apa yang Anda simpan:

$ git stash list
...
$ git stash apply stash@{5}

97
2018-02-11 23:00



Anda mungkin menemukan bahwa perintah ini membantu membuang perubahan lokal:

git checkout <your-branch> -f

Kemudian lakukan pembersihan (menghapus file yang tidak terlacak dari pohon kerja):

git clean -f

Jika Anda ingin menghapus direktori yang tidak terlacak selain file yang tidak terlacak:

git clean -fd

86
2017-08-05 18:06



Daripada bergabung dengan git pull, coba ini:

git fetch --all

diikuti oleh:

git reset --hard origin/master.


72
2017-11-22 10:56



Satu-satunya hal yang berhasil bagi saya adalah:

git reset --hard HEAD~5

Ini akan membawa Anda kembali lima commit dan kemudian dengan

git pull

Saya menemukan itu dengan melihat ke atas cara membatalkan penggabungan Git.


51
2018-05-05 21:53



Masalah dengan semua solusi ini adalah bahwa mereka semua terlalu kompleks, atau, masalah yang lebih besar, adalah bahwa mereka menghapus semua file yang tidak terlacak dari server web, yang tidak kita inginkan karena selalu ada file konfigurasi yang diperlukan yang ada di server dan bukan di repositori Git.

Berikut ini solusi terbersih yang kami gunakan:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Perintah pertama menjemput data terbaru.

  • Perintah kedua memeriksa apakah ada file yang ditambahkan ke repositori dan menghapus file-file yang tidak terlacak dari repositori lokal yang akan menyebabkan konflik.

  • Perintah ketiga memeriksa semua file yang dimodifikasi secara lokal.

  • Akhirnya kami melakukan tarik untuk memperbarui ke versi terbaru, tetapi kali ini tanpa konflik apa pun, karena file yang tidak terlacak yang ada di repo tidak ada lagi dan semua file yang dimodifikasi secara lokal sudah sama dengan di repositori.


50
2017-11-05 23:32