Тимчасово перемкніть робочу копію на певний Git


248

Як переключитися на певний Git-комітет, не втрачаючи всіх зобов'язань після нього ?

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

Я хочу змінити стан файлів на конкретну фіксацію, запустити проект і, закінчивши, відновити файли до останньої фіксації.

Як це зробити, не стискаючи папку всього проекту?


Відповіді:


344

Якщо ви перебуваєте на певній гілці mybranch, просто продовжуйте і git checkout commit_hash. Потім ви можете повернутися до своєї філії за адресою git checkout mybranch. У мене була така ж гра, яка розбирає помилку сьогодні :) Також вам слід знати про git bisect .


6
Зауважте, що ви можете це робити, git checkout commit_hashякщо ви перебуваєте в чистому сховищі і не потрібно робити розгалуження. Можливо, у деяких випадках використання (наприклад, у моїх) може бути легше.
Ендерленд

@enderland: Твій ВИНАГА завжди вказує на якусь гілку :)
Олександр Павлов

У мене виникла проблема, коли мені довелося використовувати весь хеш-коміт, оскільки частковий не був прийнятий.
mightyiam

6
Резюме для git bisectдовідки; який надзвичайно корисний інструмент!
Niek

54

По-перше, скористайтеся git logдля перегляду журналу, виберіть потрібну фіксацію, запишіть хеш sha1, який використовується для ідентифікації фіксації. Далі біжіть git checkout hash. Після того, як ви закінчите, git checkout original_branch. Це має перевагу в тому, що не переміщувати HEAD, воно просто перемикає робочу копію на певний комітет.


4
Я думаю, ти маєш на увазі git checkout <original_branch>. git checkout HEADфактично
НООП

3
git reset --hard <hash>змінює HEAD поточної гілки, при цьому git checkout <hash>ви отримуєте окремий замовлення, який не змінює жодної гілки, і ви можете легко повернутися, не знаючи оригінального ідентифікатора хешу вашої гілки, як показано в цій відповіді.
jofel

@Femaref Питання для початківців: з огляду на контекст цього питання (переключитися на більш раннє зобов'язання тимчасово), чому було б перевагою чи недоліком переміщати чи не переміщувати ГЛАВУ?
горіх про natty

@nuttyaboutnatty Якщо припустити, що моя редакція затверджена, вона повинна відповісти на ваше запитання. HEAD насправді рухається в будь-якому випадку; але в касі посилання відділення HEAD вказує на те, що воно не переміщене.
echristopherson

15

На додаток до інших відповідей тут, де показано, як git checkout <the-hash-you-want>варто знати, що ви можете повернутись туди, де використовували:

git checkout @{-1}

Це часто зручніше, ніж:

git checkout what-was-that-original-branch-called-again-question-mark

Як ви могли передбачити, git checkout @{-2}вас повернуть до відділення, в якому ви були два роки git checkoutтому, і так само, як і для інших номерів. Якщо ви можете згадати, де ви були для більшої кількості, ви повинні отримати якусь медаль за це.


На жаль за продуктивністю, git checkout @{1}це не відведе вас у галузь, на якій ви будете працювати в майбутньому, що прикро.


1
Зауважте, що git checkout -це короткометражний псевдонім дляgit checkout @{-1}
Натанаїл

@Nathanael OMGOD , ніяк ... це все змінює! Приємно, дякую! … Я збирався включити це у відповідь, але думаю, що також корисно знати про загальний @{n}синтаксис, оскільки він працює з великою кількістю команд git. Мені було важко додати вашу стенограму, не роблячи відповіді досить заплутаною. Натомість я проголосував за ваш коментар - сподіваюся, люди це побачать. Знову дякую.
Бенджон

1
Нема проблем. Ця дискусія все-таки дотична до власне питання. Більше бонусу! Я часто використовую той самий синтаксис для об'єднання функцій у випуск. наприклад, git merge -щоб об'єднати гілку, яку ви останній раз перевірили, у гілку, яку ви перевірили. Це як cd -у басі.
Натанаїл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.