Misalkan saya punya 5 commit lokal. Saya ingin mendorong hanya 2 dari mereka ke repo terpusat (menggunakan alur kerja gaya SVN). Bagaimana saya melakukan ini?
Ini tidak berhasil:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
Itu akhirnya mendorong semua 5 komitmen lokal.
Saya kira saya bisa melakukan git reset untuk benar-benar membatalkan komit saya, diikuti oleh git simpanan dan kemudian git push - tapi saya sudah mendapat pesan komit tertulis dan file terorganisir dan saya tidak ingin mengulanginya.
Perasaan saya adalah bahwa beberapa bendera yang dilewati untuk mendorong atau mengatur ulang akan berfungsi.
Jika itu membantu, inilah konfigurasi git saya
[ramanujan:~/myrepo/.git]$cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://server/git/myrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
sumber
master~3
. Referensi apa pun untuk komit "hingga" yang diinginkan sama-sama valid, sepertiHEAD~3
atauHEAD~~~
, atau SHA tertentu, atau tag yang label komit itu.git push
...)master
untuk sisi remote dari refspec, sepertigit push origin tocommit:newbramch
Apa yang saya lakukan adalah bekerja di cabang lokal yang disebut "bekerja". Cabang ini berisi semua komit sementara (seperti workarounds atau opsi build pribadi atau apa pun) yang saya tidak bermaksud untuk mendorong ke repositori hulu. Saya bekerja jauh di cabang itu, kemudian ketika saya ingin berkomitmen saya beralih ke cabang master, cherry-memilih komit sesuai yang saya lakukan ingin berkomitmen, kemudian mendorong guru.
Setelah menarik perubahan dari hulu ke cabang master saya, saya
git checkout work
dangit rebase master
. Itu menulis ulang semua perubahan lokal saya di akhir sejarah.Saya sebenarnya menggunakan
git svn
alur kerja ini, jadi operasi "push" saya melibatkangit svn dcommit
. Saya juga menggunakantig
yang merupakan penampil repositori gui mode teks yang bagus, untuk memilih komit yang sesuai untuk dikuasai.sumber
work
cabang. Kemudian, Anda menggabungkan cabang tertentu ke dalammaster
sehingga Anda tidak kehilangan sejarah pada mereka. Saat bekerja denganwork
, Anda menggabungkan semua cabang Anda ke dalamnya. Ini lebih mahal, tetapi mungkin layak dalam beberapa kasus.Secara default, git-push mendorong semua cabang. Ketika Anda melakukan ini:
Anda pindah ke KEPALA terlepas (Anda tidak berada di cabang apa pun) dan kemudian Anda mendorong semua cabang, termasuk master lokal (yang masih di tempat itu) ke master jarak jauh.
Solusi manual adalah:
Jika Anda menemukan perilaku default mendorong semua cabang membingungkan (dan berbahaya!), Tambahkan ini ke ~ / .gitconfig Anda:
Maka hanya cabang Anda berada di didorong. Dalam contoh Anda (kepala terpisah), Anda akan mendapatkan pesan kesalahan ini, alih-alih secara tidak sengaja memaksakan komitmen yang salah:
sumber
Jawaban singkat:
git push <latest commit SHA1 until you want commits to be pushed>
Contoh:
git push fc47b2
git push HEAD~2
Jawaban panjang:
Komit dihubungkan bersama sebagai rantai dengan mekanisme orang tua / anak. Dengan demikian, mendorong komit sebenarnya juga mendorong semua orangtua berkomitmen untuk komit ini yang mana tidak diketahui oleh remote. Ini secara implisit dilakukan ketika Anda
git push
komit saat ini: semua komit sebelumnya juga didorong karena perintah ini setara dengangit push HEAD
.Jadi pertanyaannya mungkin ditulis ulang menjadi Bagaimana mendorong komit tertentu dan komit spesifik ini mungkin HEAD ~ 2, misalnya.
Jika komit yang ingin Anda tekan tidak berurutan, cukup pesan ulang dengan yang
git rebase -i
sebelum dorongan tertentu .sumber
1) Gunakan "git rebase" untuk menyusun ulang komit Anda, jika Anda mau.
Perintah ini akan menampilkan sesuatu seperti ini di editor Anda (saya menggunakan vim)
2) Susun ulang komit Anda sesuai pilihan Anda dengan tempel sederhana. Misalkan orde baru itu
pilih 9781434 komit
pilih c3d4961 commitC
pilih 4791291 koma
pilih aa1cefc commitD
pilih komit a2bdfbdB
Buat perubahan ini di editor Anda dan tekan ctrl + O (writeOut)
Atau bisa juga Anda gunakan
Anda dapat memeriksa urutan baru dengan
3) Sekarang gunakan
Jika hanya satu cabang di remote (asal) dan satu cabang di lokal (master), gunakan saja
Ini akan mendorong commitB dan commitD.
sumber