Git: "Saat ini tidak di cabang mana pun." Apakah ada cara mudah untuk kembali ke cabang, sambil menjaga perubahan?


201

Jadi saya telah melakukan beberapa pekerjaan di repositori dan ketika saya akan melakukan saya menyadari bahwa saya saat ini tidak di cabang apa pun.

Ini sering terjadi ketika bekerja dengan submodula dan saya bisa menyelesaikannya, tetapi prosesnya membosankan dan saya sudah berpikir bahwa pasti ada cara yang lebih mudah untuk melakukan ini.

Apakah ada cara mudah untuk kembali ke cabang, sambil menjaga perubahan?

Jawaban:


213

Jika Anda belum berkomitmen:

git stash
git checkout some-branch
git stash pop

Jika Anda sudah berkomitmen dan belum mengubah apa pun sejak:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Jika Anda telah berkomitmen dan kemudian melakukan pekerjaan ekstra:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
Yang ini tidak membantu jika Anda sudah berkomitmen. Tidak ada downvote karena itu tidak ditentukan dalam pertanyaan.
Dean Agak

24
jika Anda sudah melakukan komitmen: perhatikan hash dari commit yang Anda buat (gunakan git showatau git rev-parse HEAD), pindah ke cabang dan kemudian git cherry-pickdiikuti oleh hash komit.
araqnid

7
Jika berkomitmen, dapatkan hash dari komitmen terakhir. Periksa cabang yang Anda inginkan, dangit merge _hash_
Daniel

HATI-HATI BENAR-BENAR. JIKA ANDA TELAH MEMBERITAHU PERUBAHAN dan Anda mengikuti langkah-langkah ini ... Anda akan melihat pesan ... "Cabang dan asal / master Anda telah menyimpang".
thinkanotherone

1
@thinkanotherone Jika Anda telah melakukan perubahan Anda sudah tidak akan ada simpanan dan memeriksa cabang yang berbeda bukanlah akhir dari dunia. Komit yang baru saja Anda buat masih ada di sana dan Anda dapat menggabungkannya ke cabang itu dengan menggunakan git merge <hash-of-the-commit-you-just-made>.
Erik B

160

ini membantu saya

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
Jika Anda sudah membuat banyak komitmen, inilah yang perlu Anda lakukan.
Benjamin Oakes

Belum mencobanya, tetapi sepertinya itu akan berhasil. Namun saya pikir ini skenario yang tidak mungkin. Saya percaya sebagian besar orang akan menyadari bahwa mereka tidak ada di cabang mana pun sebelum mereka berkomitmen dan menggunakan jawaban yang diterima untuk memperbaikinya.
Erik B

49
Anda akan terkejut.
Eric

@ ErikB Aku bahkan tidak tahu ada yang namanya tidak berada di cabang. Jawaban ini sangat membantu saya.
Konstantin Schubert

2
jawaban yang bagus, sebenarnya hanya mengetiknya dan bekerja, tidak seperti hampir semua hal lain yang ditemui sebagai pemula GIT - Anda mungkin ingin menunjukkan bahwa newbranch adalah nama yang mencolok dan tidak dimaksudkan untuk diganti dengan hash komit
Toni Leigh

22
git checkout master

Hasilnya kira-kira seperti ini:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Jadi, mari kita lakukan:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Saya tidak mencobanya, tetapi sepertinya itu akan bekerja dengan baik. Saya kira jika Anda akan menjalankan git gcantara menjalankan dua perintah Anda akan kehilangan komit itu, tetapi kecuali jika Anda menjalankan git gcsecara otomatis ini harus menjadi pendekatan yang bebas risiko cukup. Saya masih akan pergi dengan jawaban babay, tetapi jika Anda ingin menyelamatkan diri dari menulis dua perintah tambahan saya kira ini adalah cara untuk pergi.
Erik B

Saya telah meninggalkan cabang master di beberapa titik, bahwa saya tidak sepenuhnya yakin. Saya telah melakukan perubahan saya, tidak ada perubahan pada master. Instruksi ini membawa perubahan saya ke cabang utama dan semuanya baik.
Matti Jokipii

+1 Saya merasa gugup memeriksa cabang lain sambil meninggalkan komitmen, melihat pesan ini menambah kepercayaan diri untuk melakukannya.
J-Dizzle

11

Meninggalkan jalan lain di sini

git branch newbranch
git checkout master 
git merge newbranch 

3
@ ErikB Dia mungkin telah melakukan banyak komit. Dalam hal ini, lihat jawaban babay.
Benjamin Oakes

@BenjaminOakes Mungkin begitu, tetapi perintah git ini bahkan tidak valid.
Erik B

@ ErikB Benar sekali. :) jawaban babay adalah bentuk yang valid dari apa yang tampaknya telah coba dilakukan oleh Alex.
Benjamin Oakes

9

Atau, Anda dapat mengatur submodul Anda sehingga alih-alih berada dalam status kepala terpisah yang default, Anda memeriksa cabang.

Diedit untuk menambahkan:

Salah satu caranya adalah dengan checkout cabang tertentu dari submodule ketika Anda menambahkannya dengan flag -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Cara lain adalah dengan masuk ke direktori submodule dan check it out

git checkout master

1
Bisakah Anda memberi tahu saya cara melakukannya?
Erik B

adakah cara untuk memperbarui submodule yang ada mode cabang default ini? memperbarui gitmodulesmungkin?
Hertzel Guinness

@HertzelGuinness Tidak juga. Naskah diperiksa di komit tertentu. Cabang hanyalah sebuah penunjuk ke sha dan sha yang ditunjuknya dapat berubah. Ini tidak berguna karena tidak membekukan status submodule yang sudah diperiksa. Memeriksa cabang adalah hal yang mudah jika Anda membuat perubahan pada submodule.
Abizern

5

Salah satu cara untuk berakhir dalam situasi ini adalah setelah melakukan rebase dari cabang terpencil. Dalam hal ini, komit baru ditunjukkan oleh HEADtetapi mastertidak menunjukkan mereka - itu menunjuk ke mana pun itu sebelum Anda rebased cabang lain.

Anda dapat membuat komitmen ini menjadi yang baru masterdengan melakukan:

git branch -f master HEAD
git checkout master

Ini secara paksa memperbarui masterke titik HEAD(tanpa menempatkan Anda pada master) kemudian beralih ke master.


Bekerja seperlunya. Saya sudah mengatur file dan melakukan, tetapi tidak bisa mendorong karena kesalahan di atas. Di atas dua baris kode berfungsi dengan baik dan mendorong kode saya seperti yang diharapkan.
invinciblemuffi

4

Saya baru-baru ini mengalami masalah ini lagi. Sudah lama sejak saya terakhir bekerja dengan submodules dan setelah belajar lebih banyak tentang git saya menyadari bahwa hanya memeriksa cabang yang ingin Anda komit sudah cukup. Git akan menjaga pohon yang berfungsi meskipun Anda tidak menyembunyikannya.

git checkout existing_branch_name

Jika Anda ingin bekerja di cabang baru, ini akan berfungsi untuk Anda:

git checkout -b new_branch_name

Checkout akan gagal jika Anda memiliki konflik di pohon kerja, tetapi itu harus sangat tidak biasa dan jika itu terjadi, Anda dapat menyimpannya, pop dan menyelesaikan konflik.

Dibandingkan dengan jawaban yang diterima, jawaban ini akan menyelamatkan Anda dari eksekusi dua perintah, itu tidak terlalu lama untuk dijalankan. Karena itu saya tidak akan menerima jawaban ini, kecuali secara ajaib mendapat lebih banyak upvotes (atau paling tidak dekat) daripada jawaban yang saat ini diterima.


2

Metode berikut dapat berfungsi:

git rebase HEAD master
git checkout master

Ini akan mengubah perubahan HEAD Anda saat ini di atas master. Kemudian Anda bisa mengganti cabang.


Cara alternatif adalah dengan checkout cabang pertama:

git checkout master

Maka Git harus menampilkan SHA1 dari komitmen Anda yang terpisah, maka Anda dapat memilihnya, mis

git cherry-pick YOURSHA1

Atau Anda juga dapat menggabungkan yang terbaru:

git merge YOURSHA1

Untuk melihat semua komit Anda dari cabang yang berbeda (untuk memastikan Anda sudah mereka), jalankan: git reflog.


0

Saya tahu saya memberi tahu babay pada 2012 bahwa saya pikir tidak mungkin seseorang tidak menyadari bahwa mereka tidak berada di cabang dan melakukan. Ini baru saja terjadi pada saya, jadi saya rasa saya harus mengakui bahwa saya salah, tetapi mengingat bahwa perlu waktu hingga 2016 untuk ini terjadi pada saya, Anda bisa berpendapat bahwa itu sebenarnya tidak mungkin.

Lagi pula, membuat cabang baru menurut saya berlebihan. Yang harus Anda lakukan adalah:

git checkout some-branch
git merge commit-sha

Jika Anda tidak menyalin komit-sha sebelum memeriksa cabang lain, Anda dapat dengan mudah menemukannya dengan menjalankan:

git reflog

ini adalah masalah yang jarang (tidak mungkin) untuk satu orang. Itu tidak terjadi pada saya sejak 2012. Tetapi jika Anda mengalikan kesempatan dengan jumlah pengguna git ... Itu akan sangat mungkin. Itu mungkin terjadi setiap hari pada seseorang. :)
babay
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.