Apakah ada cara untuk pergi melalui berbagai berkomitmen pada sebuah file. Mengatakan saya memodifikasi file 5 kali dan saya ingin kembali untuk mengubah 2, setelah saya sudah berkomitmen dan mendorong ke repositori.
Dalam pemahaman saya adalah satu-satunya cara untuk menyimpan banyak cabang, aku punya itu benar? Jika saya'm kanan saya'm akan memiliki ratusan cabang di beberapa hari, jadi saya'm mungkin tidak memahami hal ini benar-benar.
Siapapun bisa membersihkan itu menyenangkan?
Let's mulai dengan deskripsi kualitatif dari apa yang ingin kita lakukan (ini adalah kata dalam Ben Straub's jawaban). Kami've membuat beberapa jumlah tersebut, lima di antaranya mengubah file yang diberikan, dan kami ingin mengembalikan berkas ke salah satu dari versi sebelumnya. Pertama-tama, git doesn't tetap nomor versi untuk masing-masing file. Itu hanya trek konten - komit pada dasarnya adalah sebuah snapshot dari bekerja pohon, bersama dengan beberapa metadata (misalnya pesan commit). Jadi, kita harus tahu yang komit memiliki versi dari file yang kita inginkan. Setelah kita tahu bahwa, kita'll perlu membuat yang baru menyerahkan kembali berkas tersebut ke negara itu. (Kita bisa't hanya kotoran sekitar dengan sejarah, karena kita've sudah mendorong konten ini, dan editing sejarah macam-macam dengan orang lain.)
Jadi let's mulai dengan mencari komit. Anda dapat melihat komitmen yang telah dibuat modifikasi untuk diberikan file(s) sangat mudah:
git log path/to/file
Jika anda melakukan pesan aren't cukup baik, dan anda perlu untuk melihat apa yang sedang dilakukan untuk file dalam masing-masing komit, gunakan -p/--patch
pilihan:
git log -p path/to/file
Atau, jika anda lebih suka tampilan grafis dari gitk
gitk path/to/file
Anda juga dapat melakukan ini setelah anda've mulai gitk melalui menu view; salah satu pilihan untuk melihat daftar jalur untuk memasukkan.
Either way, anda'akan dapat menemukan SHA1 (hash) dari komit dengan versi file yang anda inginkan. Sekarang, semua yang anda harus lakukan adalah:
# get the version of the file from the given commit
git checkout <commit> path/to/file
# and commit this modification
git commit
(Checkout perintah pertama membaca file ke indeks, maka salinan itu ke bekerja pohon, sehingga ada's tidak perlu menggunakan git add
untuk menambahkannya ke indeks dalam persiapan untuk melakukan.)
Jika file anda mungkin tidak memiliki sejarah yang sederhana (misalnya mengganti nama dan salinan), lihat VonC's komentar yang sangat baik. git
dapat diarahkan untuk pencarian lebih hati-hati untuk hal-hal seperti itu, dengan mengorbankan kecepatan. Jika anda're yakin sejarah's sederhana, anda perlu't repot-repot.
Git adalah sangat fleksibel. Seharusnya kau't perlu ratusan cabang untuk melakukan apa yang anda minta. Jika anda ingin mengembalikan keadaan kembali untuk ke-2 berubah (dan hal ini memang sebuah perubahan yang sudah dilakukan dan didorong), menggunakan git kembali
. Sesuatu seperti:
git revert a4r9593432
di mana a4r9593432 adalah karakter mulai dari hash komit anda ingin kembali keluar.
Jika komit berisi perubahan untuk banyak file, tapi anda hanya ingin kembali hanya satu dari file, anda dapat menggunakan git reset
(ke-2 atau ke-3 bentuk):
git reset a4r9593432 -- path/to/file.txt
# the reverted state is added to the staging area, ready for commit
git diff --cached path/to/file.txt # view the changes
git commit
git checkout HEAD path/to/file.txt # make the working tree match HEAD
Tapi ini cukup kompleks, dan git reset adalah berbahaya. Menggunakan git checkout
Jika anda hanya ingin melihat file yang tampak seperti dalam melakukan x, anda dapat menggunakan git show
:
git show a4r9593432:path/to/file.txt
Untuk semua perintah, ada banyak cara untuk merujuk ke komit selain melalui melakukan hash (lihat Penamaan Melakukan di Git User Manual).
Git doesn't pikir dalam hal versi file. Versi di git merupakan sebuah snapshot dari seluruh pohon.
Mengingat hal ini, apa yang anda benar-benar ingin adalah pohon yang memiliki konten terbaru dari kebanyakan file, tapi dengan isi salah satu file yang sama seperti 5 melakukan yang lalu. Ini akan mengambil bentuk yang baru melakukan di atas yang lama, dan versi terbaru dari pohon akan memiliki apa yang anda inginkan.
Saya don't tahu jika ada's one-liner yang akan kembali dalam satu file untuk isi 5 melakukan yang lalu, tapi lo-fi solusi harus bekerja: checkout master~5
, copy file tersebut ke tempat lain, checkout master
, salin file, kemudian melakukan.
Anda dapat mengambil diff yang membatalkan perubahan yang anda inginkan dan melakukan itu.
E. g. Jika anda ingin membatalkan perubahan dalam range dari..ke
, lakukan hal berikut
git diff to..from > foo.diff # get a reverse diff
patch < foo.diff
git commit -a -m "Undid changes from..to".
Diambil dari sini: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html
git revert <commit>
git reset
git add <path>
git commit ...
git reset --hard # making sure you didn't have uncommited changes earlier
Ini bekerja sangat baik bagi saya.