Git: "Наразі немає в жодній галузі". Чи є простий спосіб повернутися на гілку, зберігаючи зміни?


201

Тому я провів деяку роботу в сховищі, і коли я збираюся взяти на себе зобов'язання, я розумію, що зараз не перебуваю в жодній галузі.

Це трапляється багато під час роботи з підмодулями, і я в змозі це вирішити, але процес стомлюючий, і я думав, що для цього повинен бути простіший спосіб.

Чи є простий спосіб повернутися на гілку, зберігаючи зміни?

Відповіді:


213

Якщо ви не скоїлися:

git stash
git checkout some-branch
git stash pop

Якщо ви вчинили і з цього часу нічого не змінили:

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

Якщо ви здійснили, а потім виконали додаткову роботу:

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

16
Цей не допомагає, якщо ви вже зробили це. Немає жодної анкети, хоча це не було зазначено у питанні.
Дін Швидше

24
якщо ви вже взяли на себе зобов'язання: відзначте хеш зобов’язання, яке ви зробили (використовуйте git showабо git rev-parse HEAD), перейдіть до гілки, а потім git cherry-pickслідуйте хеш комітів.
аракнід

7
Якщо вони здійснені, отримайте хеш останньої комісії. Оформіть відділення, в якому ви хочете бути, іgit merge _hash_
Даніель,

Будьте ДУЖЕ Дбайливими. ЯКЩО ВИ ЗДОРОВИЛИ ЗМІНИ, і виконайте ці кроки ... Ви побачите повідомлення ... "Ваша філія та походження / господар розійшлися".
thinkanotherone

1
@thinkanotherone Якщо ви вже внесли свої зміни, не було б чого приховувати і перевіряти іншу гілку - це не кінець світу. Щойно зроблене вами зобов’язання все ще існує, і ви можете з’єднати його з цією гілкою за допомогою git merge <hash-of-the-commit-you-just-made>.
Ерік Б

160

це мені допомогло

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

25
Якщо ви вже зробили кілька комісій, це те, що вам потрібно зробити.
Бенджамін Оукс

Не пробував, але, схоже, це спрацювало б. Однак я думаю, що це малоймовірний сценарій. Я вважаю, що більшість людей зрозуміють, що вони не перебувають у жодній гілці, перш ніж вони скористаються, і використають прийняту відповідь, щоб виправити це.
Ерік Б

49
Ви були б здивовані.
Ерік

@ErikB Я навіть не знав, що є таке, що не бути на гілці. Ця відповідь була дуже корисною для мене.
Костянтин Шуберт

2
прекрасна відповідь, насправді просто набрав її та працював, на відміну від усього іншого, що зустрічається як початківець GIT - ви можете хотіти зазначити, що newbranch - це ім'я арбітражу та не призначене для заміни на хеш-коміт
Toni Leigh

22
git checkout master

Ось такий результат:

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

Отже, зробимо це:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Я цього не пробував, але, схоже, це спрацювало б чудово. Я думаю, якщо ви git gcпереходите між цими двома командами, ви втрачаєте ці коміти, але якщо ви не працюєте git gcавтоматично, це має бути досить безризиковим підходом. Я все одно хотів би відповісти бабай, але якщо ви хочете врятувати себе від написання двох додаткових команд, я думаю, це шлях.
Ерік Б

Я покинув головну гілку в якийсь момент, що я не зовсім впевнений. Я здійснив свої зміни, на майстра не було змін. Ці вказівки принесли мої зміни в головну галузь і все добре.
Матті Йокіпій

+1 Я нервував перевірку іншої гілки, залишаючи комісії позаду, бачачи, що це повідомлення додало впевненості в цьому.
J-Dizzle

11

Залишивши тут інший шлях

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB Він, можливо, зробив кілька доручень. У цьому випадку дивіться відповідь бабая.
Бенджамін Оукс

@BenjaminOakes Це може бути так, але ці команди git навіть не дійсні.
Ерік Б

@ErikB Безумовно, правда. :) відповідь babay - це коректна форма того, що Алекс, здається, намагався зробити.
Бенджамін Оукс

9

Крім того, ви можете налаштувати свої підмодулі так, щоб замість того, щоб знаходитись у стандартній окремо взятій голові, ви перевіряли гілку.

Відредаговано, щоб додати:

Один із способів - перевірити певну гілку підмодуля, коли ви додасте його з прапором -b:

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

Ще один спосіб - просто зайти в каталог підмодулів і просто перевірити його

git checkout master

1
Не могли б ви сказати мені, як це зробити?
Ерік Б

чи є спосіб оновити існуючий підмодуль у цьому режимі гілки за замовчуванням? оновлення, gitmodulesможливо?
Герцель Гіннес

@HertzelGuinness Не дуже. Підмодуль перевіряється на конкретному комісіанті. Гілка - це лише вказівник на ша і ша, на які він вказує, може змінюватися. Це не корисно, оскільки не заморожує стан перевіреного підмодуля. Перевірка гілки - просто зручність, якщо ви вносите зміни в підмодуль.
Абізерн

5

Один із способів опинитися в цій ситуації - це зробити перезавантаження з віддаленої гілки. У цьому випадку на нові коміти вказується на HEADbutmaster не вказують на них - це вказує на те, де б воно не було до того, як ви перезапустили іншу гілку.

Ви можете зробити це зробити новим master, зробивши:

git branch -f master HEAD
git checkout master

Це примусово оновлюється, masterщоб вказувати на HEAD(не надягаючи на вас master), а потім переходить на master.


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

4

Нещодавно я знову зіткнувся з цією проблемою. Минуло час, коли я востаннє працював з підмодулями, і дізнавшись більше про git, я зрозумів, що достатньо просто перевірити галузь, яку ви хочете здійснити. Git збереже робоче дерево, навіть якщо ви його не приховуєте.

git checkout existing_branch_name

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

git checkout -b new_branch_name

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

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


2

Наступний метод може працювати:

git rebase HEAD master
git checkout master

Це відновить ваші поточні зміни HEAD поверх основного. Потім ви можете переключити гілку.


Альтернативний спосіб - спочатку оформити відділення:

git checkout master

Тоді Git повинен відображати SHA1 ваших відокремлених комісій, тоді ви можете вибирати їх, наприклад

git cherry-pick YOURSHA1

Або ви також можете об'єднати найновіший:

git merge YOURSHA1

Для того, щоб побачити всі ваші коммітов з різних галузей (щоб переконатися , що ви маєте їх), виконайте команду: git reflog.


0

Я знаю, що в 2012 році я сказав бабею, що вважав, що навряд чи хтось зрозуміє, що вони не на гілці та зобов'язані. Це зі мною щойно трапилось, тому, мабуть, я повинен визнати, що я помилявся, але враховуючи, що це відбулося до 2016 року, щоб зі мною це трапилося, можна стверджувати, що це насправді малоймовірно.

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

git checkout some-branch
git merge commit-sha

Якщо ви не скопіювали фік-ша перед тим, як перевірити іншу гілку, її можна легко знайти, запустивши:

git reflog

це рідкісне (малоймовірне) питання для однієї людини. У мене це не сталося з 2012 року. Але якщо ви помножите шанс на кількість користувачів git ... Це буде дуже ймовірно. З кожним днем ​​це може траплятися. :)
babay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.