Ketika saya sudah bekerja sedikit dengan kode sumber saya, saya melakukan komit hal biasa dan kemudian saya mendorong ke repositori jarak jauh. Tapi kemudian saya perhatikan saya lupa mengatur impor saya dalam kode sumber. Jadi saya melakukan perintah amend untuk mengganti komit sebelumnya:
> git commit --amend
Sayangnya komit tidak dapat didorong kembali ke repositori. Ditolak seperti ini:
> git push origin
To //my.remote.repo.com/stuff.git/
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'
Apa yang harus saya lakukan? (Saya dapat mengakses repositori jarak jauh.)
git
git-commit
amend
Spoike
sumber
sumber
git push -force
lebih hati-hati .Jawaban:
Saya pernah mendorong
--force
dan.git
repositori dan dimarahi oleh Linus BIG TIME . Secara umum ini akan menciptakan banyak masalah bagi orang lain. Jawaban sederhana adalah "Jangan lakukan itu".Saya melihat orang lain memberikan resep untuk melakukannya, jadi saya tidak akan mengulanginya di sini. Tapi di sini ada tip untuk pulih dari situasi setelah Anda mendorong komit yang diubah dengan --force (atau + master).
git reflog
untuk menemukan komit lama yang Anda ubah (sebut sajaold
, dan kami akan memanggil komit baru yang Anda buat dengan mengubahnew
).old
dannew
, merekam pohonnew
, sukagit checkout new && git merge -s ours old
.git merge master
git push . HEAD:master
Maka orang-orang yang cukup malang untuk mendasarkan pekerjaan mereka pada komit yang Anda lupakan dengan mengubah dan memaksakan dorongan akan melihat hasil gabungan akan melihat bahwa Anda
new
lebih menyukaiold
. Penggabungan mereka nanti tidak akan melihat konflik antaraold
dannew
yang dihasilkan dari amandemen Anda, sehingga mereka tidak harus menderita.sumber
git reflog
untuk menemukannyaAnda melihat fitur keamanan Git. Git menolak untuk memperbarui cabang jarak jauh dengan cabang Anda, karena komit cabang Anda bukan keturunan langsung dari komit kepala saat ini dari cabang yang Anda dorong.
Jika ini tidak terjadi, maka dua orang yang mendorong ke repositori yang sama pada waktu yang sama tidak akan tahu bahwa ada komit baru yang datang pada saat yang sama dan siapa pun yang mendorong terakhir akan kehilangan pekerjaan pendorong sebelumnya tanpa salah satu dari keduanya. mereka menyadari hal ini.
Jika Anda tahu bahwa Anda adalah satu-satunya orang yang mendorong dan Anda ingin mendorong komit yang diubah atau mendorong komit yang memutar kembali cabang, Anda dapat 'memaksa' Git untuk memperbarui cabang jarak jauh dengan menggunakan
-f
sakelar.Bahkan ini mungkin tidak berfungsi karena Git memungkinkan repositori jarak jauh untuk menolak dorongan tidak cepat di ujung dengan menggunakan variabel konfigurasi
receive.denynonfastforwards
. Jika demikian, alasan penolakan akan terlihat seperti ini (perhatikan bagian 'jauh ditolak'):Untuk menyiasatinya, Anda harus mengubah konfigurasi repositori jarak jauh atau sebagai peretasan kotor yang dapat Anda hapus dan buat kembali cabang dengan demikian:
Secara umum parameter terakhir yang
git push
menggunakan format<local_ref>:<remote_ref>
, di manalocal_ref
adalah nama cabang pada repositori lokal danremote_ref
adalah nama cabang pada repositori jarak jauh. Pasangan perintah ini menggunakan dua singkatan.:master
memiliki local_ref nol yang berarti mendorong cabang null ke sisi jarak jauhmaster
, yaitu menghapus cabang jarak jauh. Nama cabang tanpa:
berarti mendorong cabang lokal dengan nama yang diberikan ke cabang jauh dengan nama yang sama.master
dalam situasi ini adalah kependekan darimaster:master
.sumber
git gc
kali reflog telah kadaluarsa benda-benda lama akan dipangkas. Tidak seorang pun yang mengkloning repositori akan mendapatkan objek apa pun yang tidak lagi dapat dijangkau segera setelah cabang diperbarui.Kata-kata kasar: Fakta bahwa tidak ada yang memposting jawaban sederhana di sini menunjukkan permusuhan pengguna yang ditunjukkan oleh Git CLI.
Ngomong-ngomong, cara "jelas" untuk melakukan ini, dengan asumsi Anda belum mencoba untuk memaksa, adalah menarik terlebih dahulu. Ini menarik perubahan yang telah Anda ubah (dan tidak lagi dimiliki) sehingga Anda memilikinya lagi.
Setelah Anda menyelesaikan konflik apa pun, Anda dapat mendorong lagi.
Begitu:
Jika Anda mendapatkan kesalahan saat menarik, mungkin ada sesuatu yang salah dalam konfigurasi repositori lokal Anda (saya punya ref yang salah di bagian cabang .git / config).
Dan kemudian
Mungkin Anda akan mendapatkan komitmen ekstra dengan subjek yang bercerita tentang "Penggabungan Trivial".
sumber
git push -f
ataugit reset
satu-satunya cara untuk pergi ke sini.Jawaban singkat: Jangan memaksakan komitmen yang diubah ke repo publik.
Jawaban panjang: Beberapa perintah Git, seperti
git commit --amend
dangit rebase
, sebenarnya menulis ulang grafik sejarah. Ini baik-baik saja selama Anda belum mempublikasikan perubahan Anda, tetapi begitu Anda melakukannya, Anda benar-benar tidak boleh berkutat dengan sejarah, karena jika seseorang sudah mendapatkan perubahan Anda, maka ketika mereka mencoba menariknya lagi, itu mungkin gagal . Alih-alih mengubah komit, Anda harus membuat komit baru dengan perubahan.Namun, jika Anda benar-benar ingin mendorong komit yang diubah, Anda dapat melakukannya seperti ini:
Tanda terkemuka
+
akan memaksa dorongan untuk terjadi, bahkan jika itu tidak menghasilkan komitmen "maju cepat". (Komitmen maju cepat terjadi ketika perubahan yang Anda dorong adalah keturunan langsung dari perubahan yang sudah ada dalam repo publik.)sumber
git push -f
.Ini adalah cara yang sangat sederhana dan bersih untuk mendorong perubahan Anda setelah Anda membuat
commit --amend
:Yang melakukan hal berikut:
Ingatlah untuk mengubah "asal" dan "master" jika menerapkan ini ke cabang lain atau jarak jauh.
sumber
git add
sebelum komit saya untuk memasukkan perubahan.git reset --soft "HEAD^"
. Sisanya bekerja dengan baik.Saya telah menyelesaikannya dengan membuang komit yang diubah lokal saya dan menambahkan perubahan baru di atas:
sumber
Saya memiliki masalah yang sama.
Sebagai seorang pemula Git, saya pikir itu FUBAR lengkap .
Solusi: Agak seperti @bara menyarankan + membuat cabang cadangan lokal
Mungkin itu bukan solusi yang cepat dan bersih, dan saya kehilangan sejarah (1 melakukan alih-alih 5), tapi itu menyelamatkan pekerjaan sehari.
sumber
Jika Anda belum mendorong kode ke cabang jarak jauh Anda (GitHub / Bitbucket), Anda dapat mengubah pesan komit pada baris perintah seperti di bawah ini.
Jika Anda bekerja pada cabang tertentu, lakukan ini:
Jika Anda sudah mendorong kode dengan pesan yang salah, maka Anda harus berhati-hati saat mengubah pesan. yaitu setelah Anda mengubah pesan komit dan mencoba mendorongnya lagi Anda akhirnya memiliki masalah. Untuk membuatnya lancar ikuti langkah-langkah berikut.
Harap baca seluruh jawaban sebelum melakukannya
Catatan penting: Saat Anda menggunakan push paksa secara langsung, Anda mungkin berakhir dengan masalah kode yang sedang dikerjakan pengembang lain di cabang yang sama. Jadi untuk menghindari konflik tersebut, Anda perlu menarik kode dari cabang Anda sebelum memaksa :
Ini adalah praktik terbaik saat mengubah pesan komit, jika sudah didorong.
sumber
--force
, lihat jawaban yang diterimaJika Anda tahu tidak ada yang menarik komit yang tidak diubah, gunakan
--force-with-lease
opsigit push
.Di TortoiseGit, Anda dapat melakukan hal yang sama di bawah opsi "Push ..." "Force: May discard" dan memeriksa "perubahan yang diketahui".
sumber
Anda mendapatkan kesalahan ini karena remote Git sudah memiliki file komit ini. Anda harus memaksa mendorong cabang agar ini berfungsi:
Pastikan juga Anda menarik kode dari jarak jauh karena orang lain di tim Anda mungkin telah mendorong ke cabang yang sama.
Ini adalah salah satu kasus di mana kita harus memaksakan komit ke remote.
sumber
Ini adalah cara yang sangat sederhana dan bersih untuk mendorong perubahan Anda setelah Anda membuat
git add "your files"
dangit commit --amend
:atau:
sumber
Jika Anda menggunakan Visual Studio Code, Anda dapat mencoba ekstensi ini untuk membuatnya lebih mudah.
https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force
Seperti yang dapat Anda pahami dari namanya, ia menjalankan perintah secara berurutan
git commit --amend
git push --force
sumber
Saya harus memperbaiki masalah ini dengan menarik dari repo jarak jauh dan menangani konflik gabungan yang muncul, komit dan kemudian dorong. Tapi saya merasa ada cara yang lebih baik.
sumber
Saya terus melakukan apa yang diperintahkan Git agar saya lakukan. Begitu:
Catatan: Komit yang diamandemen adalah yang terbaru.
sumber
Berikut ini berfungsi untuk saya ketika mengganti Pengarang dan Pengalih komit.
git push -f origin master
Git cukup pintar untuk mengetahui bahwa ini adalah komitmen dari delta identik yang hanya berbeda di bagian informasi meta.
Kepala daerah dan kepala daerah menunjuk ke komit yang bersangkutan.
sumber
Di sini, Bagaimana saya memperbaiki suntingan di komit sebelumnya:
git stash
Sekarang copy pekerjaan Anda bersih pada keadaan komit terakhir Anda.git commit --all --amend
Editor Anda akan muncul meminta pesan log (secara default, pesan log lama). Simpan dan keluar dari editor jika Anda senang.
Perubahan baru ditambahkan ke komit lama. Lihat sendiri
git log
dan dengangit diff HEAD^
Terapkan ulang perubahan simpanan Anda, jika dilakukan:
git stash apply
sumber