Untuk memindahkan pointer cabang dari cabang yang diperiksa, seseorang dapat menggunakan git reset --hard
perintah. Tetapi bagaimana cara memindahkan pointer cabang dari cabang yang tidak diperiksa untuk menunjuk komit yang berbeda (menjaga semua hal lain seperti cabang jarak jauh yang dilacak)?
git
git-branch
Mot
sumber
sumber
git branch <branch-name> <SHA-1-of-the-commit>
dan membuang cabang lama?Jawaban:
Anda dapat melakukannya untuk referensi sewenang-wenang. Ini adalah cara memindahkan pointer cabang:
Bentuk umum:
Anda dapat memilih nits tentang pesan reflog jika Anda mau - saya yakin yang
branch -f
satu berbeda dengan yang lainreset --hard
, dan ini bukan keduanya.sumber
git branch -f
. Untuk lebih spesifik, metode ini tampaknya: (A) lebih sulit untuk digunakan (B) lebih sulit untuk diingat, dan (C) lebih berbahayasumber
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
,. (Anda dapat memilih nits tentang pesan reflog jika Anda mau - Saya percaya yangbranch -f
satu berbeda dengan yang lainreset --hard
, dan ini bukan salah satu dari keduanya.)git help branch
mengatakan "-f, --force Reset <branchname> ke <startpoint> jika <branchname> sudah ada. Tanpa -f cabang git menolak untuk mengubah cabang yang ada."git branch -f master <hash>
dan ia memberi tahu sayafatal: Cannot force update the current branch.
Ummmm saya harus melakukan apa sekarang, periksa beberapa cabang acak lain sebelum saya diizinkan untuk menggunakan perintah ini?HEAD
menunjuk ke sana).Anda juga dapat melewati
git reset --hard
referensi komit.Sebagai contoh:
Saya menemukan saya melakukan sesuatu seperti ini secara semi-sering:
Dengan asumsi sejarah ini
sumber
git update-ref
seperti yang dibahas di atas.git reset --hard ...
Tidak perlu mengulanginya di sini! :-(Hanya untuk memperkaya diskusi, jika Anda ingin memindahkan
myBranch
cabang ke komit Anda saat ini , cukup hapus argumen kedua setelahnya-f
Contoh:
git branch -f myBranch
Saya biasanya melakukan ini ketika saya
rebase
dalam keadaan HEAD Terpisah :)sumber
Dalam
gitk --all
:Berhati-hatilah bahwa menciptakan kembali alih-alih memodifikasi cabang yang ada akan kehilangan informasi pelacakan cabang . (Ini umumnya bukan masalah untuk kasus penggunaan sederhana di mana hanya ada satu remote dan cabang lokal Anda memiliki nama yang sama dengan cabang terkait di remote. Lihat komentar untuk detail lebih lanjut, terima kasih @mbdevpl untuk menunjukkan downside ini.)
Akan keren jika
gitk
memiliki fitur di mana kotak dialog memiliki 3 opsi: menimpa, memodifikasi yang ada, atau membatalkan.Bahkan jika Anda biasanya pecandu baris perintah seperti saya,
git gui
dangitk
dirancang cukup baik untuk subset penggunaan git yang mereka izinkan. Saya sangat merekomendasikan menggunakannya untuk apa yang mereka kuasai (yaitu secara selektif mementaskan orang bakhil ke dalam / keluar dari indeks di git gui, dan juga hanya melakukan komitmen. (Ctrl-s untuk menambahkan tanda-off: baris, ctrl-enter untuk melakukan .)gitk
sangat bagus untuk melacak beberapa cabang saat Anda menyortir perubahan Anda menjadi seri tambalan yang bagus untuk dikirim ke hulu, atau apa pun di mana Anda perlu melacak apa yang Anda lakukan di tengah-tengah dengan beberapa cabang.Saya bahkan tidak memiliki browser file grafis terbuka, tapi saya suka gitk / git gui.
sumber
git status
output terpengaruh. Selain itu, dalam beberapa kasusgit fetch
dangit push
tidak akan berfungsi tanpa menentukan jarak jauh secara eksplisit jika Anda tidak menetapkan cabang pelacakan. Saya tidak tahu tentang semua kasing, tetapi bagi saya aturan umum adalah untuk kenyamanan dan kecepatan kerja, lebih baik untuk memiliki cabang pelacakan agar.The solusi yang direkomendasikan
git branch -f branch-pointer-to-move new-pointer
di TortoiseGit :sumber
Jujur, saya terkejut bagaimana tidak ada yang memikirkan
git push
perintah:Titik (.) Merujuk ke repositori lokal, dan Anda mungkin memerlukan opsi -f karena tujuan bisa "di belakang rekan jauh" .
Meskipun perintah ini digunakan untuk menyimpan perubahan Anda di server Anda, hasilnya persis sama seperti jika memindahkan cabang jarak jauh (
<branch>
) ke komit yang sama dengan cabang lokal (<destination>
)sumber
-f
menghindari menabrak sesuatu yang lokal; misalnya,git fetch origin && git push . origin/develop:develop
adalah versi gagal-cepat yang tidak perlu checkoutgit checkout develop && git pull --ff-only
Buka file
.git/refs/heads/<your_branch_name>
, dan ubah hash yang tersimpan di sana menjadi hash di mana Anda ingin memindahkan kepala cabang Anda. Cukup edit dan simpan file dengan editor teks apa pun. Pastikan saja cabang yang akan dimodifikasi bukan yang aktif saat ini.Penafian: Mungkin bukan cara yang disarankan untuk melakukannya, tetapi menyelesaikan pekerjaan.
sumber
Dalam hal komit yang ingin Anda tunjukkan berada di depan cabang saat ini (yang seharusnya menjadi kasus kecuali jika Anda ingin membatalkan komitmen terakhir dari cabang saat ini), Anda dapat melakukan:
sumber
git push . <commit>:<branch>
seperti yang disarankan.