Bagaimana cara mereset cabang lokal saya menjadi seperti cabang pada repositori jarak jauh?
Aku melakukannya:
git reset --hard HEAD
Tapi ketika saya menjalankan git status
,
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: java/com/mycompany/TestContacts.java
modified: java/com/mycompany/TestParser.java
Bisakah Anda memberi tahu saya mengapa saya memiliki ini 'dimodifikasi'? Saya belum menyentuh file-file ini? Jika saya melakukannya, saya ingin menghapusnya.
git status
perintah kedua Andagit reset --hard HEAD
gagal. Anda tidak menempelkan hasilnya. → Pertanyaan tidak lengkap.git status
bunyinyanothing to commit, working directory clean
. - Silakan tentukan!Jawaban:
Mengatur cabang Anda agar sama persis dengan cabang jarak jauh dapat dilakukan dalam dua langkah:
Jika Anda ingin menyimpan status cabang saat ini sebelum melakukan ini (untuk berjaga-jaga), Anda dapat melakukan:
Sekarang pekerjaan Anda disimpan di cabang "my-save-work" jika Anda memutuskan ingin kembali (atau ingin melihatnya nanti atau membandingkannya dengan cabang yang diperbarui).
Perhatikan bahwa contoh pertama mengasumsikan bahwa nama repo jarak jauh adalah "asal" dan bahwa cabang bernama "master" di repo jarak jauh cocok dengan cabang yang saat ini check-out di repo lokal Anda.
BTW, situasi di mana Anda berada terlihat sangat buruk seperti kasus umum di mana dorongan telah dilakukan ke cabang repositori non-telanjang saat ini diperiksa. Apakah Anda baru saja mendorong repo lokal Anda? Jika tidak, maka jangan khawatir - sesuatu yang lain pasti menyebabkan file-file ini tiba-tiba berubah. Jika tidak, Anda harus menyadari bahwa tidak disarankan untuk mendorong ke repositori yang tidak kosong (dan tidak ke cabang yang saat ini telah ditutup, khususnya).
sumber
git reset FETCH_HEAD --hard
, juga, itu artinya sama.Saya perlu melakukan (solusi dalam jawaban yang diterima):
Diikuti oleh:
untuk menghapus file lokal
Untuk melihat file apa yang akan dihapus (tanpa benar-benar menghapusnya):
sumber
git clean -d -f
jika ada direktori terlacak hadir.git clean -fdx
git clean -f
adalah bagian penting yang saya butuhkan. Terima kasih!Pertama, setel ulang ke
HEAD
cabang hulu yang diambil sebelumnya :Keuntungan dari menentukan
@{u}
atau bentuk verbose-nya@{upstream}
adalah bahwa nama repo dan cabang jarak jauh tidak harus secara eksplisit ditentukan.Selanjutnya, sesuai kebutuhan, hapus file yang tidak terlacak, secara opsional juga dengan
-x
:Akhirnya, sesuai kebutuhan, dapatkan perubahan terbaru:
sumber
origin/master
@{upstream}
sangat berguna dan dapat digunakan dalam alias:alias resetthisbranch="git reset --hard @{upstream}"
git reset --hard
memerlukan komit, kalau tidak, tidak akan tahu harus mengatur ulang apa.@{u}
menunjuk ke komit tertentu - kepala cabang yang dilacak, sejak terakhir kali Anda melakukan agit fetch
.git reset --hard
meskipun tidak akan diatur ulang ke cabang jauhgit reset --hard "@{u}"
). Butuh waktu beberapa saat untuk memikirkannya.git reset --hard HEAD
sebenarnya hanya me-reset ke kondisi komitmen terakhir. Dalam hal ini KEPALA mengacu pada KEPALA cabang Anda.Jika Anda memiliki beberapa komitmen, ini tidak akan berhasil ..
Apa yang mungkin ingin Anda lakukan, adalah mengatur ulang ke kepala asal atau apa pun yang Anda sebut repositori jarak jauh. Saya mungkin hanya akan melakukan sesuatu seperti
Berhati-hatilah. Reset keras tidak mudah dibatalkan. Lebih baik dilakukan seperti yang disarankan Dan, dan cabut salinan perubahan Anda sebelum mengatur ulang.
sumber
Semua saran di atas benar, tetapi seringkali untuk benar - benar mengatur ulang proyek Anda, Anda juga perlu menghapus bahkan file yang ada di dalam Anda
.gitignore
.Untuk mendapatkan persamaan moral dengan menghapus direktori proyek Anda dan kloning ulang dari jarak jauh adalah:
Peringatan :
git clean -x -d -f
tidak dapat dipulihkan dan Anda dapat kehilangan file dan data (mis. Hal-hal yang Anda abaikan menggunakan.gitignore
).sumber
git clean -xdf
itu sama dengangit clean -x -d -f
.Gunakan perintah di bawah ini. Perintah-perintah ini juga akan menghapus semua file yang tidak terlacak dari git lokal
sumber
git clean -d -f
kita masih akan memiliki beberapa hal dari cabang lama di direktori lokal. Terima kasih sobat.Pertanyaannya mencampur dua masalah di sini:
git status
dikatakannothing to commit, working directory clean.
Jawabannya adalah:
git fetch --prune
(opsional) Memperbarui snapshot lokal repo jarak jauh. Perintah selanjutnya hanya bersifat lokal.git reset --hard @{upstream}
Letakkan penunjuk cabang lokal ke tempat snapshot jarak jauh, serta atur indeks dan direktori kerja ke file komit itu.git clean -d --force
Menghapus file dan direktori yang tidak terlacak yang menghalangi git untuk mengatakan "direktori kerja bersih".sumber
@{upstream}
sintaks membutuhkan hulu menjadi set yang terjadi secara default jika Andagit checkout <branchname>
. - Kalau tidak gantikan denganorigin/<branchname>
.-x
kegit clean
untuk menghapus semua yang tidak ada dalam komit (yaitu file bahkan diabaikan dengan mekanisme .gitignore).Ini adalah sesuatu yang saya hadapi secara teratur, & Saya telah menyamaratakan naskah yang disediakan Wolfgang di atas untuk bekerja dengan cabang mana pun
Saya juga menambahkan prompt "Apakah Anda yakin", & beberapa output umpan balik
sumber
Asalkan repositori jarak jauh itu
origin
, dan Anda tertarik padabranch_name
:Anda juga harus mereset cabang
origin
ke saat iniHEAD
.Bagaimana itu bekerja:
git fetch origin
mengunduh yang terbaru dari jarak jauh tanpa mencoba menggabungkan atau mengubah apa pun.Kemudian
git reset
reset<branch_name>
cabang ke apa yang baru saja Anda ambil. The--hard
pilihan perubahan semua file dalam pohon kerja Anda untuk mencocokkan file dalamorigin/branch_name
.sumber
Aku melakukannya:
untuk benar-benar mereset cabang
perhatikan, Anda harus checkout ke cabang lain untuk dapat menghapus cabang yang diperlukan
sumber
Berikut ini adalah skrip yang mengotomatiskan apa yang disarankan oleh jawaban paling populer ... Lihat https://stackoverflow.com/a/13308579/1497139 untuk versi yang disempurnakan yang mendukung cabang
sumber
Jika Anda memiliki masalah seperti saya, bahwa Anda telah melakukan beberapa perubahan, tetapi sekarang, untuk alasan apa pun Anda ingin menyingkirkannya, cara tercepat adalah menggunakan
git reset
seperti ini:Saya memiliki 2 komitmen yang tidak diperlukan, karenanya angka 2. Anda dapat mengubahnya ke jumlah komit Anda sendiri untuk diatur ulang.
Jadi, jawab pertanyaan Anda - jika Anda 5 berkomitmen lebih dulu dari HEAD repositori jarak jauh, Anda harus menjalankan perintah ini:
Perhatikan bahwa Anda akan kehilangan perubahan yang Anda buat, jadi berhati-hatilah!
sumber
Jawaban sebelumnya berasumsi bahwa cabang yang akan disetel ulang adalah cabang saat ini (dicentang). Dalam komentar, OP hap497 mengklarifikasi bahwa cabang memang diperiksa, tetapi ini tidak secara eksplisit diperlukan oleh pertanyaan awal. Karena setidaknya ada satu pertanyaan "duplikat", Reset cabang sepenuhnya ke keadaan repositori , yang tidak menganggap bahwa cabang dicentang, inilah alternatifnya:
Jika cabang "mybranch" saat ini tidak dicentang, untuk mengatur ulang ke cabang "myremote / mybranch" cabang jauh, Anda dapat menggunakan perintah tingkat rendah ini :
Metode ini membiarkan cabang yang diperiksa keluar, dan pohon yang bekerja tidak tersentuh. Itu hanya memindahkan kepala mybranch ke komitmen lain, apa pun yang diberikan sebagai argumen kedua. Ini sangat membantu jika beberapa cabang perlu diperbarui ke head jarak jauh yang baru.
Namun, berhati-hatilah saat melakukan ini, dan gunakan
gitk
atau alat serupa untuk mengecek sumber dan tujuan. Jika Anda secara tidak sengaja melakukan ini pada cabang saat ini (dan git tidak akan menghindarkan Anda dari hal ini), Anda mungkin menjadi bingung, karena konten cabang yang baru tidak cocok dengan pohon kerja, yang tidak berubah (untuk memperbaiki, perbarui cabang lagi, ke tempat sebelumnya).sumber
Inilah yang sering saya gunakan:
Perhatikan bahwa itu adalah praktik yang baik untuk tidak membuat perubahan untuk menguasai lokal / mengembangkan cabang, melainkan checkout ke cabang lain untuk perubahan, dengan nama cabang prepended dengan jenis perubahan, misalnya
feat/
,chore/
,fix/
, dll Jadi Anda hanya perlu tarik perubahan, jangan mendorong perubahan apa pun dari master. Hal yang sama untuk cabang lain yang berkontribusi bagi orang lain. Jadi hal di atas hanya boleh digunakan jika Anda telah melakukan perubahan pada cabang yang telah dilakukan orang lain, dan perlu diatur ulang. Kalau tidak di masa depan hindari mendorong ke cabang yang mendorong orang lain, sebaliknya checkout dan mendorong ke cabang tersebut melalui cabang keluar.Jika Anda ingin mengatur ulang cabang lokal Anda ke komit terbaru di cabang hulu, sejauh ini yang berfungsi untuk saya adalah:
Periksa remote Anda, pastikan hulu dan asal Anda sesuai dengan yang Anda harapkan, jika tidak seperti yang diharapkan
git remote add upstream <insert URL>
, gunakan , mis. Repo GitHub asli yang Anda gunakan , dan / ataugit remote add origin <insert URL of the forked GitHub repo>
.Di GitHub, Anda juga dapat checkout cabang dengan nama yang sama dengan yang lokal, untuk menyimpan pekerjaan di sana, meskipun ini tidak perlu jika asal berkembang memiliki perubahan yang sama dengan cabang disimpan-kerja lokal. Saya menggunakan cabang berkembang sebagai contoh, tetapi bisa berupa nama cabang yang ada.
Kemudian jika Anda perlu menggabungkan perubahan ini dengan cabang lain sementara di mana ada konflik, menjaga perubahan dalam pengembangan, gunakan:
Saat digunakan
untuk mempertahankan perubahan yang bertentangan branch_name. Kalau tidak gunakan mergetool dengan
git mergetool
.Dengan semua perubahan bersama:
Perhatikan bahwa alih-alih hulu / pengembangan Anda dapat menggunakan hash komit, nama cabang lain, dll. Gunakan alat CLI seperti Oh My Zsh untuk memeriksa bahwa cabang Anda berwarna hijau yang menunjukkan bahwa tidak ada yang perlu dikomit dan direktori kerja bersih ( yang dikonfirmasi atau juga dapat diverifikasi oleh
git status
). Perhatikan bahwa ini sebenarnya dapat menambahkan komit dibandingkan dengan pengembangan hulu jika ada sesuatu yang secara otomatis ditambahkan oleh komit, misalnya diagram UML, header lisensi, dll., Jadi dalam hal ini, Anda kemudian dapat menarik perubahanorigin develop
keupstream develop
, jika diperlukan.sumber
Jawabannya
diremehkan ( -d untuk menghapus direktori). Terima kasih!
sumber
git clean -xdf
. Ini akan menghapus semua dan semua file yang tidak diketahui git, dan akan membuat folder Anda sama persis dengan apa yang ada dalam daftar objek git. Perhatikan bahwa Anda dapat menambahkan-n
(misalnyagit clean -nxdf
) untuk melakukan "bagaimana-jika" dan ia akan memberi tahu Anda apa yang akan dihapus tanpa benar-benar melakukan apa pun. ( git clean )Jika Anda ingin kembali ke
HEAD
status untuk direktori kerja dan indeks, maka Anda harusgit reset --hard HEAD
, daripada melakukannyaHEAD^
. (Ini mungkin salah ketik, sama seperti dasbor tunggal versus ganda--hard
.)Adapun pertanyaan spesifik Anda tentang mengapa file-file itu muncul dalam status sebagai diubah, sepertinya Anda melakukan soft reset alih-alih hard reset. Ini akan menyebabkan file yang diubah di
HEAD
komit muncul seolah-olah mereka dipentaskan, yang kemungkinan Anda lihat di sini.sumber
Tidak ada jumlah reset dan pembersihan tampaknya memiliki efek pada file yang tidak terlacak dan dimodifikasi dalam repo git lokal saya (saya mencoba semua opsi di atas). Satu-satunya solusi saya untuk ini adalah dengan repo lokal dan mengkloningnya dari jarak jauh.
Untungnya saya tidak memiliki cabang lain yang saya pedulikan.
xkcd: Git
sumber
Satu-satunya solusi yang berfungsi dalam semua kasus yang saya lihat adalah menghapus dan membatalkan. Mungkin ada cara lain, tapi jelas dengan cara ini tidak ada kemungkinan keadaan lama ditinggalkan di sana, jadi saya lebih suka itu. Bash one-liner yang bisa Anda atur sebagai makro jika Anda sering mengacaukan segalanya di git:
* menganggap file .git Anda tidak rusak
sumber
Apakah Anda lupa membuat cabang fitur dan telah melakukan kesalahan langsung pada master?
Anda dapat membuat cabang fitur sekarang dan mengatur master kembali tanpa mempengaruhi worktree (sistem file lokal) untuk menghindari memicu build, tes, dan masalah dengan kunci file:
sumber
Hanya 3 perintah yang akan membuatnya bekerja
sumber
Jika Anda tidak keberatan menyimpan perubahan lokal, namun masih ingin memperbarui repositori agar sesuai dengan asal / KEPALA, Anda dapat menyimpan simpanan perubahan lokal Anda dan kemudian menarik:
sumber