Saya telah melakukan sedikit pekerjaan yang adil ("Cabang Anda unggul dari 'asal / master' dengan 37 komitmen.") Yang benar-benar harus pergi ke cabang sendiri daripada ke master
. Komit ini hanya ada pada mesin lokal saya dan belum didorong origin
, tetapi situasinya agak rumit di mana pengembang lain telah mendorong origin/master
dan saya telah menarik perubahan itu.
Bagaimana cara memindahkan 37 komit lokal saya secara retroaktif ke cabang baru? Berdasarkan dokumen, tampak bahwa git rebase --onto my-new-branch master
atau ...origin/master
harus melakukan ini, tetapi keduanya hanya memberi saya kesalahan "fatal: Needed a single revisi". man git-rebase
mengatakan apa-apa tentang memberikan revisi rebase
dan contoh-contohnya tidak melakukannya, jadi saya tidak tahu bagaimana menyelesaikan kesalahan ini.
(Perhatikan bahwa ini bukan duplikat dari Pindahkan pekerjaan yang sudah ada dan tidak dikomit ke cabang baru di Git atau Bagaimana cara menggabungkan perubahan tidak mengikat lokal saya ke cabang Git lain? Karena pertanyaan-pertanyaan itu berurusan dengan perubahan yang tidak dikomit di pohon kerja lokal, bukan perubahan yang memiliki telah dilakukan secara lokal.)
Jawaban:
Ini seharusnya baik-baik saja, karena Anda belum mendorong komitmen Anda di tempat lain, dan Anda bebas untuk menulis ulang sejarah cabang Anda setelahnya
origin/master
. Pertama saya akan menjalankangit fetch origin
untuk memastikan bahwaorigin/master
itu up to date. Dengan asumsi bahwa Anda sedang aktifmaster
, Anda seharusnya dapat melakukan:... yang akan memutar ulang semua komit Anda yang tidak
origin/master
keorigin/master
. Tindakan default rebase adalah mengabaikan komit gabungan (mis. Komit yanggit pull
mungkin Anda perkenalkan) dan itu hanya akan mencoba menerapkan tambalan yang diperkenalkan oleh setiap komit Andaorigin/master
. (Anda mungkin harus menyelesaikan beberapa konflik di sepanjang jalan.) Kemudian Anda dapat membuat cabang baru berdasarkan hasilnya:... lalu atur
master
kembali Anda keorigin/master
:Ketika melakukan manipulasi cabang semacam ini dengan
git branch
,,git reset
dll. Saya merasa berguna untuk sering melihat grafik commit dengangitk --all
atau alat yang serupa, hanya untuk memeriksa apakah saya memahami di mana semua referensi yang berbeda menunjuk.Atau, Anda bisa saja membuat cabang topik berdasarkan di mana master Anda berada di tempat pertama (
git branch new-work-including-merges
) dan kemudian mengatur ulangmaster
seperti di atas. Namun, karena cabang topik Anda akan menyertakan gabungan dariorigin/master
dan Anda belum mendorong perubahan Anda, saya sarankan melakukan rebase sehingga sejarahnya lebih rapi. (Juga, saat Anda akhirnya menggabungkan cabang topik Anda kembali untuk dikuasai, perubahannya akan lebih jelas.)sumber
master
; rebase menulis ulangmaster
cabang sehingga komit baru secara linear di atasorigin/master
, kemudiangit branch new-work
membuatnew-work
cabang menunjuk pada ujungmaster
(cabang saat ini) tanpa mengalihkan cabang saat ini kenew-work
. Jadi sekarangnew-work
berisi semua komitmen baru. Kemudian reset akan memindahkan cabang saat ini (masihmaster
) kembali keorigin/master
.git reset
dan berbagai cara lainnya. Itugit branch new-work
hanya mengatakan "buat cabang menunjuk komit ini sementara saya tetap di cabang saya saat ini (yang adalah master dalam hal ini)". Jadi tidak perlu memiliki perintah yang memindahkan komit dari master ke cabang baru - Anda cukup membuat cabang baru di sana dan ketika Anda mengatur ulang master, cabang baru ditinggalkan di tempat master beradaJika Anda memiliki # komitmen rendah dan Anda tidak peduli jika ini digabungkan menjadi satu mega-komit, ini bekerja dengan baik dan tidak seseram yang dilakukan
git rebase
:unstage file (ganti 1 dengan # dari commit)
buat cabang baru
tambahkan perubahan
membuat komitmen
sumber
git log --all --decorate --oneline --graph
.Saya terjebak dengan masalah yang sama. Saya telah menemukan solusi termudah yang ingin saya bagikan.
1) Buat cabang baru dengan perubahan Anda.
2) (Opsional) Tekan kode cabang baru pada server jarak jauh.
3) Checkout kembali ke cabang utama.
4) Atur ulang kode cabang utama dengan server jarak jauh dan hapus komit lokal.
sumber
Satu lagi cara menganggap branch1 - adalah cabang dengan perubahan berkomitmen branch2 - adalah cabang yang diinginkan
pilih id komitmen yang harus Anda pindahkan
Sekarang kembalikan komitmen yang tidak dicopot dari cabang awal
sumber
Atau, tepat setelah Anda komit ke cabang yang salah, lakukan langkah-langkah ini:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
Saya bisa membayangkan bahwa ada pendekatan yang lebih sederhana untuk langkah satu dan dua.
sumber
Bagaimana dengan:
git reset
kembali ke komit terakhir sebelum Anda mulai membuat perubahan.git pull
untuk menarik kembali hanya perubahan jarak jauh yang Anda buang dengan reset.Atau akankah itu meledak ketika Anda mencoba untuk menggabungkan kembali cabang?
sumber
Ini cara yang lebih sederhana:
Buat cabang baru
Di cabang baru Anda lakukan a
git merge master
- ini akan menggabungkan perubahan yang Anda komit (tidak didorong) ke cabang baru AndaHapus cabang master lokal Anda
git branch -D master
Gunakan-D
bukan-d
karena Anda ingin memaksa menghapus cabang.Lakukan saja
git fetch
pada cabang master Anda dan lakukangit pull
pada cabang master Anda untuk memastikan Anda memiliki kode terbaru tim Anda.sumber
Pendekatan yang lebih sederhana, yang telah saya gunakan (dengan asumsi Anda ingin memindahkan 4 commit):
(Lihat di direktori tempat Anda mengeksekusi perintah terakhir untuk 4
.patch
file)Kemudian:
Dalam urutan apa pun yang Anda inginkan.
sumber
Lihat salinan sumber Anda yang baru
git clone ........
Buat cabang dari posisi yang diinginkan
git checkout {position}
git checkout -b {branch-name}
Tambahkan repositori jarak jauh
git remote add shared ../{original sources location}.git
Dapatkan sumber jarak jauh
git fetch shared
Periksa cabang yang diinginkan
git checkout {branch-name}
Gabungkan sumber
git merge shared/{original branch from shared repository}
sumber
Bagi saya ini adalah cara terbaik:
git fetch
git branch my-changes
dan dorong ke jarak jauhgit master -u upstream-branch remotes/origin/my-changes
git branch master --set-upstream-to remotes/origin/master
sumber