Що робити з фіксацією, зробленою у відірваній голові


279

За допомогою git я зробив щось подібне

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

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

Отже, моє запитання - як я можу злити головну гілку зі своїм фактичним станом (відокремлена голова)



Я б ви могли додати скріншот дерева комітів у цьому стані (як фактично виглядає фіксація на відокремленій голові у gitk чи SourceTree), це зробило б це питання ще кращим.
флорисла

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

Відповіді:


476

Створіть гілку, де ви перебуваєте, а потім переключіться на керування та об'єднайте її:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
як можна уникнути відриву голови в майбутньому?
ycomp

Я зробив це і опинився попереду походження на 5 комітів. У такому випадку ви просто робите git push origin?
Winnemucca,

5
дивно, я отримую "Вже сучасний". при злитті моєї тимчасової роботи
Роберт Сінклер

10
Не забудьте видалити мою тимчасову роботу з "git гілка -d моя тимчасова робота"
Капітан Лептон

5
@ycomp "відокремлена голова" трапляється, коли ви редагуєте файли старої фіксації, а потім призначаєте ті, що не мають гілки, щоб пізніше посилатися на цю нову фіксацію. Щоб уникнути відстороненої голови, не перевіряйте старі коміти. Якщо ви все-таки хочете, щоб усі файли були звідти, але як нове фіксування, ви можете оформити каталог з фіксації, а не з фіксації. Дивіться цю відповідь
lucidbrot

96

Ви могли б зробити щось подібне.

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

Ще простіше було б

git checkout master
git merge HEAD@{1}

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


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

8
Якщо ви вирішили скористатися командою, git merge HEAD@{1}ви, мабуть, переконаєтесь, що це саме те, що ви хочете використовувати, використовуючиgit reflog
Michael Stramel

3
Можливість об'єднання HEAD @ {1} врятувала мені життя, оскільки я вже попередньо перевірив майстра.
JUIL

дивно, я отримую "Вже сучасний". при злитті tmp (але файли відрізняються)
Роберт Сінклер

18

Ось що я зробив:

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

Тож перше, що вам потрібно зробити, - це detached HEADназвати це ім’я. Ви можете легко зробити це так, під час цього detached HEAD:

git checkout -b some-new-branch

Тепер ви можете натиснути його на віддалений, як і будь-яку іншу гілку.

У моєму випадку я також хотів перемотати цю галузь до освоєння разом із зобов'язаннями, які я зробив у detached HEAD(зараз some-new-branch). Все, що я робив, було

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

Звичайно, я згодом це об'єднав master.

Ось про це.


1
Ця відповідь спрацювала для мене там, де інші цього не зробили. git checkout -b new-branchпрацював на мене. Інші пропозиції вимагали git branch new-branch, але це залишило мене все ще відстороненою головою, і нова гілка не сприйняла моїх змін.
Джессі Патель

17

Можна просто зробити git merge <commit-number>абоgit cherry-pick <commit> <commit> ...

Як запропонував Райан Стюарт, ви також можете створити гілку з поточної ГОЛОВИ:

git branch brand-name

Або просто тег:

git tag tag-name

Ви можете знайти свій номер git rev-parse HEAD
комісії

6

У випадку, коли відокремлена HEAD, виконує роботу як звичайна, за винятком того, що жодна гілка не називається. Щоб оновити головну гілку з внесеними змінами, зробіть тимчасову гілку там, де ви є (таким чином, у тимчасовій гілці відбудуться всі здійснені вами зміни у відокремленій ГОЛОВІ), потім переключіться на головну гілку та об'єднайте тимчасову гілку з Майстер.

git branch  temp
git checkout master
git merge temp

3

Легко виправити, щоб просто створити нову гілку для цього зробити і перевірку на нього: git checkout -b <branch-name> <commit-hash>.

Таким чином, всі внесені вами зміни будуть збережені у цій гілці. У випадку, якщо вам потрібно буде очистити свою головну гілку від залишків, обов'язково запустіть git reset --hard master.

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


1

Можливо, не найкраще рішення, (перепишуть історію), але ви також можете це зробити git reset --hard <hash of detached head commit>.

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