it-swarm-id.com

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

Bagaimana cara memaksa menimpa file lokal pada git pull?

Skenarionya adalah sebagai berikut:

  • Anggota tim memodifikasi templat untuk situs web yang sedang kami kerjakan
  • Mereka menambahkan beberapa gambar ke direktori gambar (tetapi lupa menambahkannya di bawah kendali sumber)
  • Mereka mengirim gambar melalui pos, nanti, ke 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 kesalahan yang saya dapatkan:

kesalahan: File pohon yang tidak dapat dilacak 'publik/images/icon.gif' akan ditimpa oleh gabungan

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

5771
Jakub Troszok

Penting: Jika Anda memiliki perubahan lokal, itu akan hilang. Dengan atau tanpa opsi --hard, komit lokal apa pun yang belum didorong akan hilang.[*]

Jika Anda memiliki file yang bukan dilacak oleh Git (mis. 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 cabang lain:

git reset --hard Origin/<branch_name>

Penjelasan:

git fetch mengunduh yang terbaru dari jarak jauh tanpa mencoba menggabungkan atau mengubah apa pun.

Kemudian git reset mereset cabang master ke apa yang baru saja Anda ambil. Opsi --hard mengubah semua file di pohon kerja Anda agar sesuai dengan file di Origin/master


Pertahankan komitmen lokal saat ini

[*]: Perlu dicatat bahwa dimungkinkan 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 di new-branch-to-save-current-commits

Perubahan tidak dikomit

Namun, perubahan yang tidak dikomit (bahkan dipentaskan), akan hilang. Pastikan untuk menyimpan dan melakukan apa pun yang Anda butuhkan. Untuk itu Anda dapat menjalankan yang berikut ini:

git stash

Dan kemudian menerapkan kembali perubahan yang tidak dikomit ini:

git stash pop
8139
RNA

Coba ini:

git reset --hard HEAD
git pull

Itu harus melakukan apa yang Anda inginkan.

808
Travis Reeder

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


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

# WARNING: this can't be undone!

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

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

Pertimbangkan untuk menggunakan flag -n (--dry-run) terlebih dahulu. 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
...
409

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

Pertama, lakukan komitmen terhadap 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 "milik mereka" adalah nilai untuk opsi itu. Anda memilih untuk menggunakan perubahan "mereka", alih-alih perubahan "Anda" jika ada konflik.

347
Richard Kersey

Alih-alih 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 mengatur ulang ke Origin/master cabang kan?

251
Johanneke

Peringatan, melakukan ini akan menghapus file Anda secara permanen jika Anda memiliki direktori/* entri dalam 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 simpanan sejarah.

Secara manual, satu per satu:

$ git stash list
[email protected]{0}: WIP on <branch>: ...
[email protected]{1}: WIP on <branch>: ...

$ git stash drop [email protected]{0}
$ git stash drop [email protected]{1}

Brutal, sekaligus:

$ git stash clear

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

$ git stash list
...
$ git stash apply [email protected]{5}
102
Hedgehog

Anda mungkin menemukan perintah ini berguna untuk membuang perubahan lokal:

git checkout <your-branch> -f

Dan kemudian lakukan pembersihan (menghapus file yang tidak terlacak dari pohon yang berfungsi):

git clean -f

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

git clean -fd
88
Vishal

Alih-alih bergabung dengan git pull, coba ini: 

git fetch --all

diikuti oleh:

git reset --hard Origin/master.

82
Lloyd Moore

Satu-satunya hal yang berhasil bagi saya adalah:

git reset --hard HEAD~5

Ini akan membawa Anda kembali lima komit dan kemudian dengan

git pull

Saya menemukan bahwa dengan mencari cara membatalkan gabungan Git .

55
Chris BIllante

Masalah dengan semua solusi ini adalah mereka semua terlalu kompleks, atau, masalah yang lebih besar, adalah 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 adalah 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 mengambil data terbaru.

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

  • Perintah ketiga memeriksa semua file yang dimodifikasi secara lokal.

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

51

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

Saya menyelesaikannya dengan:

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

Sekarang berhasil.

39

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 hilangnya data/file hanya jika Anda tidak membuatnya! Jika Anda tidak yakin, buat cadangan terlebih dahulu dari seluruh folder repositori Anda.

Kemudian tarik lagi.

Jika di atas tidak membantu dan Anda tidak peduli dengan file/direktori yang tidak dilacak (buat cadangan terlebih dahulu untuk berjaga-jaga), coba langkah-langkah sederhana berikut:

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 (pengecualian .git/ dir, di mana Anda memiliki semua komit) dan tarik lagi.


Mengapa git reset HEAD --hard bisa gagal dalam beberapa kasus?

  1. Aturan khusus di .gitattributes file

    Memiliki aturan eol=lf di .gitattributes dapat menyebabkan git memodifikasi beberapa perubahan file dengan mengonversi akhir baris CRLF menjadi LF di beberapa file teks.

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

  2. Ketidakmampuan sistem file

    Ketika Anda menggunakan sistem file yang tidak mendukung atribut izin . Misalnya Anda memiliki dua repositori, satu di Linux/Mac (ext3/hfs+) dan satu lagi pada 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 ulang izin file pada sistem yang tidak mendukung izin semacam itu, jadi tidak peduli seberapa --hard Anda mencoba, git selalu mendeteksi beberapa "perubahan".

34
kenorb

Bonus:

Dalam berbicara tentang menarik/mengambil/menggabungkan jawaban sebelumnya, saya ingin berbagi trik yang menarik dan produktif,

git pull --rebase

Perintah di atas adalah perintah yang paling berguna dalam hidup Git saya yang menghemat banyak waktu.

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

Temukan detail di Apa yang dilakukan "git pull --rebase"?.

33

Saya punya masalah serupa. Saya harus melakukan ini:

git reset --hard HEAD
git clean -f
git pull
27
Ryan

Saya merangkum jawaban lain. Anda dapat menjalankan 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 kehilangan perubahan.

27
Robert Moon

Berdasarkan pengalaman saya yang serupa, solusi yang ditawarkan oleh Strahinja Kustudic di atas sejauh ini adalah yang terbaik. Seperti yang telah ditunjukkan oleh orang lain, hanya melakukan hard reset akan menghapus semua file yang tidak bisa ditelusur yang dapat mencakup banyak hal yang tidak ingin Anda hapus, seperti file konfigurasi. Yang lebih aman, adalah hanya menghapus file yang akan ditambahkan, dan dalam hal ini, Anda mungkin juga ingin checkout file yang dimodifikasi secara lokal yang akan diperbarui.

Itu dalam pikiran, saya memperbarui skrip Kustudic untuk melakukan hal itu. Saya juga memperbaiki kesalahan ketik (yang hilang 'di aslinya).

#/bin/sh

# 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
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..Origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull
26
Rolf Kaiser

Saya percaya ada dua kemungkinan penyebab konflik, yang harus diselesaikan secara terpisah, dan sejauh yang saya bisa katakan, tidak ada jawaban di atas yang membahas keduanya:

  • File lokal yang tidak terlacak perlu dihapus, baik secara manual (lebih aman) atau seperti yang disarankan dalam jawaban lain, oleh git clean -f -d

  • Komit lokal yang tidak ada di cabang jarak jauh perlu dihapus juga. IMO cara termudah untuk mencapai ini adalah dengan: git reset --hard Origin/master (ganti 'master' dengan cabang apa pun yang sedang Anda kerjakan, dan jalankan git fetch Origin terlebih dahulu)

23
tiho

Cara yang lebih mudah adalah:

git checkout --theirs /path/to/file.extension
git pull Origin master

Ini akan menimpa file lokal Anda dengan file pada git

20
maximus 69

Sepertinya sebagian besar jawaban di sini difokuskan pada cabang master; Namun, ada saat-saat ketika saya mengerjakan cabang fitur yang sama di dua tempat yang berbeda dan saya ingin rebase di salah satu tercermin di yang lain tanpa banyak melompat melalui lingkaran.

Berdasarkan kombinasi dari jawaban RNA dan jawaban torek untuk pertanyaan yang sama , Saya telah menemukan ini yang bekerja sangat baik:

git fetch
git reset --hard @{u}

Jalankan ini dari cabang dan itu hanya akan mereset cabang lokal Anda ke versi hulu.

Ini bisa dimasukkan ke alias git (git forcepull) dengan baik:

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Atau, dalam file .gitconfig Anda:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

Nikmati!

20
JacobEvelyn

Saya memiliki masalah yang sama dan untuk beberapa alasan, bahkan git clean -f -d tidak akan melakukannya. Inilah alasannya: Untuk beberapa alasan, jika file Anda diabaikan oleh Git (melalui entri .gitignore, saya berasumsi), itu masih mengganggu tentang menimpa ini dengan pull selanjutnya, tetapi clean tidak akan hapus, kecuali jika Anda menambahkan -x.

19
Tierlieb

Saya baru saja menyelesaikan ini sendiri dengan:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

di mana perintah terakhir memberikan daftar perubahan lokal Anda. Terus modifikasi cabang "tmp" hingga diterima dan kemudian gabungkan kembali ke master dengan: 

git checkout master && git merge tmp

Untuk waktu berikutnya, Anda mungkin dapat menangani ini dengan cara yang lebih bersih dengan mencari "git stash branch" meskipun simpanan kemungkinan akan menyebabkan masalah pada beberapa percobaan pertama, jadi lakukan percobaan pertama pada proyek yang tidak penting ...

18
Simon B.

Saya memiliki situasi aneh yang tidak dapat digunakan git clean atau git reset. Saya harus menghapus file yang bertentangan dari git index dengan menggunakan skrip berikut pada setiap file yang tidak dilacak:

git rm [file]

Maka saya bisa menarik dengan baik.

17
Chen Zhang

Saya tahu metode yang jauh lebih mudah dan tidak menyakitkan:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

Itu dia!

16
ddmytrenko

Keempat perintah ini bekerja untuk saya.

git reset --hard HEAD
git checkout Origin/master
git branch -D master
git checkout -b master

Untuk memeriksa/menarik setelah menjalankan perintah ini

git pull Origin master

Saya mencoba banyak tetapi akhirnya berhasil dengan perintah ini.

13
vishesh chandra

Kerjakan saja

git fetch Origin branchname
git checkout -f Origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge Origin/branchname

Jadi Anda menghindari semua efek samping yang tidak diinginkan, seperti menghapus file atau direktori yang ingin Anda simpan, dll.

12
user2696128

Terlepas dari pertanyaan awal, jawaban teratas dapat menyebabkan masalah bagi orang-orang yang memiliki masalah serupa, tetapi tidak ingin kehilangan file lokal mereka. Misalnya, lihat komentar Al-Punk dan crizCraig. 

Versi berikut melakukan perubahan lokal Anda ke cabang sementara (tmp), periksa cabang asli (yang saya asumsikan master) dan menggabungkan pembaruan. Anda dapat melakukan ini dengan stash, tetapi saya telah menemukan bahwa biasanya lebih mudah menggunakan pendekatan cabang/gabungan.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

git fetch Origin master
git merge -s recursive -X theirs Origin master

di mana kita mengasumsikan repositori lain adalah Origin master.

12
Snowcrash

Setel ulang indeks dan kepala ke Origin/master, tetapi jangan reset pohon kerja:

git reset Origin/master
11
user811773

Persyaratan:

  1. Lacak perubahan lokal sehingga tidak ada seorang pun di sini yang pernah kehilangan mereka.
  2. Buat repositori lokal cocok dengan repositori Origin yang jauh.

Larutan:

  1. Stash perubahan lokal.
  2. Ambil dengan clean dari file dan direktori mengabaikan .gitignore dan hard reset ke Asal .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard Origin/master
    
9
vezenkov

Saya membaca semua jawaban tetapi saya sedang mencari satu perintah untuk melakukan ini. Inilah yang saya lakukan. Menambahkan alias git ke .gitconfig

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

Jalankan perintah Anda sebagai 

git fp Origin master

setara dengan

git fetch Origin master
git reset --hard Origin/master
9
Venkat Kotra

Jangan gunakan git reset --hard. Itu akan menghapus perubahan mereka yang mungkin benar-benar tidak diinginkan. Sebagai gantinya:

git pull
git reset Origin/master
git checkout <file1> <file2> ...

Anda tentu saja dapat menggunakan git fetch bukan git pull karena jelas tidak akan bergabung, tetapi jika Anda biasanya menarik, masuk akal untuk terus menarik di sini.

Jadi yang terjadi di sini adalah bahwa git pull memperbarui Origin/master reference Anda ; git reset memperbarui referensi cabang lokal Anda aktif menjadi sama dengan Asal/master tanpa memperbarui file apa pun, sehingga status check-out Anda tidak berubah; lalu git checkout mengembalikan file ke status indeks cabang lokal Anda sesuai kebutuhan. Dalam kasus di mana file yang sama persis telah ditambahkan di master langsung dan di atas, indeks sudah cocok dengan file setelah reset, jadi dalam kasus umum Anda tidak perlu melakukan git checkout sama sekali.

Jika cabang hulu juga berisi komit yang ingin Anda terapkan secara otomatis, Anda dapat mengikuti variasi halus pada proses:

git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
8
Jim Driscoll

Ini adalah praktik terbaik untuk mengembalikan perubahan:

  • git commit Komit perubahan bertahap Anda agar disimpan di reflog (lihat di bawah)
  • git fetch Ambil perubahan hulu terbaru
  • git reset --hard Origin/master Hard reset ke cabang master Asal

reflogmencatat cabang dan referensi lainnya sedang diperbarui di repositori lokal. Atau sederhananya - reflog adalah riwayat perubahan Anda.

Jadi selalu merupakan praktik yang baik untuk berkomitmen. Komit ditambahkan ke reflog yang memastikan Anda akan selalu memiliki cara untuk mengambil kode yang dihapus.

7
Jordan Georgiev

Saya menggunakan perintah ini untuk menyingkirkan file lokal yang mencegah saya melakukan tarikan/penggabungan. Tetapi berhati-hatilah! Jalankan git merge … terlebih dahulu untuk melihat apakah hanya ada file yang benar-benar ingin Anda hapus.

git merge Origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
  • git merge mencantumkan antara lain semua file itu. Mereka diawali oleh beberapa ruang putih.
  • 2>&1 >/dev/null mengarahkan output kesalahan ke standar sehingga diambil oleh grep.
  • grep ^[[:space:]] hanya menyaring baris dengan nama file.
  • sed s/^[[:space:]]//g memotong ruang putih dari awal.
  • xargs -L1 rm memanggil rm pada masing-masing file tersebut, menghapusnya.

Tangani dengan hati-hati: Apapun output git merge, rm akan dipanggil untuk setiap baris yang dimulai dengan spasi putih.

5
Glutexo

Saya mencoba menggunakan cabang Material2 pada Angular2-Webpack-Starter dan bersenang-senang. Ini adalah satu-satunya cara saya dapat mengunduh dan menggunakan cabang itu.

git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git

cd angular2-webpack-starter/

git checkout -b material2

Buka folder proyek dan hapus semua file dan folder yang tidak disembunyikan. Tinggalkan semua yang tersembunyi.

git add .

git commit -m "pokemon go"

git reset --hard

git pull Origin material2

(Saat editor muncul, tekan ': wq', lalu tekan Enter)

Sekarang kamu sudah siap.

5
Helzgate

Di Windows, lakukan perintah tunggal ini:

git fetch --all & git reset --hard Origin/master
3
Luca C.

Anda bisa mengabaikan file itu dengan file di folder basis proyek Anda:

.gitignore

public/images/*

Kemudian tarik perubahan dan kemudian hapus baris itu dari file gitignore Anda.

3
Daniel Gaytán

git fetch --all && git reset --hard Origin/master && git pull

1
Suge

1: Setel ulang ke komit sebelumnya

git reset --hard HEAD

2: Hapus File Tidak Dilacak

git clean -f

3: Tarik komit

git pull

Sumber:

0
abhijithvijayan

jika Anda ingin mengatur ulang ke cabang pelacakan jarak jauh dengan cara umum gunakan:

git fetch
git reset --keep Origin/$(git rev-parse --abbrev-ref HEAD)

jika Anda ingin mengatur ulang perubahan lokal Anda juga:

git fetch
git reset --hard Origin/$(git rev-parse --abbrev-ref HEAD)
0
warch