Як я можу змінити, на який майстер комітів вказує git?


75

У git я робив коміти на головну гілку, коли насправді я повинен був працювати над гілкою функцій. Я хочу змінити це так, щоб master повернувся туди, звідки він розпочався, а те, що було на master, тепер на новій гілці. В основному, моя історія комітів виглядає так:

A -- B -- C -- D -- E
          |         |
          |       master
     origin/master

І я хочу, щоб це виглядало так:

        master
          |
A -- B -- C -- D -- E
          |         |
          |       new_branch
     origin/master

Як я можу змінити, де майстер-бали?

Відповіді:


76
  • сховати свої необов’язкові: git stash
  • створити нову гілку: git branch new_branch
  • скинути майстер до початкового / головного: git reset --hard origin/master
  • перевірити нову гілку ще раз: git checkout new_branch
  • скасувати зміни: git stash pop

stash / unstash не потрібно, якщо ваше робоче дерево чисте. просто переконайтеся, що у вашому робочому дереві немає змін, оскільки вони будуть видалені, коли ви скинете --hard


ще одна можливість (швидше і без необхідності зберігати та скидати):

  • оформити нову гілку: git checkout -b new_branch master
  • створити `` нову '' головну гілку і вказати її на джерело / коміт коміту: git branch -f master origin/master

2
Зверніть увагу, що схованка необхідна лише в тому випадку, якщо у вас є якісь незмінені зміни.
Джош Лі

1
Якщо ваш робочий каталог чистий, вам не знадобляться частини stashта unstash. В іншому випадку ідеально: +1
Камерон Скіннер

10
Чудово! git reset --hard <commit>було саме те, що я шукав.
Rudd Zwolinski

3
Ви дійсно не повинні модифікувати файли .git/refs/вручну (наприклад, будь-який заданий номер справді може бути запакований (у .git/packed-refфайл) замість того, щоб бути "вільним"). Взагалі, команда найнижчого рівня, яку ви повинні використовувати для модифікації ref, - це git update-ref або git symbolic-ref . У цьому конкретному випадку немає необхідності вимивати внутрішні елементи Git або навіть використовувати раніше згадані команди Git “сантехніка”; Ви можете зробити це з мерзотника галузі : git branch -f master origin/master.
Кріс Джонсен,

4
git branch -f master <commit>зробив трюк для мене, дякую!
danr

27
$ git checkout master
$ git reset --hard <commit-id-for-master-to-sit-at>

наприклад спробуйте це

$ mkdir example; cd example
$ git init
$ vi testFile.txt
(now add "test commit 1" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 1st commit" to git commit)
$ vi testFile.txt
(now add "test commit 2" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 2nd commit" to git commit)
$ vi testFile.txt
(now add "test commit 3" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 3rd commit" to git commit)
$ git tag final_head
$ git reset --hard HEAD~1

цей приклад показує переміщення майстра до іншого коміту. Тут зауважте, що тег дозволяє нам зберегти старий майстер, на випадок :)


4

Як описано тут , але ще простіше, жодних перезавантажень не потрібно, просто створіть нову гілку там, де знаходився майстер, потім безболісно видаліть майстер, знову оформіть місце, куди ви хочете перемістити майстра, і створіть там нову гілку майстра:

git stash
git checkout -b old_master_was_here
git branch -d master
git checkout origin/master
git checkout -b master

3

Перейдіть до .git / refs / heads / master, який має хеш master, і змініть його на будь-що, що хочете. Я використовую gitg, щоб швидко знайти хеш майстра, а потім переконатися, що переміщення було успішним.


0

Створіть нову гілку new_branchв поточній HEAD (припускаючи, що HEAD = master), скиньте master на C і переключіться на new_branchще раз (якщо говорити з точки зору SmartGit).


0

Зверніть увагу, що в будь-який момент ви можете змінити, куди вказує гілка, використовуючи git update-ref refs/heads/branch id, але перед тим, як це зробити, ви повинні дати назву кінчику дерева, інакше ваша робота буде недоступною. Тож ці дві команди можуть виконати цю роботу

 git update-ref refs/heads/newfeature HEAD
 git update-ref refs/heads/master XXYYY

Але переконайтеся, що у вас немає жодних незавершених змін, інакше все пекло вирветься нанівець

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.