Bagaimana cara membuang komit lokal di Git?

264

Saya telah mengerjakan sesuatu, dan memutuskan itu benar-benar kacau ... setelah melakukan beberapa hal. Jadi saya mencoba urutan berikut:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

Pada titik mana saya menerima pesan itu

Your branch is ahead of 'origin/master' by 2 commits.

Saya ingin membuang komit lokal saya , tanpa harus menghapus direktori lokal saya dan mengunduh ulang semuanya. Bagaimana saya bisa mencapai itu?

Daniel C. Sobral
sumber
6
Tidak perlu melakukan keduanya git fetchdan git pull- tarik adalah kombinasi fetch dan merge.
Eter
12
Catatan untuk pengguna: masalah utama dari pertanyaan ini tidak ada hubungannya dengan pesan "Cabang Anda di depan 'asal / master' oleh N komit." . Tolong berhenti menutup pertanyaan lain sebagai duplikat dari pertanyaan ini karena pesan itu.

Jawaban:

582
git reset --hard origin/master

akan menghapus semua komit yang tidak berada di origin/mastertempat originnama repo dan mastermerupakan nama cabang.

mipadi
sumber
1
Saya pikir sintaks "asal / master", dengan garis miring, disebut repo lokal?
Daniel C. Sobral
9
mipadi: Lebih tepatnya, ini akan mengatur ulang cabang saat ini untuk menunjuk ke komit yang sama dengan asal / master.
Christoffer Hammarström
Ini mengacu pada cabang. origin/masteradalah cabang yang melacak mastercabang originrepo jarak jauh.
mipadi
@ DanielC.Sobral Tidak, origin/masteradalah referensi ke mastercabang dari jarak jauh yang disebut origin.
Matius
1
@ littletiger git tidak melacak folder, hanya file dan jalurnya. Karena itu, ia akan sepenuhnya mengabaikan folder kosong (folder tanpa file, atau hanya file yang diabaikan). Mereka tidak muncul di mana pun karena tidak ada apa-apa di dalamnya.
Mumbleskates
33

Selain itu, terlepas dari jawaban oleh mipadi (yang seharusnya bekerja dengan cara), Anda harus tahu bahwa melakukan:

git branch -D master
git checkout master

juga melakukan apa yang Anda inginkan tanpa having to redownload everything(kutipan Anda diparafrasekan). Itu karena repo lokal Anda berisi salinan repo jarak jauh (dan salinan itu tidak sama dengan direktori lokal Anda, bahkan tidak sama dengan cabang yang Anda periksa).

Memusnahkan cabang sangat aman dan merekonstruksi cabang itu sangat cepat dan tidak melibatkan lalu lintas jaringan. Ingat, git terutama repo lokal dengan desain. Bahkan cabang terpencil memiliki salinan di lokal. Hanya ada sedikit metadata yang memberitahu git bahwa salinan lokal spesifik sebenarnya adalah cabang jarak jauh. Di git, semua file ada di hard disk Anda sepanjang waktu.

Jika Anda tidak memiliki cabang selain master, Anda harus:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp
Slebetman
sumber
4
Tetapi bagaimana hal itu membedakan komit yang dibuat secara lokal dari komit yang dibuat di tempat asal? Bahkan, ia memberi tahu saya bahwaCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral
1. Pada dasarnya semua komitmen adalah sama, terlepas dari apakah itu dilakukan secara lokal atau asal. Yang penting adalah bahwa sejarah disinkronkan dengan benar. Komit lokal Anda hanya akan ada pada titik asal setelah Anda mendorongnya dan secara default git akan menolaknya jika riwayat di tempat asal mungkin berakhir dalam keadaan yang tidak masuk akal.
Slebetman
2
2. Tentu saja Anda tidak dapat menghapus cabang yang sedang diperiksa. Untuk menghapus master, periksa cabang lain terlebih dahulu. Jika tidak ada cabang lain cukup buat cabang sementara:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman
Juga catat tentang apa yang saya katakan tentang salinan lokal dari repo jarak jauh yang berbeda: git tidak akan memungkinkan Anda untuk mengedit atau bahkan melihat file dalam salinan cabang jarak jauh Anda. Ini hanya akan memungkinkan Anda untuk membuat cabang lain dari cabang jarak jauh yang kemudian dapat Anda lihat dan edit. Berdasarkan konvensi, cabang lokal ini memiliki nama yang sama dengan cabang jarak jauh. Anda sebagian benar karena origin/masterada di komputer lokal Anda. Itu salinan lokal Anda (penuh) dari cabang jarak jauh. Cabang terpencil sebenarnya adalah origin master.
Slebetman
Ini berhasil untuk saya. Mungkin git branch -D masteritu tidak perlu, karena seperti yang ditunjukkan itu menghasilkan kesalahan.
Alexis Wilke
15

Apa yang saya lakukan adalah saya mencoba mengatur ulang keras ke HEAD. Ini akan menghapus semua komitmen lokal:

git reset --hard HEAD^
giang nguyen
sumber
Ini adalah jawaban terbaik, itu benar-benar berhasil. Buang semua komit lokal dan setel ulang ke HEAD. Apa gunanya ^ char?
karim
@karim the '^' mungkin adalah regex stuff, yang mungkin sesuatu yang cukup dalam yang saya tidak tahu atau baca dulu di file manual .. maaf man :)
giang nguyen
1
Terlambat, tetapi ^mewakili komit induk, jadi mengatur ulang untuk HEAD^membuang perubahan yang tidak dikomit dan memindahkan cabang ke komit sebelumnya, secara efektif "menghapus" komit terbaru (meskipun komit masih ada, cabang tidak menunjuk ke sana). Jawabannya hanya memiliki satu komit lokal dan sisanya adalah perubahan yang tidak dikomit. @karim @giang
QuantumQuaver
3

Anda harus berlari

git fetch

Untuk mendapatkan semua perubahan dan kemudian Anda tidak akan menerima pesan dengan "cabang Anda ada di depan".

Володимир Пасіка
sumber
5
Pengambilan tidak ada hubungannya dengan masalah utama penanya, yaitu menyingkirkan komitmen lokal.
1
bagaimana jika saya sudah melakukan file di lokal dan kemudian mencoba menjalankan perintah yang disebutkan. Ini akan menampilkan pesan kesalahan yang sama. Saya mencoba git fetch dan git fetch -p juga. tetapi menunjukkan kesalahan yang sama
Morez
1

Saya telah melihat contoh di mana remote menjadi tidak sinkron dan perlu diperbarui. Jika a reset --hardatau branch -Dgagal berfungsi, cobalah

git pull origin
git reset --hard 
Jim Clouse
sumber
ini tidak menjawab pertanyaan, reset --hardberhasil dalam situasi ini
CharlesB
1
Hai Charles, Anda benar yang reset --hardseharusnya bekerja di sini. Namun, saya hanya menunjukkan bahwa kadang-kadang gagal untuk mereset cabang dengan benar dan git pull originakan menyinkronkan ulang remote dan memungkinkan reset --hardberfungsi dengan baik.
Jim Clouse
0

Saya harus melakukan:

git checkout -b master

seperti yang dikatakan git bahwa itu tidak ada, karena sudah dihapus dengan

git -D master
lereng
sumber