Saya hanya menekan beberapa komitmen dengan git rebase
dan melakukan git push --force
(yang jahat, saya tahu).
Sekarang insinyur perangkat lunak lain memiliki sejarah yang berbeda dan ketika mereka melakukan git pull
, Git akan bergabung. Apakah ada cara untuk memperbaikinya, kecuali melakukan rm my-repo; git clone [email protected]:my-repo.git
?
Saya butuh sesuatu seperti kebalikan dari git push --force
, tetapi git pull --force
tidak memberikan hasil yang diinginkan.
git checkout master && git branch -D test && git checkout -b test origin/test
Jawaban:
Untuk menerima komitmen baru
Setel ulang
Anda dapat mengatur ulang komit untuk cabang lokal menggunakan
git reset
.Untuk mengubah komit dari cabang lokal:
Berhati-hatilah, seperti yang dijelaskan dalam dokumentasi:
Jika Anda ingin menyimpan perubahan apa pun yang Anda miliki secara lokal - lakukan
--soft
reset. Yang akan memperbarui histori komit untuk cabang, tetapi tidak mengubah file apa pun di direktori kerja (dan Anda kemudian dapat mengkomitnya).Rebase
Anda dapat memutar ulang komit lokal Anda di atas komit / cabang lain menggunakan
git rebase
:Ini akan meminta rebase dalam mode interaktif di mana Anda dapat memilih bagaimana menerapkan setiap komit yang tidak ada dalam riwayat yang Anda rebase di atas.
Jika komit yang Anda hapus (dengan
git push -f
) telah ditarik ke dalam sejarah lokal, komit tersebut akan didaftar sebagai komit yang akan diterapkan kembali - komit tersebut harus dihapus sebagai bagian dari rebase atau akan dimasukkan kembali ke dalam riwayat untuk cabang - dan muncul kembali dalam sejarah jarak jauh pada dorongan berikutnya.Gunakan bantuan
git command --help
untuk detail dan contoh lebih lanjut tentang salah satu dari perintah di atas (atau lainnya).sumber
git reset origin/otherbranch --hard
reset --hard
, atau Opsi 2:reset --soft
+rebase
, kan?git reset --soft origin/master
akan mengubah histori komit untuk mencocokkan perbedaan remote dan stage ke remote yang kemudian dikomit . Tidak perlu melakukan rebase dalam skenario itu (dan Anda akan dicegah melakukannya karena perubahan yang tidak dikomit) karena tidak ada perbedaan dalam sejarah komit. Kedua opsi diatur ulang atau rebase - bukan kombinasi keduanya. Silakan ajukan pertanyaan jika skenario Anda berbeda dari yang saya jawab di sini.Ini tidak akan memperbaiki cabang yang sudah memiliki kode yang tidak Anda inginkan di dalamnya (lihat di bawah untuk cara melakukannya), tetapi jika mereka telah menarik beberapa cabang dan sekarang ingin itu menjadi bersih (dan bukan "di depan" dari asal / beberapa cabang) maka Anda cukup:
Catatan: Anda dapat menggabungkan semua ini dengan menempatkan && di antaranya
Note2: Florian menyebutkan ini dalam komentar, tetapi siapa yang membaca komentar ketika mencari jawaban?
Note3: Jika Anda memiliki cabang yang terkontaminasi, Anda dapat membuat yang baru berdasarkan "dumb branch" yang baru dan hanya memilih komit.
Ex:
Sekarang fitur-baru adalah cabang Anda tanpa komitmen ekstra (mungkin buruk)!
sumber
git checkout -b base-branch origin/base-branch
dengangit checkout --track origin/base-branch
Tarik dengan rebase
Tarik reguler adalah mengambil + gabungan, tetapi yang Anda inginkan adalah mengambil + rebase. Ini adalah opsi dengan
pull
perintah:sumber