Reset keras satu file


1006

Saat ini saya memiliki tiga file yang dimodifikasi di direktori kerja saya. Namun saya ingin salah satu dari mereka diatur ulang ke status HEAD.

Di SVN, saya akan menggunakan svn revert <filename>(diikuti svn update <filename>jika diperlukan) tetapi di Git saya harus menggunakan git reset --hard. Namun perintah ini tidak dapat beroperasi pada satu file.

Apakah ada cara di Git untuk membuang perubahan pada satu file dan menimpanya dengan salinan KEPALA baru?


3
git checkoutdi bawah ini jawabannya. Di git, "revert" adalah sesuatu yang Anda lakukan untuk komit. "Kembalikan" memutar balik kebalikan komit historis ke direktori kerja Anda, sehingga Anda dapat membuat komit baru yang "membatalkan" komit yang dikembalikan. Saya menemukan ini adalah titik sering kebingungan bagi orang-orang yang datang ke git dari svn.
Dan Ray


Jika Anda tertarik mengapa Anda tidak bisa melakukan hard reset dengan jalur, periksa jawaban saya di sana .
pengguna

Pertanyaan ini mengasumsikan, bahwa orang tahu apa itu Hard reset.

Jawaban:


1811

Anda dapat menggunakan perintah berikut:

git checkout HEAD -- my-file.txt

... yang akan memperbarui copy pekerjaan my-file.txtdan statusnya dalam indeks dengan yang dari HEAD.

--pada dasarnya berarti: perlakukan setiap argumen setelah titik ini sebagai nama file . Lebih detail dalam jawaban ini . Terima kasih kepada VonC untuk menunjukkan ini.


58
Jawaban yang lebih lengkap. +1;) Untuk '-', lihat juga stackoverflow.com/questions/6561142/… (dan, lebih umum, stackoverflow.com/questions/1192180/… )
VonC

8
Juga, jangan lupa Anda bisa merujuk komit sebelumnya dengan HEAD~1untuk menunjukkan komit kedua dari belakang.
Ryanmt

14
Anda dapat meninggalkan HEADjika Anda berada di kepala cabang saat ini - lihat norbauer.com/rails-consulting/notes/…
cxw

4
Adakah wawasan mengapa resetperintah (seperti yang tertulis) "tidak dapat melakukan hard reset dengan paths", dan kemudian mengapa checkoutperintah tersebut tidak (tidak bisa?) Digunakan untuk mengatur ulang seluruh set dengan susah payah? (Maksud saya mengapa itu dirancang demikian.)
Sz.

1
@cxw Sayangnya, ini tidak sepenuhnya benar. Dari halaman manual git checkout: "Timpa jalur di pohon yang berfungsi dengan mengganti dengan isi dalam indeks atau di <tree-ish>". Yaitu jika <tree-ish>dihilangkan, konten apa pun dalam indeks akan digunakan untuk memperbarui pohon kerja. Ini mungkin atau mungkin tidak berbeda dari KEPALA.
tuntap

137

Setel ulang ke kepala:

Untuk mengatur ulang satu file ke HEAD:

git checkout @ -- myfile.ext

Perhatikan bahwa @kependekan dari HEAD. Versi git yang lebih lama mungkin tidak mendukung formulir singkat.

Setel ulang ke indeks:

Untuk mengatur ulang satu file ke indeks , dengan asumsi indeks tidak kosong, jika tidak maka KEPALA:

git checkout -- myfile.ext

Intinya adalah agar aman, Anda tidak ingin meninggalkan @atau HEADdari perintah kecuali Anda secara khusus bermaksud mengatur ulang ke indeks saja.


1
Ada apa dengan "-" sebelum myfile.ext?
Lance Kind

3
@ LanceKind Seperti yang saya pahami, itu digunakan untuk membatasi daftar nama file yang mengikutinya. Tanpa itu, ada beberapa kasus ketika git mengartikan argumen secara salah.
Acumenus

2
Bukan hanya nama file. Konvensi yang banyak digunakan memisahkan opsi dari argumen posisi di banyak utilitas. Lihat man bashhalaman. Juga disebutkan dalam jawaban ini: unix.stackexchange.com/a/187548/142855
boweeb

1
Secara konvensional, --ini digunakan untuk memberi tahu program I've finished specifying "options", and from here on, everything will be a positional argument.. Secara konvensional, "opsi" adalah token seperti --recursiveyang dapat muncul dalam urutan apa pun, atau bahkan digabungkan bersama dalam bentuk singkatnya, seperti dengan rm -rf. Sebaliknya, "argumen posisional" jauh lebih mirip dengan argumen yang dilewatkan ke fungsi dalam bahasa pemrograman: posisi mereka dalam daftar token menentukan apa yang sebenarnya akan dilakukan program dengan mereka (ini sering nama file). --menghilangkan ambiguitas tentang yang mana.
iono

42

Untuk kembali ke hulu / master lakukan:

git checkout upstream/master -- myfile.txt

19

Sejak Git 2.23 (Agustus 2019) Anda dapat menggunakan restore( info lebih lanjut ):

git restore pathTo/MyFile

Di atas akan mengembalikan MyFilepada HEAD(komit terakhir) pada cabang saat ini.

Jika Anda ingin mendapatkan perubahan dari komit lain, Anda bisa mundur pada komit sejarah. Perintah di bawah ini akan mendapatkan MyFiledua komit sebelum yang terakhir. Anda sekarang memerlukan opsi -s( --source) karena sekarang Anda menggunakan master~2dan bukan master(default) saat Anda memulihkan sumber:

git restore -s master~2 pathTo/MyFile

Anda juga bisa mendapatkan file dari cabang lain!

git restore -s my-feature-branch pathTo/MyFile

1
Cara termudah sejauh ini. Sayangnya jawaban ini tidak mendapat perhatian yang cukup.
singrium


4

Anda dapat menggunakan perintah di bawah ini untuk mengatur ulang satu file

git checkout HEAD -- path_to_file/file_name

Daftar semua file yang diubah untuk mendapatkan path_to_file/filenamedengan perintah di bawah ini

git status

1

Anda dapat menggunakan perintah berikut:

git reset -- my-file.txt

yang akan memperbarui copy pekerjaan my-file.txtsaat ditambahkan.


Tidak mengubah konten file yang dimodifikasi, seperti yang diminta.
Rafael

Ketika Anda menambah simpanan Apakah Anda mengedit file?
ADDYQU

1
Itu bukan titik @ADDQU. Pertanyaannya adalah bagaimana "mengatur ulang" file, bukan untuk menghapusnya dari daftar bertahap.
Rafael

@ Rafael Anda benar, tetapi saya ingin memberi tahu Anda bahwa ada jalan juga.
ADDYQU

0

Anda dapat menggunakan perintah berikut:

git checkout filename

Jika Anda memiliki cabang dengan nama file yang sama Anda harus menggunakan perintah ini:

git checkout -- filename

1
Ini tidak akan "mengatur ulang keras" file - hanya menyalin status indeks ke pohon kerja. "Hard reset" pertama-tama akan mengatur ulang indeks.
AH

-21

Cara sederhana, mudah, langsung, untuk mengeluarkan Anda dari air panas, terutama jika Anda tidak begitu nyaman dengan git:

  1. Lihat log file Anda

    git login myFile.js

    commit 1023057173029091u23f01w276931f7f42595f84f Penulis: kmiklas Tanggal: Sel 7 Agu 09:29:34 2018 -0400

    JIRA-12345 - Refactor dengan arsitektur baru.

  2. Catatan hash file:

    1023057173029091u23f01w276931f7f42595f84f

  3. Tampilkan file menggunakan hash. Pastikan itu yang Anda inginkan:

    git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js

  4. Redirect file ke salinan lokal

    git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js> myFile.07aug2018.js

  5. Cadangkan file Anda saat ini.

    cp myFile.js myFile.bak.js

  6. Buka kedua file di editor teks favorit Anda.

    vim myFile.js
    vim myFile.07aug2018.js

  7. Salin dan tempel kode dari myFile.07aug2018.js ke myFile.js, dan simpan.

  8. Komit dan tekan myFile.js

  9. Sekali lagi lihat log, dan konfirmasikan bahwa file Anda sudah terpasang dengan benar.

  10. Beri tahu klien Anda untuk menarik yang terbaru, senang melihatnya bekerja dengan versi lama di tempat.

Bukan solusi terseksi, atau sebagian besar git-centric, dan pasti reset / pembalikan "manual", tetapi ia bekerja. Membutuhkan pengetahuan minimal tentang git, dan tidak mengganggu riwayat commit.


2
Jawaban ini jauh lebih kompleks dan rawan kesalahan daripada solusi mana pun yang mendahuluinya selama bertahun-tahun.
Artif3x

2
Mengapa ada orang yang menggunakan solusi ini !? jawaban yang benar hanya perintah sederhana.
Milad Rahimi

1
Ini adalah solusi optimal untuk keadaan tertentu. Ini bermanfaat bagi mereka yang terikat, di mana git tidak berfungsi, dan bagi mereka yang membutuhkan perbaikan.
kmiklas
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.