Pertanyaan Bagaimana cara mengembalikan semua perubahan lokal dalam proyek yang dikelola Git ke keadaan sebelumnya?


Saya memiliki proyek di mana saya berlari git init. Setelah beberapa komit, saya melakukannya git status yang memberi tahu saya semuanya sudah diperbarui dan tidak ada perubahan lokal.

Lalu saya melakukan beberapa perubahan berturut-turut dan menyadari bahwa saya ingin membuang semuanya dan kembali ke keadaan semula. Apakah perintah ini akan melakukannya untuk saya?

git reset --hard HEAD

1544
2017-07-18 07:52


asal


Jawaban:


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

git checkout .

Jika Anda ingin mengembalikan perubahan yang dibuat ke indeks (yaitu, bahwa Anda telah menambahkan), lakukan ini. Peringatan ini akan mengatur ulang semua komitmen Anda yang tidak dipalsukan untuk dikuasai!:

git reset

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

git revert <commit 1> <commit 2>

Jika Anda ingin menghapus file yang tidak terlacak (mis., File baru, file yang dibuat):

git clean -f

Atau direktori yang tidak terlacak (mis., Direktori baru atau yang dibuat secara otomatis):

git clean -fd

2808
2017-07-18 07:57



Catatan: Anda mungkin juga ingin menjalankan

git clean -fd

sebagai

git reset --hard

akan tidak hapus file yang tidak terlacak, sedangkan git-clean akan menghapus file apa pun dari direktori akar yang dilacak yang tidak berada di bawah pelacakan git. PERINGATAN - HATI-HATI DENGAN INI! Sangat membantu untuk menjalankan dry-run dengan git-clean terlebih dahulu, untuk melihat apa yang akan dihapus.

Ini juga sangat berguna ketika Anda mendapatkan pesan kesalahan

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

Yang dapat terjadi ketika melakukan beberapa hal, salah satunya adalah mengupdate copy pekerjaan saat Anda dan teman Anda telah menambahkan file baru dengan nama yang sama, tetapi ia melakukan itu menjadi kontrol sumber terlebih dahulu, dan Anda tidak peduli tentang menghapus salinan yang tidak terlacak. .

Dalam situasi ini, melakukan lari kering juga akan membantu menunjukkan daftar file yang akan ditimpa.


334
2017-07-20 05:37



Jika Anda ingin mengembalikan semua perubahan DAN up-to-date dengan master jarak jauh saat ini (misalnya Anda menemukan bahwa master HEAD telah bergerak maju sejak Anda mencabangnya dan push 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.

58
2018-04-22 20:48



Lihatlah ke git-reflog. Ini akan membuat daftar semua negara yang diingatnya (standarnya adalah 30 hari), dan Anda cukup membayar yang Anda inginkan. Sebagai contoh:

$ 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

47
2017-07-19 12:16



Re-klon

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  Apakah menghapus lokal, perintah tidak didorong
  •  Kembalikan perubahan yang Anda buat ke file yang dilacak
  •  Memulihkan file yang dilacak yang Anda hapus
  •  Menghapus file / dirs yang tercantum dalam .gitignore (seperti file build)
  •  Menghapus file / direktori yang tidak dilacak dan tidak masuk .gitignore
  •  Anda tidak akan melupakan pendekatan ini
  •  Limbah bandwidth

Berikut ini adalah perintah lain yang saya lupa setiap hari.

Bersihkan dan setel ulang

git clean -f -d -x
git reset --hard
  •  TIDAK menghapus komit lokal yang tidak didorong
  •  Kembalikan perubahan yang Anda buat ke file yang dilacak
  •  Memulihkan file yang dilacak yang Anda hapus
  •  Menghapus file / dirs yang tercantum dalam .gitignore (seperti file build)
  •  Menghapus file / direktori yang tidak dilacak dan tidak masuk .gitignore

Bersih

git clean -f -d -x
  •  TIDAK menghapus komit lokal yang tidak didorong
  •  TIDAK TIDAK mengembalikan perubahan yang Anda buat pada file yang dilacak
  •  Apakah TIDAK mengembalikan file yang dilacak yang Anda hapus
  •  Menghapus file / dirs yang tercantum dalam .gitignore (seperti file build)
  •  Menghapus file / direktori yang tidak dilacak dan tidak masuk .gitignore

Setel ulang

git reset --hard
  •  TIDAK menghapus komit lokal yang tidak didorong
  •  Kembalikan perubahan yang Anda buat ke file yang dilacak
  •  Memulihkan file yang dilacak yang Anda hapus
  •  Menghapus file / dirs yang tercantum dalam .gitignore (seperti file build)
  •  Apakah TIDAK menghapus file / dirs yang tidak dilacak dan tidak masuk .gitignore

Catatan

Test case untuk mengkonfirmasikan semua hal di atas (gunakan 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 revert untuk membuat komitmen baru yang membatalkan komitmen sebelumnya
  • git checkout untuk kembali ke waktu sebelumnya (mungkin mengharuskan menjalankan perintah di atas terlebih dahulu)
  • git stash sama dengan git reset di atas, tetapi Anda dapat membatalkannya

40
2018-03-20 12:37



BAHAYA DEPAN: (silakan baca komentar. Menjalankan perintah yang diusulkan dalam jawaban saya mungkin menghapus lebih dari yang Anda inginkan)

untuk menghapus semua file termasuk direktori yang harus saya jalankan

git clean -f -d

34
2017-09-11 07:10



Setelah membaca sekumpulan jawaban dan mencobanya, saya telah menemukan berbagai macam kasus yang berarti terkadang mereka tidak sepenuhnya membersihkan copy pekerjaan.

Inilah skrip bash saya saat ini untuk melakukannya, yang bekerja sepanjang waktu.

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

Jalankan dari direktori root copy pekerjaan.


34
2018-06-04 07:25



katakan saja

git stash

itu akan menghapus semua chages lokal Anda. dan Anda juga bisa menggunakannya nanti dengan mengatakan

git stash apply 

29
2018-04-24 12:18



Saya bertemu masalah yang sama. Solusinya adalah menggunakan git log untuk mencari versi komit lokal yang berbeda dari remote. (Misalnya, versi ini 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Kemudian gunakan git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec untuk mengembalikan perubahan.


26
2017-08-28 07:34