Apakah mungkin di Git untuk beralih ke cabang lain tanpa memeriksa semua file?
Setelah berpindah cabang, saya perlu menghapus semua file, membuat ulang, berkomitmen dan beralih kembali. Jadi memeriksa file hanya membuang-buang waktu (dan ada sekitar 14.000 file - ini adalah operasi yang lama).
Untuk memperjelas:
Saya membutuhkan semua ini untuk mengunggah dokumentasi ke GitHub.
Saya memiliki repositori dengan cabang gh-pages . Ketika saya membangun kembali dokumentasi secara lokal, saya menyalinnya ke direktori repositori, mengkomit dan mendorong ke GitHub. Tetapi saya tidak senang, karena saya memiliki dua salinan dokumentasi secara lokal. Dan saya memutuskan untuk membuat cabang kosong dan setelah melakukan, beralih ke mengosongkan dan menghapus file. Tetapi beralih kembali adalah operasi yang lama - jadi saya mengajukan pertanyaan ini.
Saya tahu bahwa saya dapat meninggalkan cabang gh-pages dan menghapus file, tetapi saya tidak suka pohon kerja yang kotor.
sumber
Jawaban:
Ya, Anda bisa melakukan ini.
Jika Anda perlu berkomitmen pada cabang ini, Anda juga ingin mengatur ulang indeks jika tidak, Anda akan berakhir melakukan sesuatu berdasarkan cabang yang terakhir diperiksa.
sumber
echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEAD
diikuti dengangit reset
untuk menunjuk ke referensi alih-alih cabang.git update-ref HEAD refs/heads/otherbranch
git stash
2.git checkout -b otherBranch
3.git stash pop
git update-ref
berguna, tetapi juga menggerakkan ujung cabang saat ini.Hanya menggunakan perintah git dasar:
Jawaban ini sedikit lebih panjang daripada Charles, tetapi hanya terdiri dari perintah git dasar yang dapat saya pahami dan ingat, menghilangkan kebutuhan untuk terus mencarinya.
Tandai lokasi Anda saat ini (lakukan terlebih dahulu jika perlu):
Setel ulang (memindahkan) penanda ke cabang lain tanpa mengubah dir yang berfungsi:
sekarang temp dan cabang lainnya menunjuk ke komit yang sama, dan direktori kerja Anda tidak tersentuh.
karena HEAD Anda sudah menunjuk ke komit yang sama, dir kerja tidak tersentuh
Perhatikan bahwa perintah ini juga tersedia dari klien grafis mana pun.
sumber
git reset --soft <branch where you want to go>
untuk menghindari memperbarui indeksUntuk kepentingan pembaca:
Meskipun menurut saya solusi Charles Bailey adalah yang benar, solusi ini memerlukan penyesuaian saat beralih ke sesuatu, yang bukan merupakan cabang lokal. Juga harus ada cara bagaimana melakukannya dengan perintah biasa yang mudah dimengerti. Inilah yang saya dapatkan:
Dijelaskan:
git checkout --detach
sama sepertigit checkout HEAD^{}
yang meninggalkan cabang saat ini dan beralih ke "status kepala terpisah". Jadi modifikasi selanjutnyaHEAD
tidak lagi mempengaruhi cabang manapun. MelepasHEAD
tidak mempengaruhi worktree maupun indeks.git reset --soft commitish
lalu pindahHEAD
ke SHA yang diberikancommitish
. Jika Anda ingin memperbarui indeks juga, tinggalkan--soft
, tetapi saya tidak menyarankan untuk melakukannya. Ini, sekali lagi, tidak menyentuh worktree, dan (--soft
) bukan indeks.git checkout commitish
kemudian menempelHEAD
padacommitish
(cabang) yang diberikan lagi. (Jikacommitish
SHA tidak ada yang terjadi.) Ini, juga, tidak mempengaruhi indeks atau pohon kerja.Solusi ini menerima semua yang mengacu pada komit, jadi ini ideal untuk beberapa
git
alias. Direv-parse
bawah ini hanyalah tes untuk memastikan, tidak ada yang putus dalam rantai, sehingga kesalahan ketik tidak secara tidak sengaja beralih ke status kepala terpisah (pemulihan kesalahan akan jauh lebih kompleks).Ini mengarah ke
git hop treeish
alias berikut :FYI, Anda dapat menemukannya di daftar
git
alias saya .sumber
$@
daripada$*
? Perbedaannya adalah bahwa $ @ dengan argumen kutipan tidak perlu diperluas, yang memiliki spasi di dalamnya.$@
secara definitif tidak dimaksudkan di sini.$*
digunakan sebagai pengganti$1
, sehinggagit switch -f b
menjadi sama dengangit switch '-f b'
yang seharusnya menjadi kesalahan. Dengan cara ini saya dapat mempersingkat alias dengan meninggalkan beberapa penanganan kesalahan seperti!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
Bukankah solusi yang lebih baik untuk memiliki dua direktori kerja (dua area kerja) dengan satu repositori, atau bahkan dua repositori?
Ada alat git-new-workdir di
contrib/
bagian untuk membantu Anda melakukannya.sumber
git-new-worktree
mendahului Scriptgit worktree
subcommand; perintah ini tidak tersedia saat jawabannya ditulis. Script tersebut misalnya membutuhkan dukungan symlink; IMHO lebih baik menggunakan dukungan asli.Saya pikir Anda sedang mencari perintah pipa ledeng
git read-tree
. Ini akan memperbarui indeks tetapi tidak akan memperbarui file apa pun di direktori kerja Anda. Misalnya, anggaplahbranch
nama cabang yang akan dibaca:Jika Anda ingin kemudian berkomitmen ke cabang yang baru saja Anda baca, Anda juga perlu:
sumber
read-tree
menghasilkan error:fatal: Not a valid object name branch
jika tidak ada apagit switch branch
belumAnda dapat menimpa file HEAD Anda dengan nama cabang yang berbeda:
echo "ref: refs / heads / MyOtherBranch"> .git / HEAD
sumber
git symbolic-ref HEAD refs/heads/MyOtherBranch
kernel.org/pub/software/scm/git/docs/git-symbolic-ref.htmlgit symbolic-ref
?Dengan begitu banyak file, Anda mungkin lebih baik menyimpan dua repo, satu untuk setiap cabang. Anda dapat melakukan perubahan bolak-balik sesuai kebutuhan. Ini tidak akan terlalu mengejutkan daripada mencoba memainkan trik penyakit kudis dengan git.
sumber
git-new-worktree
untuk itu sebagai gantinya (dalamcontrib/
)Jika Anda hanya mencoba mengubah tempat titik cabang jarak jauh, Anda dapat melakukannya dengan "git push" tanpa menyentuh salinan lokal Anda.
http://kernel.org/pub/software/scm/git/docs/git-push.html
misalnya, untuk memperbarui foo untuk melakukan c5f7eba lakukan hal berikut:
Tidak yakin apakah itu yang Anda cari atau tidak.
sumber
dapat Anda manfaatkan
before-branch-commit-id adalah komit dari mana Anda ingin menyalin data lama.
sumber
Atau cukup gunakan file tambalan untuk menambal dari cabang Anda yang lain ke master Anda
sumber
katakanlah Anda ingin berada di cabang A, tetapi dengan file dari cabang B
temukan ref komit saat ini dari cabang A dengan git log, misalnya "99ce9a2",
Anda sekarang harus berada di cabang A, dengan struktur folder yang sesuai dengan B, yang muncul sebagai perubahan tidak bertahap (Riwayat A tidak berubah).
sumber