@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.
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?
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 ).
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
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'
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.
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.
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
rm -rf local_repo && git clone remote_url
.Jawaban:
Jika Anda ingin tarik untuk menimpa perubahan lokal, lakukan penggabungan seolah-olah pohon yang bekerja bersih, lalu bersihkan pohon yang bekerja:
Jika ada file lokal yang tidak bisa dilacak yang dapat Anda gunakan
git clean
untuk menghapusnya. Gunakangit clean -f
untuk menghapus file yang tidak dilacak,-df
untuk menghapus file dan direktori yang tidak dilacak, dan-xdf
untuk 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:
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.
sumber
git reset
file Anda masih berbeda dari jarak jauh, baca stackoverflow.com/questions/1257592/...git reset --hard
mempengaruhi 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.Bagi saya yang berikut ini berfungsi:
(1) Pertama ambil semua perubahan:
(2) Kemudian reset master:
(3) Tarik / perbarui:
sumber
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 (sepertigit reclone
ataugit sync
), juga tidak memberikan perintah seperti itu (sepertisvn recheckout
atausvn sync
).Coba perintah berikut:
sumber
git clean -fxd
menghapus file dari.gitignore
juga.Perintah di bawah tidak akan berfungsi . Jika Anda melakukannya saja:
dan seterusnya...
Untuk benar-benar memulai, mengunduh cabang dan menimpa semua perubahan lokal Anda, lakukan saja:
Ini akan bekerja dengan baik.
sumber
sumber
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.
sumber
Jika Anda menggunakan Linux:
For loop akan menghapus semua file yang dilacak yang diubah dalam repo lokal, sehingga
git pull
akan 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.
sumber
Cara terpendek untuk melakukannya adalah:
sumber
--autostash
sebelumnya, terima kasih!ini bekerja untuk saya
dengan jawaban yang diterima saya mendapatkan kesalahan konflik
sumber
Saya biasanya melakukan:
Di folder root proyek.
sumber
Ini akan mengambil cabang saat ini dan mencoba melakukan fast forward untuk menguasai:
sumber
.gitignore
"Menambahkan file yang tidak diinginkan ke .gitignore berfungsi selama Anda belum memberikannya ke cabang mana pun."
Anda juga dapat menjalankan:
https://chamindac.blogspot.com/2017/07/ignoring-visual-studio-2017-created.html
sumber