Pertanyaan Git: Buat cabang dari perubahan yang tidak diubah / tidak terikat pada master


Konteks: Saya sedang mengerjakan master menambahkan fitur sederhana. Setelah beberapa menit saya menyadari itu tidak sesederhana itu dan seharusnya lebih baik untuk bekerja ke cabang baru.

Ini selalu terjadi pada saya dan saya tidak tahu bagaimana beralih ke cabang lain dan mengambil semua perubahan tanpa ini dengan saya meninggalkan cabang master bersih. aku seharusnya git stash && git stash branch new_branch hanya akan mencapai itu tetapi ini adalah apa yang saya dapatkan:

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ echo "hello!" > testing 

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)

~/test $ git s
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git checkout master
M   testing
Switched to branch 'master'

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

Apakah Anda tahu jika ada cara untuk mencapai ini?


789
2018-04-02 22:09


asal


Jawaban:


Tidak perlu repot.

git checkout -b new_branch_name

tidak menyentuh perubahan lokal Anda. Itu hanya menciptakan cabang dari HEAD saat ini dan menetapkan HEAD di sana. Jadi saya rasa itu yang Anda inginkan.

--- Edit untuk menjelaskan hasil master checkout ---

Apakah Anda bingung karena checkout master tidak membuang perubahan Anda?

Karena perubahan hanya bersifat lokal, git tidak ingin Anda kehilangannya terlalu mudah. Setelah mengubah cabang, git tidak menimpa perubahan lokal Anda. Hasil dari Anda checkout master aku s:

M   testing

, artinya file kerja Anda tidak bersih. git memang mengubah HEAD, tetapi tidak menimpa file lokal Anda. Itulah mengapa status terakhir Anda masih menunjukkan perubahan lokal Anda, meskipun Anda sedang aktif master.

Jika Anda benar-benar ingin membuang perubahan lokal, Anda harus memaksa checkout -f.

git checkout master -f

Karena perubahan Anda tidak pernah dilakukan, Anda akan kehilangan mereka.

Cobalah untuk kembali ke cabang Anda, lakukan perubahan, lalu periksa master lagi.

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

Anda harus mendapatkan M pesan setelah checkout pertama, tetapi kemudian tidak lagi setelah checkout master, dan git status seharusnya tidak menunjukkan file yang diubah.

--- Edit untuk mengosongkan kebingungan tentang direktori kerja (file lokal) ---

Sebagai jawaban atas komentar pertama Anda, perubahan lokal hanya ... yah, lokal. Git tidak menyimpannya secara otomatis, Anda harus memberitahukannya untuk menyimpannya untuk nanti. Jika Anda membuat perubahan dan tidak secara eksplisit berkomitmen atau menyimpannya, git tidak akan meng-versinya. Jika Anda mengubah KEPALA (checkout master), perubahan lokal tidak ditimpa karena belum disimpan.


941
2018-04-02 22:25



Mencoba:

git stash
git checkout -b new-branch
git stash apply

50
2018-04-02 22:15



Dua hal yang dapat Anda lakukan:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

atau

git stash -u
git branch sillyname stash@{0}

(git checkout - <- dasbor adalah jalan pintas untuk cabang sebelumnya yang Anda ikuti)

(git stash -u <- the -u berarti itu juga mengambil perubahan yang tidak berubah)


15
2018-01-13 21:38



Jika Anda menggunakan klien GitHub Windows (seperti saya) dan Anda berada dalam situasi yang membuat perubahan tidak terikat yang ingin Anda pindahkan ke cabang baru, Anda cukup "Crate a new branch" melalui klien GitHub. Ini akan beralih ke cabang yang baru dibuat dan mempertahankan perubahan Anda.

enter image description here


4
2017-09-13 13:35