Що відбувається з git-комітетами, створеними у відокремленому стані HEAD?


137

Ось що сталося:

У мене є відділення А. На філії AI вніс купу змін. Я не був задоволений кодом, тому я перевірив попередню комісію у філії А. Потім я вніс ще кілька змін і здійснив їх у гілці A. Зараз я не можу знайти цю фіксацію ніде. Я втратив цей код?


Коли ви говорите "Я перевірив попередню комісію у гілці A", ти маєш на увазі "Я скидаю гілку A до попередньої комісії"? тобто ви насправді, git resetа не git checkout?
CB Bailey

Ні, я використовував замовлення. reflog працював.
Маусімо

Якщо ви використовували касу, тоді ви були на відокремленій HEADділянці, а відділення A залишилося б на попередньому комітеті. Які саме команди ви виконували?
CB Bailey

1
Я використовував SourceTree GIT GUI на OSX Lion. Я був на гілці A і здійснив перевірку попереднього комітету на відділенні А. Потім я зробив купу змін коду та здійснив (відділення А). Я вважаю, що у мене була відокремлена ГЛАВА.
Маусімо

Добре, я думаю , що я був збентежений , коли ви сказали , що ви зробили купу більше змін на гілки А .
CB Bailey

Відповіді:


185

Стара фіксація все ще знаходиться в рефлогу.

git reflog

Це покаже список комітетів, і "втрачені" зобов'язання повинні бути там. Ви можете перетворити його в нове відділення. Наприклад, якщо SHA-1 є ba5a739, ви можете створити нову гілку під назвою "new-гілка" на старій комісії з:

git branch new-branch ba5a739

Зауважте, що "втрачені" комісії будуть видалені, коли база даних буде обрізана.


3
Я зробив те ж саме і про серцевий напад, думаючи, що він загублений. Дякую за інформацію!
Чейз

14
Використовуйте git cherry-pick [SHA]для переміщення комітету на існуючу гілку у випадку, якщо ви випадково скоїлися, перебуваючи у відокремленому штаті
Ян Аагаард Мейєр

3
Крім того, ви можете переключитися на існуючу гілку і зробити "git merge HEAD @ {n}" n, що відповідає "втраченому" комітету, зазначеному в рефлогу.
eaykin

Чи знаєте ви, чи pruneвидаляли б також окремі комітети, на які посилається у повідомленнях про фіксацію? Або це робить їх доступними ?
Kamafeather

@Kamafeather: Я не думаю, що це робить їх доступними.
Дітріх Епп

63

Як уже вказувалося, ваші зобов’язання залишаються доступними в рефлогу. У доповненні до інших відповідей, ось спосіб , щоб взяти на відокремлені ГОЛОВИ фіксацій в вашу поточну гілку безпосередньо , без створення і об'єднання нової гілки:

  1. Перегляньте хеші SHA-1 комітетів, які ви зробили у відокремленому стані HEAD

    git reflog
    
  2. Потім виконайте всі впорядковані хеші впорядкування від найдавніших до останніх:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    Наприклад, якщо у мене був лише один, наведений у короткому хеш-форматі "перші 7 символів":

    git cherry-pick a21d053
    

Це створить нові коміти для вашої поточної гілки, один фіксатор на відмінений хеш-коміт, який ви згадуєте в команді. Він також приймає оригінальні повідомлення про фіксацію.


11

Ви можете знайти втрачені (звисаючі) зобов’язання за допомогою наступної команди:

git fsck --lost-found

Зауважте, якщо ваша нинішня голова звисає, вона не відображається як втрачена.

Ви можете знайти більше інформації на сторінці git-fsck (1)

Тоді ви можете створити гілку для цього втраченого комітету:

git branch new-branch ba5a739

Я спочатку використовував команду "git reflog", потім "git branch new-branch ba5a739" для підмодуля, він працював.
ондермерол

7

Git мова для стану вашого робочого каталогу - це " відокремлена голова ". Ось ще одне місце, яке git reflogробить економію.

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

Якщо я спробую перевірити іншу гілку, git-1.7.5.1 дає корисну пропозицію.

$ git майстер оформлення замовлення
Попередження: ви залишаєте 1 комікс позаду, не пов’язаний із цим
будь-яке ваше відділення:

  0b40dd6 мій вчинок на відокремленій ГЛАВІ

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

 гіт git new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

Переключено на відділення "master"

Дякуємо за інформацію та посилання. Посилання допомогло мені зрозуміти, що відбувається.
Маусімо

6

Ви не втратили її, Git як і раніше зберігає копію (але вона наразі недоступна для будь-якого керівника відділення). Ви можете знайти свою відсутню комітку за допомогою git reflogкоманди. Рефлог відстежує історичні положення голови філії, і ви можете використовувати його для пошуку речей, на які голова відділення вказувала раніше.


4

Виконайте ці кроки, щоб зв’язати відсторонену голову назад до git repo

  1. git checkout "your branch with path but without remote name"

наприклад, якщо віддалене ім’я походить, а bugfix/somebranchпотім використовується назва філіїgit checkout bugfix/somebranch

  1. git reflog отримати список SHA для перерахування зі списку фіксованих відділень.

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

ВСЕ ГОТОВО!!


2

У Sourcetree я виявив, що git reflog не працює, тому я зрозумів, як це зробити за допомогою GUI.

По-перше, спробуйте знайти "втрачену" команду, шукаючи повідомлення в історії команд (перегляд: Показати командний вихід). Сподіваємось, це буде в команді "Перемикання гілки" після того, як ви втратили команду, і ви побачите коментар комісії з ідентифікатором комісії 1234567.

Перейдіть до цього кроку ID для наступного кроку.

Натисніть кнопку "Відділення" на верхній панелі інструментів, і у вас повинно з’явитися діалогове вікно "Нова гілка", де ви можете вказати певну фіксацію. Помістіть туди ідентифікатор комісії, вкажіть нову назву гілки, натисніть Створити гілку, і вам слід отримати нову гілку зі втраченою фіксацією!

Це повернуло для мене якусь втрачену роботу!

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