Buat cabang Git dengan perubahan saat ini

851

Saya mulai mengerjakan cabang utama saya dengan berpikir bahwa tugas saya akan mudah. Setelah beberapa saat saya menyadari bahwa itu akan membutuhkan lebih banyak pekerjaan dan saya ingin melakukan semua pekerjaan ini di cabang baru.

Bagaimana saya bisa membuat cabang baru dan membawa semua perubahan ini tanpa master kotor ?

willcodejavaforfood
sumber
4
Ya ini adalah pertanyaan duplikat, tetapi kata-katanya sangat berbeda sehingga saya pikir ini berguna untuk disimpan. Perhatikan kata kunci di sini: branch current changesvs existing uncommited branch. Siapa pun yang berbicara bahasa Inggris akan segera melihat bahwa mereka sama, tetapi mesin pencari mungkin tidak. Simpan pertanyaan ini.
Scott Biggs

Jawaban:

691

Jika Anda belum membuat komitmen, hanya (1: cabang) dan (3: checkout) sudah cukup.
Atau, dalam satu perintah:git checkout -b newBranch

Seperti yang disebutkan di git resethalaman manual :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Anda telah membuat beberapa komitmen, tetapi sadari mereka terlalu dini untuk berada di mastercabang " ". Anda ingin melanjutkan memolesnya di cabang topik, jadi buat " topic/wip" cabang dari arus HEAD.
  2. Putar ulang mastercabang untuk menyingkirkan ketiga komitmen tersebut.
  3. Beralih ke topic/wipcabang " " dan terus bekerja.

Catatan: karena efek "destruktif" dari sebuah git reset --hardperintah (perintah ini mengatur ulang indeks dan pohon kerja. Setiap perubahan pada file yang dilacak di pohon kerja sejak <commit>dibuang), saya lebih suka menggunakan:

$ git reset --soft HEAD~3  # (2)

Ini akan memastikan saya tidak kehilangan file pribadi apa pun (tidak ditambahkan ke indeks).
The --softpilihan untuk tidak akan menyentuh file indeks maupun pohon bekerja sama sekali (tapi me-reset kepala untuk <commit>, seperti semua mode lakukan).


Dengan Git 2.23+ , perintah barugit switch akan membuat cabang dalam satu baris (dengan jenis yang sama reset --hard, jadi waspadalah terhadap efeknya):

git switch -f -c topic/wip HEAD~3
VONC
sumber
6
Mungkin juga perlu dicatat bahwa ini bukan ide yang baik jika Anda telah mengkomit materi topik ke cabang master Anda di repositori yang menarik orang lain. Atau setidaknya, jika Anda perlu melakukan reset Anda harus memberi tahu orang-orang bahwa Anda melakukan hal itu sehingga peringatan dari tarikan mereka berikutnya tidak terlalu mengejutkan.
Andrew Walker
39
Catatan untuk pembaca masa depan: baca dari bawah ke atas (atau pastikan untuk membaca semuanya). git reset --hardakan membatalkan perubahan Anda, dan jika itu belum dilakukan, itu tidak dapat dipulihkan! Anda mungkin perlugit checkout -b …
Conrad Meyer
3
@ConradMeyer Poin bagus. Saya telah mengedit jawaban dan menempatkan yang git checkout -bpertama.
VonC
5
Mengapa topik / cabang ?? mengapa tidak hanya nama cabang, apakah ada alasan khusus untuk penamaan ini? hanya ingin tahu.
Sam Stoelinga
1
@Ini hanyalah konvensi penamaan namespace (cara untuk dengan mudah mengklasifikasikan cabang, menggunakan nama cabang hierarkis untuk mendefinisikan ruang nama): stackoverflow.com/a/2527436/6309 . Misalnya, untuk masalah: randyfay.com/content/… . Anda tidak harus menggunakan hierarki saat memberi nama cabang Anda. topic_wipakan bekerja juga;)
VonC
269

Seperti yang dinyatakan dalam pertanyaan ini: Git: Buat cabang dari perubahan tidak bertanda / tidak dikomit pada master : simpanan tidak diperlukan.

Cukup gunakan:

git checkout -b topic/newbranch

Setiap pekerjaan yang tidak berkomitmen akan dibawa ke cabang baru.

Jika Anda mencoba mendorong Anda akan mendapatkan pesan berikut

fatal: Fitur cabang saat ini / NEWBRANCH tidak memiliki cabang upstream. Untuk mendorong cabang saat ini dan mengatur remote sebagai upstream, gunakan

git push --set-upstream origin feature/feature/NEWBRANCH

Lakukan seperti yang disarankan untuk membuat cabang dari jarak jauh:

git push --set-upstream origin feature/feature/NEWBRANCH

EeKay
sumber
3
Anda akan mendapatkan kesalahan 'no upstream branch' hanya jika Anda mendorong cabang baru, bukan saat Anda melakukan pekerjaan baru.
sam
2
@ Sam Saya telah mengubah jawaban sesuai
Nick Kennedy
73

Ikuti langkah ini:

  1. Buat cabang baru:

    git branch newfeature
    
  2. Periksa cabang baru: (ini tidak akan mengatur ulang pekerjaan Anda.)

    git checkout newfeature
    
  3. Sekarang lakukan pekerjaan Anda di cabang baru ini:

    git commit -s
    

Menggunakan langkah-langkah di atas akan membuat cabang asli Anda bersih dan Anda tidak perlu melakukan 'git reset --hard'.

AvadhP
sumber
3
Apa yang dilakukan '-s' pada langkah 3?
Scott Biggs
12
@ScottBiggs Tidak perlu, tetapi praktik yang diikuti beberapa orang. Ini adalah kependekan dari "--signoff" dan menambahkan nama pengguna Anda ke komit untuk orang-orang di masa depan yang melihat log untuk mengetahui bahwa Anda menyetujui komit ini.
Frank Bryce
5
Jawaban yang bagus, tetapi tidak perlu -spada langkah 3.
Mohammed Ali
Saya belajar sesuatu yang baru dari komentar, Terima kasih @FrankBryce
Kasparov92
30

Karena Anda belum melakukan komitmen apa pun, Anda dapat menyimpan semua perubahan Anda ke simpanan, membuat dan beralih ke cabang baru, lalu seret perubahan itu kembali ke pohon kerja Anda:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list
Eter
sumber
9
atau seperti yang ditunjukkan VonC 'git checkout -b newbranch' dan lewati simpanan
willcodejavaforfood
@will: Saya berpikir bahwa membuat cabang baru akan menimpa perubahan yang tidak dikomit yang Anda miliki, tetapi jika ini tidak terjadi, ya Anda dapat melewati simpanan.
Eter
1
Saya mencobanya dan itu bekerja dengan baik, git sangat bijaksana dan tidak akan menimpa setiap perubahan lokal
willcodejavaforfood
2
Saya menganggap itu salah ketik tetapi hanya kepala yang git stash pushbukan perintah. Anda mungkin ingin menggunakan git stashatau git stash save. Jika Anda ingin memasukkan file yang tidak terlacak dalam simpanan, gunakan --include-untrackedopsi. Demikian juga, jika Anda ingin memasukkan file yang tidak terlacak dan diabaikan dalam simpanan, gunakan --addopsi sebagai gantinya.
Enam
jika Anda sudah membuat cabang, ini sangat membantu.
Tentunya
13

Untuk menambahkan perubahan baru ke cabang baru dan mendorong ke jarak jauh:

git branch branch/name
git checkout branch/name
git push origin branch/name

Seringkali saya lupa menambahkan bagian asal untuk mendorong dan bingung mengapa saya tidak melihat cabang baru / komit di bitbucket

Patrick Schaefer
sumber