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 log
bersama dengan git diff
untuk menemukan revisi yang saya butuhkan, tetapi hanya tidak tahu bagaimana mengembalikan file ke keadaan semula di masa lalu.
git
version-control
git-checkout
Benci_
sumber
sumber
--cached
saat memeriksagit diff
. tautanJawaban:
Dengan asumsi hash dari commit yang Anda inginkan adalah
c5f567
: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):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).
sumber
develop
), Anda ingingit checkout develop -- file/to/restore
(perhatikan tanda hubung ganda)Anda dapat dengan cepat meninjau perubahan yang dilakukan pada file menggunakan perintah diff:
Kemudian untuk mengembalikan file tertentu ke komit tersebut gunakan perintah reset:
Anda mungkin perlu menggunakan
--hard
opsi 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:
Anda kemudian dapat melakukan rebase terhadap garis utama Anda ketika Anda siap untuk menggabungkan perubahan itu:
sumber
git checkout <commit hash> <filename>
bekerja lebih baik bagi saya daripadagit reset
git checkout <commit hash> <filename>
bekerja untukku. Ini seharusnya bukan jawaban yang diterima, IMHO.git reset
tidak.git reset
untuk mengatur ulang satu file, Anda akan mendapatkan kesalahanfatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
. Ini akan salah denganfatal: Cannot do hard reset with paths.
apa yang dikatakan Motti Strom: usegit checkout <commit hash> <filename>
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]
sumber
--
, dan yang diterima yang tidak?rm -- -f
(hapus nama file-f
) tampaknya menjadi contoh kanonik. Lebih detail di sinirm
perintah menggunakan getopt (3) untuk mem-parsing argumennya.getopt
adalah perintah untuk mem-parsing argumen perintah. gnu.org/software/libc/manual/html_node/Getopt.htmlItu akan diatur ulang
foo
ke KEPALA. Anda juga bisa:untuk satu revisi kembali, dll.
sumber
git checkout -- foo
untuk menghindari kesalahan jikafoo
ada 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--
.--
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.--
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.Dan untuk kembali ke versi terakhir yang berkomitmen, yang paling sering dibutuhkan, Anda dapat menggunakan perintah yang lebih sederhana ini.
sumber
Saya memiliki masalah yang sama sekarang dan saya menemukan jawaban ini paling mudah untuk dipahami (
commit-ref
adalah nilai SHA dari perubahan dalam log yang ingin Anda kembali ke):Ini akan menempatkan versi lama itu di direktori kerja Anda dan dari sana Anda bisa mengkomitnya jika mau.
sumber
Jika Anda tahu berapa banyak komitmen yang harus Anda kembalikan, Anda dapat menggunakan:
Ini mengasumsikan bahwa Anda berada di
master
cabang, dan versi yang Anda inginkan adalah 5 komit kembali.sumber
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.
sumber
git push --force
Ini bekerja untuk saya:
Kemudian lakukan perubahan:
sumber
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:
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
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
Yang mengherankan,
git checkout foo
tidak akan berfungsi jika copy pekerjaan dalam direktori bernamafoo
; namun, keduanyagit checkout HEAD foo
dangit checkout ./foo
akan:sumber
git checkout -- foo
Begini cara
rebase
kerjanya:Anggaplah Anda memilikinya
Dua perintah pertama ... melakukan git checkout git rebase master
... periksa cabang perubahan yang ingin Anda terapkan ke
master
cabang. Therebase
perintah mengambil komit dari<my branch>
(yang tidak ditemukan dimaster
) dan reapplies mereka ke kepalamaster
. Dengan kata lain, orang tua dari komit pertama<my branch>
tidak lagi komit sebelumnya dalammaster
sejarah, tetapi kepala saat inimaster
. Kedua perintah itu sama dengan:Mungkin lebih mudah untuk mengingat perintah ini karena cabang "basis" dan "modifikasi" adalah eksplisit.
. Hasil sejarah terakhir adalah:
Dua perintah terakhir ...
... lakukan penggabungan maju-cepat untuk menerapkan semua
<my branch>
perubahanmaster
. Tanpa langkah ini, komit rebase tidak akan ditambahkanmaster
. Hasil akhirnya adalah:master
dan<my branch>
keduanya referensiB'
. Juga, dari titik ini aman untuk menghapus<my branch>
referensi.sumber
Pada git v2.23.0 ada metode git restore baru yang seharusnya mengambil bagian dari apa
git checkout
yang bertanggung jawab (bahkan jawaban yang diterima menyebutkan itugit checkout
cukup membingungkan). Lihat sorotan perubahan di blog github .Perilaku default dari perintah ini adalah mengembalikan status pohon yang berfungsi dengan konten yang berasal dari
source
parameter (yang dalam kasus Anda akan menjadi hash komit).Jadi berdasarkan jawaban Greg Hewgill (dengan asumsi hash adalah
c5f567
) perintah akan terlihat seperti ini:Atau jika Anda ingin mengembalikan ke konten dari satu commit sebelum c5f567:
sumber
Atur Ulang Kepala Pertama Untuk File Target
Checkout Kedua File Itu
sumber
di mana
<N>
jumlah revisi file untuk mengembalikan file<filename>
.Misalnya, untuk checkout revisi sebelumnya dari satu file
x/y/z.c
, jalankanBagaimana cara kerja previsi git?
Tambahkan berikut ini ke
gitconfig
Pada dasarnya, semua yang akan dilakukan secara manual dalam situasi ini,
terbungkus dalam satu yang indah, efisien git-alias - git-prevision
sumber
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 makna
git revert
. Dalam hal ini, Anda cukup mengatakan:eg revert foo/bar foo/baz
sumber
eg revert --in REVISON -- FILENAME
. Itu--in
penting. Untuk pengguna Windows di luar sana: Buka git bash. Jalankanecho %PATH
. Jalur pertama harus di direktori pengguna Anda yang diakhiri denganbin
. Buat jalur itu. Simpan misalnya ada. Beri namaeg
. Tidakeg.txt
.Jika Anda ingin mengembalikan file ke komit sebelumnya (dan file yang ingin Anda kembalikan sudah komit), Anda dapat menggunakan
atau
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.
sumber
Banyak saran di sini, sebagian besar sejalan
git checkout $revision -- $file
. Beberapa alternatif yang tidak jelas:Dan juga, saya sering menggunakan ini hanya untuk melihat versi tertentu sementara:
atau
(OBS:
$file
perlu diawali dengan./
jika itu adalah jalur relatif untukgit show $revision:$file
bekerja)Dan yang lebih aneh:
sumber
Perhatikan, bagaimanapun, itu
git checkout ./foo
dangit checkout HEAD ./foo
bukan hal yang persis sama; Inti masalah:(Tahap kedua
add
file dalam indeks, tetapi tidak mendapatkan komitmen.)Git checkout ./foo
berarti mengembalikan jalur./foo
dari indeks ; menambahkanHEAD
menginstruksikan Git untuk mengembalikan jalur itu dalam indeks keHEAD
revisi sebelum melakukannya.sumber
Bagi saya tidak ada jawaban yang tampak sangat jelas dan karena itu saya ingin menambahkan milik saya yang tampaknya sangat mudah.
Saya memiliki komit
abc1
dan setelah itu saya telah melakukan beberapa (atau satu modifikasi) untuk sebuah filefile.txt
.Sekarang katakan bahwa saya mengacaukan sesuatu dalam file
file.txt
dan saya ingin kembali ke komit sebelumnyaabc1
.1
git checkout file.txt
.: ini akan menghapus perubahan lokal, jika Anda tidak membutuhkannya2
git checkout abc1 file.txt
.: ini akan membawa file Anda ke versi yang Anda inginkan3
git commit -m "Restored file.txt to version abc1"
.: ini akan melakukan pengembalian Anda.git push
: ini akan mendorong semuanya pada repositori jarak jauhAntara langkah 2 dan 3 tentu saja bisa Anda lakukan
git status
untuk memahami apa yang sedang terjadi. Biasanya Anda harus melihat yangfile.txt
sudah ditambahkan dan itu sebabnya tidak perlu agit add
.sumber
2.Git kembalikan file ke cabang tertentu
sumber
Untuk membuka versi komit file sebelumnya, dapatkan nomor komit, katakanlah eb917a1 lalu
Jika Anda hanya perlu kembali ke versi komit terakhir
Ini hanya akan membawa Anda ke status file terakhir yang dikomit
sumber
git checkout ref | commitHash - filePath
misalnya
sumber
Banyak jawaban di sini mengklaim untuk menggunakan
git reset ... <file>
ataugit 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 revert
akan dilakukan tetapi hanya untuk satu file (atau mengatakan subset dari file komit), saya sarankan untuk menggunakan keduanyagit diff
dangit apply
seperti itu (dengan<sha>
= hash dari komit yang ingin Anda kembalikan):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>
danHEAD
(konflik).sumber
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
sebagai pengganti<sha>^ <sha>
Gunakan
git log
untuk 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.
sumber
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
akan membatalkan komitmen terakhir yang tampaknya dilakukan.
Ian
sumber
Anda dapat melakukannya dalam 4 langkah:
Apa yang perlu Anda ketik di terminal Anda :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
semoga berhasil
sumber
git-revert
hanya beroperasi pada repo keseluruhan, jadi untuk mengimbangi kita harus membatalkan semuanya.git revert --no-commit <commit_hash>
2.git reset HEAD
Ini menyimpan komit ekstra mengambang dan melakukan semua perubahan hanya di direktori kerja Anda.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.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.
Ini sangat berguna. Jika kita ingin membawa file apa pun ke id komit sebelumnya di bagian atas komit, kita dapat dengan mudah melakukannya.
sumber
Akan mengembalikan komit yang diberikan. Sepertinya menurut Anda
git revert
hanya mempengaruhi komit terbaru.Itu tidak menyelesaikan masalah Anda, jika Anda ingin mengembalikan perubahan pada file tertentu dan komit berubah lebih dari file itu.
sumber
jika Anda melakukan file yang salah dalam komit terakhir Anda ikuti instruksi:
sumber