Bagaimana saya bisa mengatur ulang atau mengembalikan file ke revisi tertentu?

4518

Saya telah membuat beberapa perubahan pada file yang telah dilakukan beberapa kali sebagai bagian dari grup file, tetapi sekarang ingin mengatur ulang / mengembalikan perubahan di dalamnya kembali ke versi sebelumnya.

Saya telah melakukan git logbersama dengan git diffuntuk menemukan revisi yang saya butuhkan, tetapi hanya tidak tahu bagaimana mengembalikan file ke keadaan semula di masa lalu.

Benci_
sumber
11
Setelah kembali, jangan lupa --cachedsaat memeriksa git diff. tautan
Geoffrey Hale
5
Saya menemukan pertanyaan Anda ketika saya mencari di Google pertanyaan saya. Tetapi setelah saya membaca solusinya, saya memeriksa log saya dan menemukan, bahwa saya membuat perubahan thouse sebagai komit mandiri, jadi saya membuat git revert untuk komit itu, dan semua yang lain tetap seperti yang saya inginkan. Bukan solusi, hanya cara lain untuk melakukannya kadang-kadang.
sudo97

Jawaban:

6137

Dengan asumsi hash dari commit yang Anda inginkan adalah c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

The checkout git halaman manual memberikan informasi lebih lanjut.

Jika Anda ingin kembali ke komit sebelumnya c5f567, tambahkan ~1(di mana 1 adalah jumlah komit yang ingin Anda kembali, itu bisa berupa apa saja):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

Sebagai catatan, saya selalu merasa tidak nyaman dengan perintah ini karena ini digunakan untuk hal-hal biasa (perubahan antar cabang) dan hal-hal yang tidak biasa dan merusak (membuang perubahan dalam direktori kerja).

Greg Hewgill
sumber
12
@shadowhand: Apakah ada cara untuk membalikkannya, jadi ini versinya setelah itu?
aliteralmind
16
@aliteralmind: Tidak, sayangnya notasi pintasan riwayat Git hanya berjalan mundur dalam sejarah.
Greg Hewgill
46
Jika Anda akan menggunakan nama cabang untuk abcde (mis. develop), Anda ingin git checkout develop -- file/to/restore(perhatikan tanda hubung ganda)
Ohad Schneider
8
@aliteralmind: Sebenarnya, ya, ada cara untuk melakukannya: "git log --reverse -1 --ancestry-path yourgitrev..master" dan kemudian gunakan opsi yang sesuai untuk mendapatkan git rev. --ancestry-path akan "menggambar garis" antara dua komit dan -1 akan menunjukkan kepada Anda hanya satu versi, dan --reverse akan memastikan entri pertama yang dipancarkan adalah yang tertua.
Chris Cogdon
6
Secara pribadi saya menemukan HEAD ^ lebih mudah untuk mengetik daripada HEAD ~ 1 :)
juzzlin
606

Anda dapat dengan cepat meninjau perubahan yang dilakukan pada file menggunakan perintah diff:

git diff <commit hash> <filename>

Kemudian untuk mengembalikan file tertentu ke komit tersebut gunakan perintah reset:

git reset <commit hash> <filename>

Anda mungkin perlu menggunakan --hardopsi ini jika memiliki modifikasi lokal.

Alur kerja yang baik untuk mengelola titik jalan adalah dengan menggunakan tag untuk menandai poin di garis waktu Anda. Saya tidak mengerti kalimat terakhir Anda, tetapi yang Anda inginkan adalah menyimpang dari cabang dari titik waktu sebelumnya. Untuk melakukan ini, gunakan perintah checkout berguna:

git checkout <commit hash>
git checkout -b <new branch name>

Anda kemudian dapat melakukan rebase terhadap garis utama Anda ketika Anda siap untuk menggabungkan perubahan itu:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
Chris Lloyd
sumber
7
Perintah 'git checkout <commit hash>' telah mengembalikan versi saya yang lebih lama dari proyek ini yang saya cari Terima kasih Chris.
vidur punj
48
Untuk mengembalikan file git checkout <commit hash> <filename>bekerja lebih baik bagi saya daripadagit reset
Motti Strom
3
Saya ingin versi awal dari satu file karena saya telah menimpa 150 baris dengan copy / paste yang dipilih dengan buruk. git checkout <commit hash> <filename>bekerja untukku. Ini seharusnya bukan jawaban yang diterima, IMHO. git resettidak.
harperville
24
tidak dapat digunakan git resetuntuk mengatur ulang satu file, Anda akan mendapatkan kesalahanfatal: Cannot do hard reset with paths
slier
13
Apa yang dikatakan slier: Anda tidak bisa git reset --hard <commit hash> <filename>. Ini akan salah dengan fatal: Cannot do hard reset with paths.apa yang dikatakan Motti Strom: usegit checkout <commit hash> <filename>
Hawkeye Parker
366

Anda dapat menggunakan referensi apa pun untuk komit git, termasuk SHA-1 jika itu yang paling nyaman. Intinya adalah bahwa perintahnya terlihat seperti ini:

git checkout [commit-ref] -- [filename]

foxxtrot
sumber
22
Apa perbedaan antara jawaban ini, yang sudah --, dan yang diterima yang tidak?
2rs2ts
80
Di git, a '-' sebelum daftar file memberitahu git bahwa semua argumen selanjutnya harus ditafsirkan sebagai nama file, bukan sebagai nama cabang atau apa pun. Terkadang ini membantu disambiguator.
foxxtrot
49
Tanda '-' bukan hanya konvensi git, tetapi sesuatu yang Anda temukan di berbagai tempat di dalam perintah * nix. rm -- -f(hapus nama file -f) tampaknya menjadi contoh kanonik. Lebih detail di sini
Hawkeye Parker
7
Tambahkan saja apa yang dikatakan @HawkeyeParker, rmperintah menggunakan getopt (3) untuk mem-parsing argumennya. getoptadalah perintah untuk mem-parsing argumen perintah. gnu.org/software/libc/manual/html_node/Getopt.html
Devy
2
@ Sayang Ya, itu yang saya maksud, dan ya, mungkin tidak sama sekali. Saya telah melihat contoh itu di berbagai tempat, mungkin hanya untuk membuatnya agak berkesan: rm -f terkenal menakutkan / berbahaya. Tapi, intinya adalah, dalam * nix nama file dapat mulai dengan '-', dan ini akan membingungkan berbagai penafsir baris perintah yang, ketika mereka melihat '-', mengharapkan opsi perintah untuk diikuti. Ini bisa berupa file apa saja yang dimulai dengan '-'; misal, "-mySpecialFile".
Hawkeye Parker
288
git checkout -- foo

Itu akan diatur ulang fooke KEPALA. Anda juga bisa:

git checkout HEAD^ foo

untuk satu revisi kembali, dll.

Greg Hewgill
sumber
12
Saya sarankan menggunakan sintaks git checkout -- foountuk menghindari kesalahan jika fooada sesuatu yang istimewa (seperti direktori atau file yang dipanggil -f). Dengan git, jika Anda tidak yakin, selalu awali semua file dan direktori dengan argumen khusus --.
Mikko Rantalainen
8
Catatan tambahan untuk komentar Mikko: --bukan perintah git dan tidak khusus untuk git. Ini adalah bash built-in untuk menandakan akhir opsi perintah. Anda dapat menggunakannya dengan banyak perintah bash lainnya juga.
matthaeus
14
@matthaeus juga tidak khusus untuk bash atau fitur shell sama sekali. Ini adalah konvensi yang diimplementasikan dalam banyak perintah berbeda (dan didukung oleh getopt).
Greg Hewgill
2
Tidak, --ini bukan sebuah builtin kata khusus di bash. Tetapi itu adalah konvensi umum yang didukung oleh banyak parser baris perintah dan digunakan oleh banyak CLI, termasuk git.
Emil Lundberg
123

Dan untuk kembali ke versi terakhir yang berkomitmen, yang paling sering dibutuhkan, Anda dapat menggunakan perintah yang lebih sederhana ini.

git checkout HEAD file/to/restore
CDR
sumber
2
apa perbedaan antara ini (git checkout file HEAD / to / restore) dan git reset --hard file / to / restore ???
Motti Shneor
2
1) lebih mudah diingat dengan cara yang lebih umum 2) jangan khawatir untuk menekan Enter sebelum memasukkan nama file
Roman Susi
105

Saya memiliki masalah yang sama sekarang dan saya menemukan jawaban ini paling mudah untuk dipahami ( commit-refadalah nilai SHA dari perubahan dalam log yang ingin Anda kembali ke):

git checkout [commit-ref] [filename]

Ini akan menempatkan versi lama itu di direktori kerja Anda dan dari sana Anda bisa mengkomitnya jika mau.

besar
sumber
91

Jika Anda tahu berapa banyak komitmen yang harus Anda kembalikan, Anda dapat menggunakan:

git checkout master~5 image.png

Ini mengasumsikan bahwa Anda berada di mastercabang, dan versi yang Anda inginkan adalah 5 komit kembali.

Ron DeVera
sumber
80

Saya pikir saya sudah menemukannya .... dari http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Terkadang Anda hanya ingin kembali dan melupakan setiap perubahan yang melewati titik tertentu karena semuanya salah.

Dimulai dari:

$ git log

yang menunjukkan daftar komit terbaru, dan hash SHA1 mereka.

Selanjutnya, ketik:

$ git reset --hard SHA1_HASH

untuk mengembalikan status ke komit yang diberikan dan menghapus semua komit yang lebih baru dari catatan secara permanen.

jdee
sumber
24
Git tidak pernah menghapus apa pun. Komitmen lama Anda masih ada di sana tetapi kecuali ada ujung cabang yang menunjuk pada mereka, mereka tidak dapat dijangkau lagi. git reflog masih akan menampilkannya sampai Anda membersihkan repositori Anda dengan git-gc.
Bombe
1
@Bombe: Terima kasih atas informasinya. Saya telah memeriksa versi file yang lama. Setelah membaca komentar Anda, saya dapat menggunakan "gitref" untuk mencari hash SHA1 parsial, dan menggunakan "checkout" untuk kembali ke versi terbaru. Pengguna git lain mungkin menganggap informasi ini bermanfaat.
Winston C. Yang
4
mungkin diikuti oleh agit push --force
bshirley
4
Jika Anda memiliki perubahan yang tidak dikomit, Anda akan kehilangan mereka jika melakukan git reset --hard
Boklucius
5
@Bombe - "Git tidak pernah menghapus apa pun. Komit lama Anda masih ada di sana tetapi kecuali ada ujung cabang yang menunjuk pada mereka, mereka tidak dapat dijangkau lagi." - tetapi melakukan seperti ini dipangkas setelah beberapa waktu yang ditentukan, jadi "Git tidak pernah menghapus apa pun" tidak benar.
Bulwersator
61

Ini bekerja untuk saya:

git checkout <commit hash> file

Kemudian lakukan perubahan:

git commit -a
v2k
sumber
54

Anda harus berhati-hati ketika mengatakan "kembalikan". Jika Anda dulu memiliki satu versi file dalam komit $ A, dan kemudian membuat dua perubahan dalam dua komit terpisah $ B dan $ C (jadi yang Anda lihat adalah iterasi ketiga file), dan jika Anda mengatakan " Saya ingin kembali ke yang pertama ", apakah Anda sungguh-sungguh?

Jika Anda ingin menyingkirkan perubahan iterasi kedua dan ketiga, ini sangat sederhana:

$ git checkout $A file

dan kemudian Anda melakukan hasilnya. Perintah bertanya "Saya ingin memeriksa file dari negara yang direkam oleh komit $ A".

Di sisi lain, apa yang Anda maksudkan adalah untuk menyingkirkan perubahan iterasi kedua (yaitu komit $ B) yang dibawa, sambil menjaga apa yang komit $ C lakukan untuk file, Anda ingin mengembalikan $ B

$ git revert $B

Perhatikan bahwa siapa pun yang membuat komit $ B mungkin tidak terlalu disiplin dan mungkin telah melakukan perubahan yang sama sekali tidak terkait dalam komit yang sama, dan pengembalian ini dapat menyentuh file selain file yang Anda lihat menyinggung perubahan, jadi Anda mungkin ingin memeriksa hasilnya dengan hati-hati setelah melakukan begitu.


sumber
Saya melakukan ini, tetapi kemudian "file log git" akan mengatakan bahwa saya berada di komit asli, KEPALA. Tampaknya "git checkout" gagal. Namun, status git menunjukkan bahwa file tersebut benar-benar berubah dan dan "file git diff -staged" akan menunjukkan perubahan yang sebenarnya. Juga, "status git" menunjukkan file berubah juga. Jadi jangan gunakan "git log" di sini untuk melacak file mana yang berubah.
Frederick Ollinger
37

Yang mengherankan, git checkout footidak akan berfungsi jika copy pekerjaan dalam direktori bernama foo; namun, keduanya git checkout HEAD foodan git checkout ./fooakan:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo
Aaron Maenpaa
sumber
26
ataugit checkout -- foo
knittl
32

Begini cara rebasekerjanya:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

Anggaplah Anda memilikinya

---o----o----o----o  master
    \---A----B       <my branch>

Dua perintah pertama ... melakukan git checkout git rebase master

... periksa cabang perubahan yang ingin Anda terapkan ke mastercabang. The rebaseperintah mengambil komit dari <my branch>(yang tidak ditemukan di master) dan reapplies mereka ke kepala master. Dengan kata lain, orang tua dari komit pertama <my branch>tidak lagi komit sebelumnya dalam mastersejarah, tetapi kepala saat ini master. Kedua perintah itu sama dengan:

git rebase master <my branch>

Mungkin lebih mudah untuk mengingat perintah ini karena cabang "basis" dan "modifikasi" adalah eksplisit.

. Hasil sejarah terakhir adalah:

---o----o----o----o   master
                   \----A'----B'  <my branch>

Dua perintah terakhir ...

git checkout master
git merge <my branch>

... lakukan penggabungan maju-cepat untuk menerapkan semua <my branch>perubahan master. Tanpa langkah ini, komit rebase tidak akan ditambahkan master. Hasil akhirnya adalah:

---o----o----o----o----A'----B'  master, <my branch>

masterdan <my branch>keduanya referensi B'. Juga, dari titik ini aman untuk menghapus <my branch>referensi.

git branch -d <my branch>
cmcginty
sumber
26

Pada git v2.23.0 ada metode git restore baru yang seharusnya mengambil bagian dari apa git checkoutyang bertanggung jawab (bahkan jawaban yang diterima menyebutkan itu git checkoutcukup membingungkan). Lihat sorotan perubahan di blog github .

Perilaku default dari perintah ini adalah mengembalikan status pohon yang berfungsi dengan konten yang berasal dari sourceparameter (yang dalam kasus Anda akan menjadi hash komit).

Jadi berdasarkan jawaban Greg Hewgill (dengan asumsi hash adalah c5f567) perintah akan terlihat seperti ini:

git restore --source=c5f567 file1/to/restore file2/to/restore

Atau jika Anda ingin mengembalikan ke konten dari satu commit sebelum c5f567:

git restore --source=c5f567~1 file1/to/restore file2/to/restore
mjarosie
sumber
24

Atur Ulang Kepala Pertama Untuk File Target

git reset HEAD path_to_file

Checkout Kedua File Itu

git checkout -- path_to_file
Gulshan Maurya
sumber
4
+1, meskipun tidak yakin dengan niat menyetel ulang HEAD. Mungkin atau mungkin tidak diperlukan. Dalam situasi saya, saya hanya ingin mengembalikan satu file tertentu ke versi dalam repositori (yang menjaga agar perubahan lokal tetap ada. Menjalankan langkah kedua di atas sudah cukup bagi saya
fkl
Ya saya hanya perlu menjalankan perintah ke-2. Seperti -> shellhacks.com/git-revert-file-to-previous-commit
javaPlease42
22

git-alias, awk dan shell-functions untuk menyelamatkan!

git prevision <N> <filename>

di mana <N>jumlah revisi file untuk mengembalikan file <filename>.
Misalnya, untuk checkout revisi sebelumnya dari satu file x/y/z.c, jalankan

git prevision -1 x/y/z.c

Bagaimana cara kerja previsi git?

Tambahkan berikut ini ke gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

Perintah pada dasarnya

  • melakukan git logpada file yang ditentukan dan
  • mengambil komit-id yang sesuai dalam sejarah file dan
  • mengeksekusi a git checkoutke komit-id untuk file yang ditentukan.

Pada dasarnya, semua yang akan dilakukan secara manual dalam situasi ini,
terbungkus dalam satu yang indah, efisien git-alias - git-prevision

TheCodeArtist
sumber
20

Saya harus memasang EasyGit di sini, yang merupakan pembungkus untuk membuat git lebih mudah didekati oleh para pemula tanpa membingungkan pengguna berpengalaman. Salah satu hal yang dilakukannya adalah memberi lebih banyak maknagit revert . Dalam hal ini, Anda cukup mengatakan:

eg revert foo/bar foo/baz

Aristoteles Pagaltzis
sumber
1
Seharusnya begitu eg revert --in REVISON -- FILENAME. Itu --inpenting. Untuk pengguna Windows di luar sana: Buka git bash. Jalankan echo %PATH. Jalur pertama harus di direktori pengguna Anda yang diakhiri dengan bin. Buat jalur itu. Simpan misalnya ada. Beri nama eg. Tidak eg.txt.
koppor
20

Jika Anda ingin mengembalikan file ke komit sebelumnya (dan file yang ingin Anda kembalikan sudah komit), Anda dapat menggunakan

git checkout HEAD^1 path/to/file

atau

git checkout HEAD~1 path/to/file

Kemudian tinggal panggung dan komit versi "baru".

Berbekal pengetahuan bahwa komit dapat memiliki dua orang tua dalam kasus penggabungan, Anda harus tahu bahwa HEAD ^ 1 adalah orangtua pertama dan HEAD ~ 1 adalah orangtua kedua.

Entah akan bekerja jika hanya ada satu orangtua di pohon.

Mantra modern
sumber
19

Banyak saran di sini, sebagian besar sejalan git checkout $revision -- $file. Beberapa alternatif yang tidak jelas:

git show $revision:$file > $file

Dan juga, saya sering menggunakan ini hanya untuk melihat versi tertentu sementara:

git show $revision:$file

atau

git show $revision:$file | vim -R -

(OBS: $fileperlu diawali dengan ./jika itu adalah jalur relatif untuk git show $revision:$filebekerja)

Dan yang lebih aneh:

git archive $revision $file | tar -x0 > $file
Peter V. Mørch
sumber
1
Ini adalah alternatif yang bagus jika Anda tidak yakin versi komit mana yang Anda inginkan dan perlu "mengintip" tanpa menimpa direktori kerja Anda.
wisbucky
18

Perhatikan, bagaimanapun, itu git checkout ./foodan git checkout HEAD ./foo bukan hal yang persis sama; Inti masalah:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(Tahap kedua addfile dalam indeks, tetapi tidak mendapatkan komitmen.)

Git checkout ./fooberarti mengembalikan jalur ./foodari indeks ; menambahkan HEADmenginstruksikan Git untuk mengembalikan jalur itu dalam indeks ke HEADrevisi sebelum melakukannya.

Damien Diederen
sumber
14

Bagi saya tidak ada jawaban yang tampak sangat jelas dan karena itu saya ingin menambahkan milik saya yang tampaknya sangat mudah.

Saya memiliki komit abc1dan setelah itu saya telah melakukan beberapa (atau satu modifikasi) untuk sebuah file file.txt.

Sekarang katakan bahwa saya mengacaukan sesuatu dalam file file.txtdan saya ingin kembali ke komit sebelumnya abc1.

1 git checkout file.txt.: ini akan menghapus perubahan lokal, jika Anda tidak membutuhkannya

2 git checkout abc1 file.txt.: ini akan membawa file Anda ke versi yang Anda inginkan

3 git commit -m "Restored file.txt to version abc1".: ini akan melakukan pengembalian Anda.

  1. git push : ini akan mendorong semuanya pada repositori jarak jauh

Antara langkah 2 dan 3 tentu saja bisa Anda lakukan git statusuntuk memahami apa yang sedang terjadi. Biasanya Anda harus melihat yang file.txtsudah ditambahkan dan itu sebabnya tidak perlu a git add.

desmond13
sumber
2
OK jadi saya kira langkah 1. dan 2. saling eksklusif: jika abc1 adalah komit terakhir Anda, tidak perlu 2. dan jika ada komit lain setelah abc1 Anda dapat langsung melakukan 2.
Jean Paul
13
  1. Git kembalikan file ke komit tertentu
git checkout Last_Stable_commit_Number -- fileName

2.Git kembalikan file ke cabang tertentu

git checkout branchName_Which_Has_stable_Commit fileName
ireshika piyumalie
sumber
11

Untuk membuka versi komit file sebelumnya, dapatkan nomor komit, katakanlah eb917a1 lalu

git checkout eb917a1 YourFileName

Jika Anda hanya perlu kembali ke versi komit terakhir

git reset HEAD YourFileName
git checkout YourFileName

Ini hanya akan membawa Anda ke status file terakhir yang dikomit

shah1988
sumber
10

git checkout ref | commitHash - filePath

misalnya

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar
Amos Folarin
sumber
10

Banyak jawaban di sini mengklaim untuk menggunakan git reset ... <file>atau git checkout ... <file>tetapi dengan melakukannya, Anda akan kehilangan setiap modifikasi pada <file>komitmen setelah komit yang ingin Anda kembalikan.

Jika Anda ingin mengembalikan perubahan dari satu komit pada satu file saja, seperti yang git revertakan dilakukan tetapi hanya untuk satu file (atau mengatakan subset dari file komit), saya sarankan untuk menggunakan keduanya git diffdan git applyseperti itu (dengan <sha>= hash dari komit yang ingin Anda kembalikan):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

Pada dasarnya, ini pertama-tama akan menghasilkan tambalan yang sesuai dengan perubahan yang ingin Anda kembalikan, dan kemudian balas menerapkan tambalan untuk menjatuhkan perubahan itu.

Tentu saja, itu tidak akan berfungsi jika garis yang dikembalikan telah dimodifikasi oleh komit antara <sha1>dan HEAD(konflik).

Vince
sumber
Itu harus menjadi jawaban yang disetujui. Bolehkah saya menyarankan versi yang sedikit disederhanakan:git show -p <sha> path/to/file.ext|git apply -R
Amaury D
Anda dapat menggunakannya <sha>^!sebagai pengganti<sha>^ <sha>
cambunctious
8

Gunakan git loguntuk mendapatkan kunci hash untuk versi tertentu dan kemudian gunakangit checkout <hashkey>

Catatan: Jangan lupa mengetik hash sebelum yang terakhir. Hash terakhir menunjukkan posisi Anda saat ini (KEPALA) dan tidak mengubah apa pun.

mustafakyr
sumber
7

Jelas seseorang perlu menulis buku yang dapat dimengerti tentang git, atau git perlu dijelaskan dengan lebih baik dalam dokumentasi. Menghadapi masalah yang sama, saya rasa itu

cd <working copy>
git revert master

akan membatalkan komitmen terakhir yang tampaknya dilakukan.

Ian

Ian Davis
sumber
7

Anda dapat melakukannya dalam 4 langkah:

  1. kembalikan seluruh komit dengan file yang ingin Anda kembalikan secara spesifik - ini akan membuat komit baru di cabang Anda
  2. reset lunak komit - menghapus komit dan memindahkan perubahan ke area kerja
  3. pilih sendiri file untuk mengembalikan dan mengkomitnya
  4. letakkan semua file lain di area kerja Anda

Apa yang perlu Anda ketik di terminal Anda :

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> && git commit -m 'reverting file'
  4. git checkout .

semoga berhasil

Nir M.
sumber
bukankah itu mengembalikan SEMUA perubahan?
arcee123
1
@ arcee123 Ya, tetapi pengaturan ulang berikutnya membatalkan pemulihan semua perubahan. Masalahnya adalah bahwa git-reverthanya beroperasi pada repo keseluruhan, jadi untuk mengimbangi kita harus membatalkan semuanya.
Timothy
2
Saya sarankan menggunakan: 1. git revert --no-commit <commit_hash>2. git reset HEADIni menyimpan komit ekstra mengambang dan melakukan semua perubahan hanya di direktori kerja Anda.
Timothy
@ greg-hewgill jawaban lebih baik dan tepat. Yang ini buruk dan tidak boleh digunakan.
Daniel Tranca
Inilah yang benar-benar diperlukan untuk mengembalikan file tertentu dengan benar. Saya perlu membatalkan perubahan pada beberapa file dari komit sebelumnya yang telah didorong ke repositori jarak jauh. Saya mengembalikan, mengatur ulang, dan melakukan hasilnya: git revert _oldcommit_ --no-commit git reset -- _unchanged1_ _unchanged2_ ... git commit -m "branch without changes to specific files"Tip cabang baru mencerminkan semua perubahan kecuali file yang dikembalikan.
Suncat2000
7

Ini adalah langkah yang sangat sederhana. Periksa file ke id komit yang kita inginkan, di sini satu komit id sebelumnya, dan kemudian git komit ubah dan kita selesai.

# git checkout <previous commit_id> <file_name>
# git commit --amend

Ini sangat berguna. Jika kita ingin membawa file apa pun ke id komit sebelumnya di bagian atas komit, kita dapat dengan mudah melakukannya.

Abhishek Dwivedi
sumber
5
git revert <hash>

Akan mengembalikan komit yang diberikan. Sepertinya menurut Anda git reverthanya mempengaruhi komit terbaru.

Itu tidak menyelesaikan masalah Anda, jika Anda ingin mengembalikan perubahan pada file tertentu dan komit berubah lebih dari file itu.

Otto
sumber
5

jika Anda melakukan file yang salah dalam komit terakhir Anda ikuti instruksi:

  1. open source tree, ubah komit ini

pohon sumber terbuka

  1. ubah baris dan temukan komit Anda bahwa file yang salah terkirim sebagai komit

masukkan deskripsi gambar di sini

  1. Anda dapat melihat daftar perubahan Anda di komit itu daftar file di pohon sumber
  2. pilih dan kemudian klik ... tombol sebelah kanan ... klik membalikkan file
  3. maka Anda dapat melihatnya di tab status file di sisi kiri bawah lalu klik unstage:

tab status file

  1. buka kode studio visual Anda dan kembalikan dengan melakukan file yang dihapus
  2. setelah semua itu, Anda dapat melihat hasil dalam komit terakhir di bagan sumber

masukkan deskripsi gambar di sini

saber tabatabaee yazdi
sumber