Bagaimana saya mengembalikan semua perubahan lokal dalam Git berhasil proyek ke keadaan sebelumnya?

Saya memiliki sebuah proyek di mana aku berlari git init. Setelah beberapa komit, saya melakukan git status yang mengatakan kepada saya semuanya up to date dan tidak ada perubahan lokal.

Kemudian saya membuat beberapa kali perubahan dan menyadari aku ingin membuang semuanya dan kembali ke keadaan semula. Akan perintah ini akan melakukannya untuk saya?

git reset --hard HEAD
Larutan

Jika anda ingin mengembalikan perubahan yang dibuat ke copy pekerjaan anda, lakukan ini:

git checkout .

Jika anda ingin mengembalikan perubahan yang dibuat untuk indeks (yaitu, bahwa anda telah menambahkan), melakukan ini. Peringatan ini akan me-reset semua komit unpushed untuk menguasai!:

git reset

Jika anda ingin mengembalikan perubahan yang telah anda lakukan, lakukan ini:

git revert  

Jika anda ingin menghapus terpantau file (misalnya, file baru, file yang dihasilkan):

git clean -f

Atau tidak terlacak direktori (misalnya, baru atau dihasilkan secara otomatis direktori):

git clean -fd
Komentar (19)

Catatan: Anda mungkin juga ingin menjalankan

git clean -fd

sebagai

git reset --hard

akan tidak hapus terpantau file, yang mana seperti git-bersih akan menghapus file dari dilacak direktori root yang tidak di bawah git pelacakan. PERINGATAN HATI - HATI DENGAN HAL INI! Hal ini membantu untuk menjalankan kering-lari dengan git-bersihkan terlebih dahulu, untuk melihat apa yang akan dihapus.

Ini juga sangat berguna ketika anda mendapatkan pesan error

~"performing this command will cause an un-tracked file to be overwritten"

Yang dapat terjadi ketika melakukan beberapa hal, salah satu yang menjadi memperbarui kerja copy ketika anda dan teman anda memiliki kedua menambahkan file baru dengan nama yang sama, tapi ia's berkomitmen ke kontrol sumber pertama, dan anda don't peduli tentang menghapus anda tidak terlacak copy.

Dalam situasi ini, melakukan dry run juga akan membantu menampilkan daftar file yang akan ditimpa.

Komentar (4)

Re-clone

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • ✅ Menghapus lokal, non-mendorong komit
  • ✅ Mengembalikan perubahan yang anda buat ke file dilacak
  • ✅ Mengembalikan dilacak file anda dihapus
  • ✅ Menghapus file/direktori yang tercantum dalam .gitignore (seperti membangun file)
  • ✅ Menghapus file/direktori yang tidak dilacak dan tidak dalam .gitignore
  • 😀 Anda tidak't lupa pendekatan ini
  • 😔 Limbah bandwidth

Berikut adalah perintah lain saya lupa sehari-hari.

Bersih dan reset

git clean --force -d -x
git reset --hard
  • ❌ Menghapus lokal, non-mendorong komit
  • ✅ Mengembalikan perubahan yang anda buat ke file dilacak
  • ✅ Mengembalikan dilacak file anda dihapus
  • ✅ Menghapus file/direktori yang tercantum dalam .gitignore (seperti membangun file)
  • ✅ Menghapus file/direktori yang tidak dilacak dan tidak dalam .gitignore

Bersih

git clean --force -d -x
  • ❌ Menghapus lokal, non-mendorong komit
  • ❌ Beralih perubahan yang anda buat ke file dilacak
  • ❌ Mengembalikan dilacak file anda dihapus
  • ✅ Menghapus file/direktori yang tercantum dalam .gitignore (seperti membangun file)
  • ✅ Menghapus file/direktori yang tidak dilacak dan tidak dalam .gitignore

Ulang

git reset --hard
  • ❌ Menghapus lokal, non-mendorong komit
  • ✅ Mengembalikan perubahan yang anda buat ke file dilacak
  • ✅ Mengembalikan dilacak file anda dihapus
  • ❌ Menghapus file/direktori yang tercantum dalam .gitignore (seperti membangun file)
  • ❌ Menghapus file/direktori yang tidak dilacak dan tidak dalam .gitignore

Catatan

Kasus uji untuk mengkonfirmasikan semua di atas (menggunakan bash atau sh):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Lihat juga

  • git kembali untuk membuat baru melakukan yang membatalkan sebelum melakukan
  • git checkout untuk kembali ke masa sebelum melakukan (mungkin memerlukan berjalan di atas perintah pertama)
  • gitsimpanan sama seperti git reset di atas, tetapi anda dapat membatalkannya
Komentar (8)

Jika anda ingin mengembalikan semua perubahan DAN up-to-date dengan arus remote master (misalnya anda menemukan bahwa guru KEPALA telah bergerak maju karena anda bercabang dan mendorong anda sedang 'ditolak'), anda dapat menggunakan

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.
Komentar (1)

Melihat ke git-reflog. Ini akan menampilkan daftar semua negara bagian itu mengingat (default adalah 30 hari), dan anda hanya dapat checkout salah satu yang anda inginkan. Misalnya:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
Komentar (4)

BAHAYA di DEPAN: (mohon baca komentar. Melaksanakan perintah yang diusulkan dalam jawaban saya mungkin akan menghapus lebih dari yang anda inginkan)

untuk benar-benar menghapus semua file termasuk direktori aku harus lari

git clean -f -d
Komentar (3)

hanya mengatakan

git stash

ini akan menghapus semua setempat chages. dan anda juga dapat menggunakan kemudian dengan mengatakan

git stash apply 
Komentar (3)

Setelah membaca banyak jawaban dan mencoba mereka, aku've ditemukan berbagai kasus tepi yang berarti kadang-kadang mereka don't sepenuhnya bersih copy pekerjaan.

Berikut ini's saya saat ini bash script untuk melakukan hal itu, yang bekerja sepanjang waktu.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Lari dari kerja copy direktori root.

Komentar (4)

Saya bertemu masalah yang sama. Solusinya adalah dengan menggunakan git log untuk melihat yang versi lokal melakukan ini berbeda dari remote. (E. g. versi lebih 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Kemudian menggunakan git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec` untuk mengembalikan perubahan.

Komentar (0)

Saya mencari masalah serupa,

Ingin membuang lokal melakukan:

  1. kloning repositori (git clone)
  2. beralih ke dev cabang (git checkout dev)
  3. tidak sedikit yang melakukan (git commit-m "melakukan 1")
  4. tapi memutuskan untuk membuang lokal ini berkomitmen untuk kembali ke remote (asal/dev)

Begitu pula di bawah ini:

git reset --hard origin/dev

Check:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

sekarang setempat melakukan yang hilang, kembali ke awal kloning negara, point 1 di atas.

Komentar (3)

Anda mungkin tidak selalu ingin/perlu untuk menyimpan pekerjaan anda/file dalam direktori kerja anda tapi bukan hanya menyingkirkan mereka sepenuhnya. Perintah git bersih akan melakukan ini untuk anda.

Beberapa kasus penggunaan umum untuk melakukan hal ini akan menghapus cruft yang telah dihasilkan oleh penggabungan, peleburan, atau alat-alat eksternal atau menghapus file-file yang lain sehingga anda dapat menjalankan membangun bersih.

Menjaga dalam pikiran anda akan ingin untuk menjadi sangat berhati-hati perintah ini, karena dirancang untuk memindahkan file dari direktori kerja yang TIDAK DILACAK. jika anda tiba-tiba berubah pikiran setelah mengeksekusi perintah ini, tidak ada akan kembali untuk melihat isi dari file yang telah dihapus. Alternatif yang lebih aman adalah untuk melaksanakan

`git stash --all` 

yang akan menghapus segala sesuatu tetapi menyimpan semua itu dalam simpanan. Simpanan ini dapat kemudian digunakan.

Namun, jika anda benar-benar ingin menghapus semua file dan bersih direktori kerja anda, anda harus menjalankan

git bersih -f -d

Ini akan menghapus semua file dan sub-direktori yang don't memiliki barang-barang sebagai hasil dari perintah. Hal yang cerdas untuk dilakukan sebelum melaksanakan git bersih -f -d perintah untuk menjalankan

git clean -f -d -n

yang akan menampilkan preview dari apa yang AKAN dihapus setelah melaksanakan git bersih -f -d

Jadi di sini adalah ringkasan dari pilihan anda dari yang paling agresif dan paling agresif


1: Menghapus semua file secara lokal(yang Paling agresif)

git clean -f -d

Pilihan 2: Preview atas dampak(Preview paling agresif)

git clean -f -d -n

3: Menyimpan semua file (Paling agresif)

git simpanan-semua

Komentar (0)

Coba ini untuk mengembalikan semua perubahan uncommited di cabang lokal

$ git reset --hard HEAD

Tetapi jika anda melihat kesalahan seperti ini:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

Anda dapat menavigasi ke '.git' folder kemudian menghapus indeks.mengunci file:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Akhirnya, jalankan lagi perintah:

$ git reset --hard HEAD
Komentar (0)