Для переміщення вказівника гілки перевіреної гілки можна скористатися git reset --hard
командою. Але як перемістити покажчик гілки не перевіреної гілки, щоб вказати на інший фіксатор (зберігаючи всі інші речі, такі як відстежена віддалена гілка)?
Для переміщення вказівника гілки перевіреної гілки можна скористатися git reset --hard
командою. Але як перемістити покажчик гілки не перевіреної гілки, щоб вказати на інший фіксатор (зберігаючи всі інші речі, такі як відстежена віддалена гілка)?
Відповіді:
Ви можете це зробити для довільних відмов. Ось як перемістити вказівник гілки:
git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>
Загальна форма:
git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>
Якщо вам подобається, ви можете вибрати гниди щодо повідомлення про відкладення - я вважаю, що це branch -f
одне інакше, ніж це reset --hard
, і це точно не одне з них.
git branch -f
. Якщо конкретніше, цей метод видається таким: (А) складніше у використанні (В) складніше запам’ятовувати, та (С) більш небезпечним
git branch -f <branch-name> <new-tip-commit>
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
. (Ви можете вибрати гниди про повідомлення про відмову, якщо вам подобається - я вважаю, що branch -f
одне відрізняється від того reset --hard
, і це не зовсім жодне з них.)
git help branch
каже "-f, --force Скиньте <branchname> до <startpoint>, якщо <branchname> вже існує. Без -f git гілка відмовляється змінити існуючу гілку."
git branch -f master <hash>
і це говорить мені fatal: Cannot force update the current branch.
Ummmm, що я повинен робити, що зараз, перевірити якусь іншу випадкову гілку, перш ніж я можу використовувати цю команду?
HEAD
вказує на неї).
Ви також можете передавати git reset --hard
посилання на комісію.
Наприклад:
git checkout branch-name
git reset --hard new-tip-commit
Я вважаю, що роблю щось подібне напівчасто:
Якщо припустити цю історію
$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master
# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff
# Ditch that commit on this branch
$ git reset --hard HEAD^
# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
git update-ref
як було сказано вище.
git reset --hard ...
Не потрібно повторювати це тут! :-(
Просто для збагачення дискусії, якщо ви хочете перенести myBranch
відділення на свій поточний комітет, просто опустіть другий аргумент після-f
Приклад:
git branch -f myBranch
Я, як правило, це роблю, коли rebase
перебуваю в стані окремої головки :)
В gitk --all
:
Остерігайтеся, що повторне створення замість зміни існуючої гілки втратить інформацію про гілки відстеження . (Це, як правило, не є проблемою для простих випадків використання, коли існує лише одне віддалене місце, а ваша локальна філія має те саме ім'я, що і відповідна гілка в пульті. Детальнішу інформацію див. У коментарях. Дякую @mbdevpl, що вказав на цю сторону.)
Було б здорово, якби gitk
була функція, де у діалоговому вікні було 3 варіанти: перезаписати, змінити існуючі або скасувати.
Навіть якщо ви, як правило, наркоман з командного рядка, як я, git gui
і gitk
цілком чудово розроблені для підмножини використання git, яку вони дозволяють. Я настійно рекомендую використовувати їх для того, у чому вони хороші (тобто вибірково влаштовує перехитування до / з індексу в git gui, а також просто вчинення. (Ctrl-s для додавання підписаного: рядок, ctrl-enter для фіксації .)
gitk
чудово підходить для відстеження декількох гілок, поки ви розбираєте свої зміни в приємній серії виправлень, що надсилаються вгору, або будь-що інше, де вам потрібно відслідковувати те, що ви знаходитесь в середині, з кількома гілками.
У мене навіть браузер графічного файлу не відкритий, але я люблю gitk / git gui.
git status
впливає на вихід. Крім того, в деяких випадках git fetch
і git push
не працюватиме без вказівки віддаленого явно , якщо ви не встановите гілку відстеження. Я не знаю про всі випадки, але для мене загальним правилом є те, що для зручності та швидкості роботи краще мати відстеження гілок у порядку.
Рекомендоване рішенняgit branch -f branch-pointer-to-move new-pointer
в TortoiseGit :
Чесно кажучи, я здивований, як ніхто не думав про git push
команду:
git push -f . <destination>:<branch>
Точка (.) Посилається на локальний сховище, і вам може знадобитися опція -f, оскільки пункт призначення може бути "позаду віддаленого аналога" .
Хоча ця команда використовується для збереження змін на вашому сервері, результат точно такий же, як якщо переміщення віддаленої гілки ( <branch>
) до того ж комітету, що і локальна гілка ( <destination>
)
-f
уникаючи прищеплення нічого місцевого; Наприклад, git fetch origin && git push . origin/develop:develop
це не потрібна невдача версіяgit checkout develop && git pull --ff-only
Відкрийте файл .git/refs/heads/<your_branch_name>
і змініть збережений там хеш на той, куди ви хочете перемістити голову своєї філії. Просто відредагуйте та збережіть файл у будь-якому текстовому редакторі. Просто переконайтесь, що гілка для зміни не є поточною активною.
Відмова: Мабуть, це не доцільний спосіб зробити це, але робота виконується.
У випадку, якщо зобов’язання, на яке ви хочете вказати, випереджає поточну гілку (що повинно бути так, якщо ви не хочете скасувати останні коміти поточної гілки), ви можете просто зробити:
git merge <commit>
git push . <commit>:<branch>
як уже запропоновано.
git branch <branch-name> <SHA-1-of-the-commit>
та скидаючи стару гілку?