Git Pull Saat Mengabaikan Perubahan Lokal?

489

Apakah ada cara untuk melakukan git pullitu yang mengabaikan perubahan file lokal tanpa membuang direktori dan harus melakukan git clone?

markdorison
sumber
17
Maksud Anda "mengabaikan", maksud Anda "menimpa"?
Cascabel
@Cascabel Berarti mengembalikan semua perubahan lokal, membatalkan semua komitmen lokal, menghapus semua file dan direktori lokal baru, membatalkan penghapusan semua file dan direktori yang dihapus secara lokal, dll. Singkatnya, jalankan perintah seolah-olah rm -rf local_repo && git clone remote_url.
Victor

Jawaban:

820

Jika Anda ingin tarik untuk menimpa perubahan lokal, lakukan penggabungan seolah-olah pohon yang bekerja bersih, lalu bersihkan pohon yang bekerja:

git reset --hard
git pull

Jika ada file lokal yang tidak bisa dilacak yang dapat Anda gunakan git cleanuntuk menghapusnya. Gunakan git clean -funtuk menghapus file yang tidak dilacak, -dfuntuk menghapus file dan direktori yang tidak dilacak, dan -xdfuntuk menghapus file atau direktori yang tidak dilacak atau diabaikan.

Jika di sisi lain Anda ingin menyimpan modifikasi lokal, Anda harus menggunakan simpanan untuk menyembunyikannya sebelum menarik, lalu menerapkannya kembali setelahnya:

git stash
git pull
git stash pop

Saya tidak berpikir masuk akal untuk benar - benar mengabaikan perubahan, meskipun - setengah dari tarik adalah penggabungan, dan itu perlu menggabungkan versi konten yang dilakukan dengan versi yang diambil.

Cascabel
sumber
4
Jika setelah git resetfile Anda masih berbeda dari jarak jauh, baca stackoverflow.com/questions/1257592/...
Kolonel Panic
3
Git adalah hal teraneh yang pernah ada. Setel ulang Git - setelah selesai. Kemudian status git: Cabang Anda unggul 2 komit.
Shailen
21
@shailenTJ "Perubahan lokal" di sini berarti perubahan yang tidak dikomit, bukan komitmen lokal. git reset --hardmempengaruhi yang pertama, bukan yang terakhir. Jika Anda ingin mengatur ulang sepenuhnya ke kondisi jarak jauh, git reset --hard origin/<branch>- tetapi sering dan dalam kasus ini, kedua komitmen yang Anda lakukan sebelumnya adalah pekerjaan yang Anda lakukan, bukan sesuatu yang ingin Anda buang.
Cascabel
2
Jadi ini adalah hal yang sama dengan menghancurkan repositori lokal dan mengunduh ulang, kan? Saya hanya ingin dapat memaksa perubahan dan menimpa perubahan untuk kenyamanan. 99% dari waktu saya mendapatkan pesan kesalahan ini ketika saya secara tidak sengaja mengacaukan sesuatu secara lokal dan hanya ingin memulai dari repo.
sudo
Bagaimana jika Anda tidak mungkin tidak memiliki perubahan lokal vs kepala? Misalnya repo dibuat pada sistem file case sensitif dan dikloning pada sistem file case sensitif dan ada 2 file dengan casing yang sama nama yang berbeda?
xster
305

Bagi saya yang berikut ini berfungsi:

(1) Pertama ambil semua perubahan:

$ git fetch --all

(2) Kemudian reset master:

$ git reset --hard origin/master

(3) Tarik / perbarui:

$ git pull
Artur Barseghyan
sumber
22
Bekerja dengan baik untuk saya ketika mengalami banyak masalah dengan jawaban teratas. Terima kasih!
0x0
6
ini bahkan berfungsi ketika kamu telah melakukan perubahan lokal, tetapi kamu masih ingin mengembalikan
agsachin
16
Ini harus menjadi jawaban teratas :)
Purus
5
@Marco Servetto: Anda pertama-tama mengambil semua perubahan git Anda, tetapi belum menerapkannya. Kemudian Anda mengatur ulang master ke status terakhir (diperbarui). Jika Anda melewati langkah pertama, Anda akan mengembalikan perubahan ke master lama (lokal). Dari pengalaman saya, cara saya menggambarkannya, tidak pernah menyebabkan masalah. Semua upaya lain dilakukan pada akhirnya.
Artur Barseghyan
1
Ini bekerja untuk saya, saya ingin mengabaikan semua perubahan lokal saya termasuk memulihkan file yang dihapus
Neri
28

Anda hanya ingin perintah yang memberikan hasil yang sama persis rm -rf local_repo && git clone remote_url, kan? Saya juga menginginkan fitur ini. Saya bertanya-tanya mengapa git tidak menyediakan perintah seperti itu (seperti git recloneatau git sync), juga tidak memberikan perintah seperti itu (seperti svn recheckoutatausvn sync ).

Coba perintah berikut:

git reset --hard origin/master
git clean -fxd
git pull
Pemenang
sumber
Itu yang benar-benar berfungsi, bahkan ketika Anda sudah memiliki commit lokal yang ingin Anda hapus.
Yuri Ghensev
5
Peringatan guys !! git clean -fxdmenghapus file dari .gitignorejuga.
Ramesh Navi
@ RameshNavi Tentu. Inilah yang diinginkan. Yang diinginkan adalah memiliki cara yang lebih cepat untuk mengkloning ulang, yaitu menghapus seluruh repo lokal dan kemudian mengkloningnya.
Victor
27

Perintah di bawah tidak akan berfungsi . Jika Anda melakukannya saja:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

dan seterusnya...

Untuk benar-benar memulai, mengunduh cabang dan menimpa semua perubahan lokal Anda, lakukan saja:


$ git checkout thebranch
$ git reset --hard origin/thebranch

Ini akan bekerja dengan baik.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'
Dr Beco
sumber
4
IYA. Inilah yang saya butuhkan untuk pendekatan "jangan beri F tentang apa yang lokal". Terima kasih. :)
Adambean
10
git fetch --all && git reset --hard origin/master
Luca C.
sumber
8

Lihatlah git stash untuk meletakkan semua perubahan lokal Anda menjadi "file simpanan" dan kembali ke komit terakhir. Pada titik itu, Anda dapat menerapkan perubahan simpanan Anda, atau membuangnya.

Seth Johnson
sumber
8

Jika Anda menggunakan Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

For loop akan menghapus semua file yang dilacak yang diubah dalam repo lokal, sehingga git pullakan berfungsi tanpa masalah.
Hal terbaik tentang ini adalah bahwa hanya file yang dilacak yang akan ditimpa oleh file dalam repo, semua file lain akan dibiarkan tidak tersentuh.

Strahinja Kustudic
sumber
Saya pikir Anda berarti "file terlacak" yang persis apa yang saya butuhkan, terima kasih.
Ali
ada yang setara untuk Powershell?
Earlee
8

Cara terpendek untuk melakukannya adalah:

git pull --rebase --autostash
gil
sumber
tidak tahu tentang --autostashsebelumnya, terima kasih!
shiro
7

ini bekerja untuk saya

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

dengan jawaban yang diterima saya mendapatkan kesalahan konflik

Pablo Pazos
sumber
Itu sangat mirip dengan jawaban Artur Barseghyan 2015 ... tapi saya masih ingin tahu apa tujuan dari perintah ke-3: file yang bekerja telah berubah setelah perintah ke-2, dan perintah ke-3 mengatakan "Sudah up to date "
mike rodent
itu adalah satu-satunya kombinasi yang bekerja pada lingkungan saya, mungkin Anda melihat hal yang berbeda, bagi saya, saya memerlukan tiga perintah
Pablo Pazos
Menarik. Mungkin menjadi versi hal. Saya di git 2.7.4. Tapi saya juga baru saja melihat komentar baru dari Artur Barseghyan: "Kalau tidak, Anda mungkin menemukan diri Anda bekerja pada tuan yang sudah ketinggalan zaman."
mike rodent
mungkin, tetapi satu-satunya hal yang dapat saya katakan adalah "ini bekerja untuk saya ketika tidak ada solusi lain yang melakukannya", sehingga mungkin membantu orang lain
Pablo Pazos
3

Saya biasanya melakukan:

git checkout .
git pull

Di folder root proyek.

Cassiano Franco
sumber
2

Ini akan mengambil cabang saat ini dan mencoba melakukan fast forward untuk menguasai:

git fetch && git merge --ff-only origin/master
Petah
sumber