Pindahkan pekerjaan yang sudah ada dan tidak terikat ke cabang baru di Git

3126

Saya memulai beberapa pekerjaan pada fitur baru dan setelah coding sedikit, saya memutuskan fitur ini harus di cabang sendiri.

Bagaimana cara memindahkan perubahan yang tidak dikomit yang ada ke cabang baru dan mengatur ulang yang sekarang?

Saya ingin mengatur ulang cabang saya saat ini sambil mempertahankan pekerjaan yang ada pada fitur baru.

Dane O'Connor
sumber
Subjek menarik yang sama stackoverflow.com/q/556923/269514 ?
Gilberto

Jawaban:

3642

Gunakan yang berikut ini:

git checkout -b <new-branch>

Ini akan meninggalkan cabang Anda saat ini, buat dan checkout cabang baru dan simpan semua perubahan Anda. Anda kemudian dapat melakukan perubahan pada file yang akan dikomit:

git add <files>

dan komit ke cabang baru Anda dengan:

git commit -m "<Brief description of this commit>"

Perubahan dalam direktori kerja dan perubahan yang dilakukan dalam indeks belum termasuk dalam cabang apa pun. Ini mengubah cabang tempat modifikasi itu akan berakhir.

Anda tidak mengatur ulang cabang asli Anda, tetap seperti apa adanya. Komitmen terakhir <old-branch>masih akan sama. Karena itu Anda checkout -bkemudian berkomitmen.


Pembaruan 2020 / Git 2.23

Git 2.23 menambahkan switchsub -perintah baru dalam upaya untuk menghapus beberapa kebingungan yang berasal dari penggunaan yang berlebihan dari checkout(berpindah cabang, mengembalikan file, melepaskan HEAD, dll.)

Dimulai dengan versi Git ini, ganti perintah di atas dengan:

git switch -c <new-branch>

Perilaku itu identik dan tetap tidak berubah.

rajutan
sumber
15
Hanya untuk memastikan, saya perlu melakukan fitur yang belum selesai SEBELUM saya mengatur ulang cabang asli saya? Atau akankah file-file yang tidak dikomit itu disimpan tanpa peduli melakukan
Dane O'Connor
192
FYI: perubahan dalam direktori kerja dan perubahan yang dilakukan dalam indeks bukan milik cabang. git checkout -b <new branch>perubahan di mana perubahan itu akan berakhir.
Jakub Narębski
152
Jika Anda sudah memiliki cabang dan ingin memindahkan perubahan Anda ke cabang yang ada, checkout stackoverflow.com/questions/556923/…
Chirantan
14
Jika Anda ingin mendorong cabang baru Anda ke repositori jarak jauh: stackoverflow.com/questions/2765421/…
Dewayne
10
@JDSmith: perubahan tidak terikat TIDAK milik cabang apa pun. Mereka hanya berada di direktori kerja git checkout ./ git reset --hardunrecoverably akan menghapus mereka
knittl
330

Kalau tidak:

  1. Simpan perubahan saat ini ke simpanan temp:

    $ git stash

  2. Buat cabang baru berdasarkan simpanan ini, dan beralih ke cabang baru:

    $ git stash branch <new-branch> stash@{0}

Kiat: gunakan tombol tab untuk mengurangi mengetikkan nama simpanan.

Robin Qiu
sumber
51
Jika cabang lain sudah ada, Anda bisa langsung beralih dengan checkout, lalu git stash apply.
Archonic
6
Saya tidak mengerti tip "Tip: gunakan tombol tab untuk mengurangi mengetik nama simpanan." Bukankah "stash @ {0}" namanya? Saya tidak bisa menjalankannya dengan sukses.
Herbert
7
Mengapa ini lebih baik daripada jawaban stackoverflow.com/a/1394804/754997 yang diterima ?
Chris Page
10
Saya tidak mengerti mengapa ini lebih baik daripada jawaban yang diterimagit checkout -b <new branch name>
Noitidart
6
Anda tidak perlu git add -Asebelum menyembunyikannya.
vichle
48

Jika Anda telah membuat komit di cabang utama saat Anda berkode, tetapi sekarang Anda ingin memindahkan komit tersebut ke cabang lain, ini adalah cara cepat:

  1. Salin riwayat Anda saat ini ke cabang baru, bawa juga perubahan yang tidak dikomit:

    git checkout -b <new-feature-branch>
    
  2. Sekarang paksa cabang "berantakan" asli untuk mundur: (tanpa beralih ke sana)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Sebagai contoh:

    git branch -f master origin/master
    

    atau jika Anda telah membuat 4 komitmen:

    git branch -f master HEAD~4
    

Peringatan: git branch -f master origin/master akan mengatur ulang informasi pelacakan untuk cabang itu. Jadi, jika Anda telah mengkonfigurasimastercabangAndauntuk mendorong ke tempat lain selainorigin/masteritu konfigurasi itu akan hilang.

Peringatan: Ada juga bahaya jika Anda rebase setelah bercabang, yang dijelaskan di sini . Satu-satunya cara untuk menghindarinya adalah dengan membuat sejarah baru menggunakan cherry-pick. Tautan itu menjelaskan metode pembodohan yang paling aman . Jika Anda memiliki perubahan yang tidak dikomit, Anda mungkin ingingit stashdi awal dangit stash popdi akhir.

joeytwiddle
sumber
6
Ini menjawab pertanyaan yang sedikit berbeda dari apa yang diminta op. Saya memutuskan untuk meletakkan jawaban ini di sini karena di sinilah Google membawa saya ketika saya sedang mencari jawaban. Pertanyaan aktual yang berhubungan dengan situasi ini ada di sini .
joeytwiddle
26

Skenario umum adalah sebagai berikut: Saya lupa membuat cabang baru untuk fitur baru, dan melakukan semua pekerjaan di cabang fitur lama. Saya telah melakukan semua pekerjaan "lama" ke cabang master, dan saya ingin cabang baru saya tumbuh dari "master". Saya belum membuat komitmen tunggal untuk pekerjaan baru saya. Berikut adalah struktur cabang: "master" -> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
Alex Burov
sumber
18

Jika Anda komit, Anda juga bisa memilih satu komit tunggal. Saya sering melakukan ini ketika saya mulai bekerja di master, dan kemudian ingin membuat cabang lokal sebelum saya mendorong ke asal saya /.

git cherry-pick <commitID>

Ada banyak yang bisa Anda lakukan dengan cherry-pick, seperti yang dijelaskan di sini , tetapi ini bisa menjadi kasus yang berguna bagi Anda.

kata sandi
sumber
2
Solusi yang lebih baik untuk memindahkan perubahan parsial ke cabang baru ... karena Anda dapat melakukan apa yang Anda inginkan untuk saat ini, menyimpan semua perubahan lainnya, periksa cabang yang ingin Anda cabut dari, ceri-pilih yang komit ke cabang baru, kembali ke cabang asli, hard reset kembali komit, lalu lakukan simpanan pop, tambahkan, komit, dan nyanyikan haleluya.
Meredith
1
@ Medith, haha, ya sesuatu seperti itu. Ini bagus, kecuali jika Anda merencanakan perubahan Anda di depan ... dan siapa yang melakukannya;)
kata sandi
1

Sebenarnya ada cara yang sangat mudah untuk melakukan ini dengan GitHub Desktop sekarang yang saya tidak percaya adalah fitur sebelumnya.

Yang perlu Anda lakukan adalah beralih ke cabang baru di GitHub Desktop, dan itu akan meminta Anda untuk meninggalkan perubahan di cabang saat ini (yang akan disimpan), atau membawa perubahan Anda ke cabang baru. Cukup pilih opsi kedua, untuk membawa perubahan ke cabang baru. Anda kemudian dapat melakukan seperti biasa.

GitHub Desktop

Kristofer Doman
sumber
1

Ini mungkin bermanfaat untuk semua alat yang menggunakan GIT

Perintah

Ganti cabang - ini akan memindahkan perubahan Anda ke cabang baru. Kemudian Anda dapat melakukan perubahan.

 $ git checkout -b <new-branch>

TortoiseGIT

Klik kanan pada repositori Anda dan kemudian gunakan TortoiseGit-> Switch / Checkout

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

SourceTree

Gunakan tombol "Checkout" untuk berganti cabang. Anda akan melihat tombol "checkout" di bagian atas setelah mengklik cabang. Perubahan dari cabang saat ini akan diterapkan secara otomatis. Maka Anda dapat melakukan mereka.

masukkan deskripsi gambar di sini

Przemek Struciński
sumber
0

Saya menggunakan @Robin menjawab & mendaftar semua yang saya lakukan,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Jika repo memiliki lebih dari satu simpanan, lihat mana yang akan diterapkan ke cabang baru:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

dan memeriksa simpanan individu dengan,

git stash show stash@{1}

Atau periksa semua simpanan sekaligus:

git stash list -p
NBhat
sumber