Bagaimana saya bisa melakukan hal berikut di Git?
Cabang saya saat ini adalah branch1 dan saya telah membuat beberapa perubahan lokal. Namun, saya sekarang menyadari bahwa saya sebenarnya bermaksud menerapkan perubahan ini ke branch2. Apakah ada cara untuk menerapkan / menggabungkan perubahan ini sehingga menjadi perubahan lokal pada branch2 tanpa melakukan mereka di branch1?
Jawaban:
Karena file Anda belum berkomitmen di
branch1
:atau
Seperti yang dikomentari oleh benjohn (lihat
git stash
halaman manual ):sumber
-u
, sehingga:git stash -u
.Menyimpan, melakukan sementara dan rebasing mungkin semua berlebihan. Jika Anda belum menambahkan file yang diubah ke indeks, maka Anda mungkin bisa checkout cabang lain.
Ini akan berfungsi selama tidak ada file yang Anda edit berbeda antara branch1 dan branch2. Ini akan meninggalkan Anda di branch2 dengan Anda perubahan kerja dipertahankan. Jika mereka berbeda maka Anda dapat menentukan bahwa Anda ingin menggabungkan perubahan lokal Anda dengan perubahan yang diperkenalkan dengan beralih cabang dengan
-m
opsi untuk checkout.Jika Anda telah menambahkan perubahan pada indeks maka Anda ingin membatalkan perubahan ini dengan reset terlebih dahulu. (Ini akan mempertahankan copy pekerjaan Anda, itu hanya akan menghapus perubahan bertahap).
sumber
checkout -m
tidak "aman" dalam beberapa situasi (mungkin itu akan menyebabkan konflik gabungan), apakah simpanan akan memberikan keuntungan (misalnya, bisakah Anda mencopot pop simpanan)?.orig
?Alternatif yang lebih pendek dari pendekatan simpanan yang disebutkan sebelumnya adalah:
git stash
git stash branch new_branch_name
Lalu adil
add
dancommit
perubahan ke cabang baru ini.sumber
PERINGATAN: Tidak untuk pemula git.
Ini muncul cukup dalam alur kerja saya bahwa saya hampir mencoba untuk menulis perintah git baru untuk itu.
git stash
Aliran biasa adalah cara untuk pergi tetapi sedikit canggung. Saya biasanya membuat komitmen baru terlebih dahulu karena jika saya telah melihat perubahan, semua informasi baru dalam pikiran saya dan lebih baik untuk memulaigit commit
apa yang saya temukan (biasanya perbaikan bug milik master yang saya temukan saat mengerjakan sebuah cabang fitur) segera.Jadi bagaimana saya mencapai ini seperti ini:
git commit
perubahan segera dengan pesan komit yang baik.git reset HEAD~1
untuk membatalkan komit dari cabang saat ini.Kadang-kadang nanti (tidak sinkron), atau langsung di jendela terminal lain:
cd my-project-master
yang merupakan WD lain berbagi sama.git
git reflog
untuk menemukan perbaikan bug yang baru saja saya buat.git cherry-pick SHA1
dari komit.Opsional (masih asinkron) Anda kemudian dapat rebase (atau menggabungkan) cabang fitur Anda untuk mendapatkan perbaikan bug, biasanya ketika Anda akan mengirimkan PR dan telah membersihkan cabang fitur Anda dan WD sudah:
cd my-project
yang merupakan WD utama yang sedang saya kerjakan.git rebase master
untuk mendapatkan perbaikan bug.Dengan cara ini saya dapat terus bekerja pada fitur tanpa gangguan dan tidak perlu khawatir tentang
git stash
-ing apa pun atau harus membersihkan WD saya sebelumgit checkout
(dan kemudian memeriksa fitur cabang backout lagi.) Dan masih memiliki semua perbaikan bug saya pergimaster
bukannya disembunyikan di cabang fitur saya.IMO
git stash
dangit checkout
merupakan PIA nyata ketika Anda sedang mengerjakan beberapa fitur besar.sumber
my-project-master
berbagi sama.git
merek terdengar seperti itu. Mengapa tidakgit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
, kemudian (asynchronous) saatmaster
,git cherry-pick <SHA1 of the commit(s) in bugfixABC
? (atau bahkan, untuk menghindari keharusan mengetahui SHA1,,git rebase --onto master feature bugfixABC
dari cabang mana pun Anda berada saat ini. Yang berarti Anda bisa melakukan itu langsung setelah yang digit reset
atas, selagifeature
.)checkout -m
ini lebih baik.Jika itu tentang perubahan yang dilakukan, Anda harus melihat pada git-rebase, tetapi seperti yang ditunjukkan dalam komentar oleh VonC, ketika Anda berbicara tentang perubahan lokal, git-simpanan tentu akan menjadi cara yang baik untuk melakukan ini.
sumber
Jawaban yang diberikan sejauh ini tidak ideal karena mereka membutuhkan banyak pekerjaan yang tidak perlu untuk menyelesaikan konflik penggabungan, atau mereka membuat terlalu banyak asumsi yang sering salah. Ini adalah cara melakukannya dengan sempurna. Tautannya ke situs saya sendiri.
Bagaimana Berkomitmen pada Cabang Lain di git
Anda memiliki perubahan tanpa komitmen pada komitmen
my_branch
yang ingin Anda komitmaster
, tanpa melakukan semua perubahan darimy_branch
.Contoh
Penjelasan
Mulailah dengan menggabungkan
master
ke cabang Anda, karena bagaimanapun Anda harus melakukan itu pada akhirnya, dan sekarang adalah waktu terbaik untuk menyelesaikan konflik apa pun.The
-u
pilihan (alias--include-untracked
) digit stash -u
mencegah Anda dari kehilangan file yang tidak terlacak saat nanti lakukangit clean -f -d
dalammaster
.Setelah
git checkout master
itu penting bahwa Anda TIDAKgit stash pop
, karena Anda akan membutuhkan simpanan ini nanti. Jika Anda pop simpanan dibuat dalammy_branch
dan kemudian melakukangit stash
dimaster
, Anda akan menyebabkan konflik merge perlu ketika Anda nantinya menerapkan simpanan yang dimy_branch
.git reset
unstages semua yang dihasilkan darigit stash apply
. Misalnya, file yang telah dimodifikasi di simpanan tetapi tidak ada dimaster
dipentaskan sebagai konflik "dihapus oleh kami".git checkout .
dangit clean -f -d
buang semua yang tidak dilakukan: semua perubahan pada file yang dilacak, dan semua file dan direktori yang tidak dilacak. Mereka sudah disimpan di simpanan dan jika dibiarkanmaster
akan menyebabkan konflik penggabungan yang tidak perlu saat beralih kembali kemy_branch
.Yang terakhir
git stash pop
akan didasarkan pada yang aslimy_branch
, dan karenanya tidak akan menyebabkan konflik penggabungan. Namun, jika simpanan Anda berisi file-file yang tidak terlacak yang telah Anda komit untuk dikuasai, git akan mengeluh bahwa itu "Tidak dapat mengembalikan file-file yang tidak dilacak dari simpanan". Untuk menyelesaikan konflik ini, menghapus file-file dari pohon Anda bekerja, makagit stash pop
,git add .
, dangit reset
.sumber