Setel u>

Saya membuat beberapa perubahan pada file yang telah ditransfer beberapa kali sebagai bagian dari grup file, tetapi sekarang saya ingin mengatur u>

Saya membuat git log bersama dengan git diff untuk menemukan opsi yang saya butuhkan, tetapi saya tidak tahu bagaimana cara mendapatkan file kembali di masa lalu.

3786
19 окт. atur Hates_ 19 Oktober. 2008-10-19 02:34 '08 pada pukul 02:34 2008-10-19 02:34
ответ 31 jawaban
  • 1
  • 2

Dengan asumsi hash komit yang Anda inginkan adalah c5f567 :

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

Halaman manual checkout git memberikan informasi lebih lanjut.

Jika Anda ingin kembali untuk mengkomit ke c5f567 , tambahkan ~1 (berfungsi dengan nomor apa pun):

 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 (beralih antar cabang) dan untuk hal-hal yang tidak biasa dan merusak (tidak termasuk perubahan dalam direktori kerja).

5117
19 окт. balasan yang diberikan oleh Greg Hewgill 19 Okt 2008-10-19 02:39 '08 pada 2:39 2008-10-19 02:39

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

 git diff <commit hash> <filename> 

Kemudian, untuk mengembalikan file tertentu ke fixer ini, gunakan perintah reset:

 git reset <commit hash> <filename> 

Anda mungkin harus menggunakan opsi --hard jika Anda memiliki modifikasi lokal.

border=0

Alur dokumen yang bagus untuk mengelola titik jalan Anda adalah menggunakan tag untuk menjaga agar poin di timeline Anda tetap bersih. Saya tidak dapat memahami kalimat terakhir Anda, tetapi yang Anda butuhkan adalah divergensi cabang dari titik waktu sebelumnya. Untuk melakukan ini, gunakan perintah checkout yang nyaman:

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

Kemudian Anda dapat menginstalnya kembali ke jalur utama Anda ketika Anda siap untuk menggabungkan perubahan ini:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. Balas diberikan oleh Chris Lloyd pada 17 Des. 2008-12-17 09:59 '08 pada 9:59 2008-12-17 09:59

Anda dapat menggunakan tautan apa saja untuk git commit, termasuk SHA-1, jika itu yang paling nyaman. Faktanya adalah bahwa tim terlihat seperti ini:

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

319
08 апр. jawabannya diberikan foxxtrot 08 April. 2009-04-08 00:48 '09 pada 0:48 2009-04-08 00:48
 git checkout -- foo 

Ini akan menjadi foo reset untuk HEAD. Anda juga bisa:

 git checkout HEAD^ foo 

untuk satu revisi, dll.

256
29 авг. balasan yang diberikan oleh Greg Hewgill 29 Agustus 2008-08-29 23:56 '08 pada 11:56 2008-08-29 23:56

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

 git checkout HEAD file/to/restore 
114
14 янв. jawabannya diberikan CDR 14 Januari. 2012-01-14 09:15 '12 pada jam 9:15 2012-01-14 09:15

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

 git checkout [commit-ref] [filename] 

Ini menempatkan versi lama ini di direktori kerja Anda, dan dari sana Anda dapat memperbaikinya jika Anda mau.

102
27 мая '09 в 20:52 2009-05-27 20:52 jawabannya diberikan oleh bbrown pada 27 Mei 2009 di 20:52 2009-05-27 20:52

Jika Anda tahu berapa banyak komit yang perlu Anda kembalikan, Anda dapat menggunakan:

 git checkout master~5 image.png 

Diasumsikan bahwa Anda berada di cabang master , dan versi yang diinginkan adalah 5.

88
07 апр. Jawabannya diberikan oleh Ron DeVera 07 Apr 2009-04-07 17:03 '09 at 5:03 PM 2009-04-07 17:03

Saya rasa saya menemukan ... dari http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Terkadang Anda hanya ingin kembali dan melupakan semua perubahan untuk titik tertentu, karena semuanya salah.

Mulai dengan:

$ git log

yang menunjukkan daftar komit terbaru dan hash SHA1 mereka.

Lalu masukkan:

$ git reset --hard SHA1_HASH

untuk memulihkan keadaan untuk komit yang diberikan dan menghapus semua entri baru dari catatan selamanya.

78
17 дек. jawabannya diberikan jdee 17 Desember. 2008-12-17 09:53 '08 pada 9:53 2008-12-17 09:53

Ini bekerja untuk saya:

 git checkout <commit hash> file 

Kemudian lakukan perubahan:

 git commit -a 
61
26 авг. jawabannya diberikan v2k 26 Agustus. 2011-08-26 01:12 '11 pada 1:12 2011-08-26 01:12

Anda harus berhati-hati ketika mengatakan "kembalikan". Jika Anda menggunakan satu versi file dalam komit $ A, kemudian buat dua perubahan menjadi dua komit terpisah $ B dan $ C (jadi Anda lihat, ini adalah iterasi ketiga file), dan jika Anda mengatakan "Saya ingin kembali ke yang pertama", Anda benar-benar serius?

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

 $ git checkout $A file 

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

Di sisi lain, apa yang ada dalam pikiran Anda adalah untuk menyingkirkan perubahan iterasi kedua (mis., Menghasilkan $ B), sambil mempertahankan bahwa Anda memperbaiki file $ C dalam file tersebut, Anda ingin mengembalikan $ B

 $ git revert $B 

Catatan: siapa pun yang melakukan $ B mungkin tidak terlalu disiplin dan bisa membuat perubahan yang sama sekali tidak terkait dengan komit yang sama, dan pengembalian ini mungkin menyangkut file selain file yang Anda lihat, perubahan ofensif, sehingga Anda dapat memeriksa hasilnya dengan seksama setelah itu.

54
11 янв. jawabannya diberikan oleh gitster 11 januari . 2009-01-11 11:13 '09 pada 11:13 2009-01-11 11:13

Menariknya, 'git checkout foo' tidak akan berfungsi jika copy pekerjaan ada di direktori bernama foo; namun, seperti "w20> checkout HEAD foo" dan "git checkout./foo" adalah:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. jawabannya diberikan oleh Aaron Maenpaa 30 Agustus. 2008-08-30 00:26 '08 pada 0:26 pagi 2008-08-30 00:26

Di sini rebase bekerja:

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

Misalkan Anda punya

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

Dua tim pertama ... membuat git checkout git instal u>

... periksa cabang perubahan yang ingin Anda terapkan ke cabang master . Perintah rebase mengambil komit dari <my branch> (yang tidak ditemukan di master ) dan rebase ke header master . Dengan kata lain, elemen induk dari komit pertama di <my branch> bukan lagi fixer sebelumnya dalam sejarah master , tetapi header master saat ini. Dua tim sama dengan:

 git rebase master <my branch> 

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

. Hasil akhirnya:

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

Dua tim terakhir ...

 git checkout master git merge <my branch> 

... melakukan penggabungan cepat untuk menerapkan semua perubahan <my branch> ke master . Tanpa >master . Hasil akhirnya:

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

master dan <my branch> keduanya <my branch> referensi B' . Selain itu, dari titik ini Anda dapat dengan aman menghapus tautan <my branch> .

 git branch -d <my branch> 
32
24 февр. Jawabannya diberikan oleh cmcginty 24 Feb. 2009-02-24 12:43 '09 pada 12:43 2009-02-24 12:43

git alias, fungsi awk dan shell untuk keselamatan!

 git prevision <N> <filename> 

di mana <N> adalah jumlah perbaikan file untuk rollback untuk file <filename> .
Misalnya, untuk memeriksa revisi sebelumnya dari satu file x/y/zc , jalankan

 git prevision -1 x/y/zc 

Bagaimana cara kerja prediksi git?

Tambahkan ke gitconfig Anda

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

Tim pada dasarnya

  • mengeksekusi git log di file yang ditentukan dan
  • memilih ID komit yang sesuai dalam riwayat file dan
  • melakukan git checkout commit id untuk file yang ditentukan.

Intinya, segala sesuatu yang bisa dilakukan secara manual dalam situasi ini
terbungkus dalam satu git-alias yang indah dan efektif - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 jawabannya diberikan oleh TheCodeArtist 01 Mei '15 pukul 4:46 2015-05-01 04:46

Saya perlu menghubungkan EasyGit di sini, yang merupakan pembungkus untuk membuat git lebih mudah diakses oleh pemula tanpa membingungkan pengguna berpengalaman. Salah satu hal yang dilakukannya adalah memberikan lebih banyak nilai git revert . Dalam hal ini, Anda hanya mengatakan:

eg revert foo/bar foo/baz

20
19 окт. jawabannya diberikan Aristoteles Pagaltzis 19 Oktober. 2008-10-19 03:16 '08 pada 3:16 2008-10-19 03:16

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

 git checkout HEAD^1 path/to/file 

atau

 git checkout HEAD~1 path/to/file 

Kemudian cukup lakukan >

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

Atau itu akan berfungsi jika hanya ada satu orangtua di pohon.

20
11 янв. Jawabannya diberikan oleh ModernIncantations 11 Januari. 2014-01-11 03:29 '14 pada 3:29 2014-01-11 03:29

Atur U>

 git reset HEAD path_to_file 

Pemeriksaan kedua file ini

 git checkout -- path_to_file 
19
04 апр. jawabannya diberikan oleh Gulshan Maurya 04 April. 2017-04-04 13:25 '17 jam 1:25 siang 2017-04-04 13:25

Perhatikan bahwa git checkout ./foo dan git checkout HEAD ./foo tidak persis sama; contoh:

 $ 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 

(Yang kedua add proses file dalam indeks, tetapi tidak mendapatkan komitmen.)

git checkout ./foo berarti mengembalikan path ./foo ke indeks ; menambahkan HEAD memerintahkan Git untuk mengembalikan jalur indeks ini ke HEAD sebelum itu.

19
31 авг. Jawabannya diberikan oleh Damien Diederen 31 Agustus 2008-08-31 14:54 '08 pada 14:54 2008-08-31 14:54

Ada banyak saran di sini, kebanyakan dari mereka dalam semangat git checkout $revision -- $file . Beberapa alternatif yang tidak jelas:

 git show $revision:$file > $file 

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

 git show $revision:$file 

atau

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

(OBS: $file harus dimulai dengan awalan ./ jika ini adalah jalur relatif untuk git show $revision:$file untuk bekerja)

Dan semakin aneh

 git archive $revision $file | tar -x0 > $file 
14
08 янв. Balas oleh Peter V. Mørch 08 Jan 2016-01-08 01:19 '16 pada 1:19 2016-01-08 01:19

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

 git checkout eb917a1 YourFileName 

Jika Anda hanya perlu kembali ke versi terdaftar terbaru.

 git reset HEAD YourFileName git checkout YourFileName 

Ini akan membawa Anda ke status file terakhir yang direkam.

11
25 февр. jawabannya diberikan shah1988 25 Feb. 2014-02-25 17:01 '14 pada 17:01 2014-02-25 17:01

Bagi saya, tidak ada jawaban yang tampak sangat jelas.