Git - bekerja pada cabang yang salah - cara menyalin perubahan ke cabang topik yang ada

333

Saya telah mengerjakan sebuah proyek, tetapi sayangnya, saya lupa untuk beralih ke cabang saya, dan karena itu telah bekerja pada master

Bagaimana saya bisa menyalin pekerjaan (3 file) yang saya lakukan di sini dari master, ke cabang saya (dipanggil, misalnya branch123 ) tanpa komit ke master?

Alex
sumber

Jawaban:

540

Kedengarannya seperti yang Anda butuhkan adalah sebagai berikut:

git stash
git checkout branch123
git stash apply

Maka Anda harus kembali ke cabang Anda sendiri tanpa menyentuh cabang master.

gnab
sumber
6
ok- saya menjalankannya, tetapi ketika saya beralih kembali ke master (git checkout master) dan menjalankan status git, file yang sama masih "dimodifikasi" - apakah itu yang diharapkan?
Alex
5
Anda mungkin tidak benar-benar harus menyimpan, jika perbedaan antara cabang Anda saat ini (master) dan cabang topik (branch123) tidak ada di salah satu file yang telah Anda modifikasi secara lokal. Git akan membiarkan Anda cukup memeriksa cabang topik dalam kasus itu.
Cascabel
3
@ Alex: Ya, itu yang diharapkan. Ini tidak melibatkan komitmen. stashmenyimpan modifikasi lokal, lalu stash applymembawanya kembali.
Cascabel
6
bagaimana saya bisa "menyingkirkan" mereka dari cabang utama .. untuk membiarkan itu bersih?
Alex
7
git reset --hard HEADdan Anda kembali ke komit terakhir yang Anda buat ke cabang master Anda.
gnab
46

Jawaban yang diterima adalah yang paling teliti, tetapi ada kasus khusus di mana Anda dapat menyederhanakan. Jika file yang telah Anda modifikasi di direktori kerja identik di keduanya masterdan branch123Anda dapat melakukannya

git checkout branch123

Tidak perlu menyembunyikan apa pun, karena perilaku default checkoutadalah TIDAK menimpa file yang dimodifikasi di direktori kerja Anda, sehingga Anda tidak akan kehilangan apa pun. (Ini sebenarnya disebutkan dalam komentar pertama oleh Cascabel)

Seperti yang orang lain sebutkan di komentar, jika branch123belum ada, Anda bisa melakukannya

git checkout -b branch123

Berdasarkan apa yang saya temukan di sini .

Russel Dirks
sumber
3
Atau, jika Anda ingin membuat cabang baru,git checkout -b newbranch
Phil Mitchell
2
Ini bekerja lebih baik untuk saya daripada simpanan dan itu jauh lebih mudah. Terima kasih!
Matthias
31
Tidak ini tidak berfungsi. Git akan menunjukkan kepada Anda pesan ini: "komit perubahan Anda atau simpanan sebelum Anda bisa berganti cabang."
dsharew
1
@ DerSharew: Ya, Anda benar dalam beberapa kasus, yaitu, jika file yang telah Anda modifikasi di direktori kerja tidak identik di dalam masterdan branch123. Lihat jawaban saya yang diedit.
Russel Dirks
1
Ini bekerja baik untuk saya. Saya belum membuat cabang, jadi saya melakukan ini: git checkout -b newbranchname. Perubahan saya muncul di cabang itu sendiri.
dex3703
6

git stash adalah apa yang kamu butuhkan.

penjelasan lengkap dapat ditemukan di Git-Tools-Stashing

Roee Gavirel
sumber
0

Karena dimungkinkan untuk membuat cabang baru tetapi tidak mungkin untuk checkout cabang yang ada saat memiliki file diperiksa, saya menemukan trik berikut menggunakan cabang sementara untuk bekerja:

Skenario ini berfungsi setidaknya dengan plugin VS 2015 Git tetapi kemungkinan besar akan bekerja dengan alat git apa pun.

  1. checkout dan lakukan perubahan pada file di master (ups !, salah cabang)
  2. buat "temp" cabang baru (atau nama yang tidak digunakan yang Anda pilih) dari master. File yang diperiksa sekarang akan diperiksa dalam temp dan bukan di master.
  3. check-in perubahan untuk temp (master tidak disentuh)
  4. Semuanya sekarang sudah check-in dan dimungkinkan untuk memeriksa cabang yang ada. Lihatlah cabang yang diinginkan (cabang yang ingin saya ubah sejak awal) 3.5 Git Rebase
  5. gabungkan temp ke cabang yang diinginkan. Sekarang perubahannya ada di cabang yang benar.
  6. hapus cabang temp karena tidak diperlukan lagi

EDIT: Saya menemukan bahwa Anda harus melakukan rebase (git rebase --onto) dari temp cabang sebelum melakukan penggabungan. Kalau tidak, perubahan master akan dimasukkan dalam gabungan. Langkah ekstra 3,5 di atas. Lihat lebih lanjut tentang rebase di sini: https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Pasi
sumber
Bisakah Anda menjelaskan lebih lanjut jawaban Anda dengan menambahkan sedikit deskripsi tentang solusi yang Anda berikan?
abarisone
Terima kasih atas tanggapan Anda. Solusinya cukup sederhana dan mengikuti prinsip yang sama dengan solusi "simpanan" kecuali bahwa cabang sementara digunakan sebagai ganti simpanan. Ini lebih nyaman setidaknya untuk pengguna Visual Studio karena simpanan tidak didukung oleh plugin GIT
Pasi