Git клонує конкретну версію віддаленого сховища


181

Я клонував віддалений сховище git близько місяця тому. Віддалене сховище зазнало багатьох змін і тепер стало нестабільним. Тепер мені потрібна ще одна копія сховища, версія, ідентична тій, яку я клонував місяць тому.

Як це зробити?


Можливий дублікат stackoverflow.com/questions/3489173/…
— Nicolas Raoul

Відповіді:


242

Ви можете "скинути" ваш сховище до будь-яких завдань (наприклад, 1 місяць тому).

Використовуйте для цього скидання :

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]

27
Ви не згадали про це, але це лише скине masterгілку, яка перевіряється за замовчуванням на клоні. Якщо інша галузь masterє вашою основною галуззю розвитку, яку потрібно попередньо перевіритиgit reset
— Стів Фоллі

16
чому б ви не зробили просту перевірку розшукуваного комітету?
— nemoo

10
Тому що ви перебуваєте в стані "відокремленої ГЛАВИ" після оформлення замовлення на певний комітет.
— Руй Карнейро

6
@RuiCarneiro було б краще використовувати git checkout -b new_branch hashдля створення нової гілки на основі хешу, не торкаючись жодної іншої гілки. Переміщення голови існуючої гілки може спричинити проблеми, коли її час щось натиснути на віддалений сервер.
— Loïc Faure-Lacroix

1
@ YuriGhensev Якщо комісія вже була перенесена на віддалену гілку, ви можете зробити git pull origin [branch]інакше, afaik, її втрачено.
— Руї Карнейро

94

Ви можете використовувати просто

git checkout  commithash

у цій послідовності

git clone `URLTORepository`
cd `into your cloned folder`
git checkout commithash

виконувати хеш виглядає так "45ef55ac20ce2389c9180658fdba35f4a663d204"


9
Мені подобається ця відповідь найкраще. Я думаю, що git reset --hardслід уникати, на користь системи git checkout commit-hash. A git reset --hardвидаляє частину історії git, яка іноді не бажана.
— Джордан Стюарт

8
git initне потрібно
— Лаутаро

37

Використовуйте, git logщоб знайти версію, до якої ви хочете відкатати, і взяти до відома хеш-файли. Після цього у вас є 2 варіанти:

  1. Якщо ви плануєте зробити що-небудь після цього перегляду, рекомендую перейти до нового відділення:git checkout -b <new_branch_name> <hash>

  2. Якщо ви не плануєте нічого робити після цього перегляду, ви можете просто здійснити замовлення без філії: git checkout <hash>- ПРИМІТКА: Це переведе ваше сховище у стан "відокремленої HEAD", що означає, що воно наразі не приєднане до жодної гілки - тоді ви " У мене буде додаткова робота щодо об'єднання нових комісій у фактичну галузь .

Приклад:

$ git log
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:15:01 2010 -0300

    Added a custom extension.

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:13:48 2010 -0300

    Missing constness.

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7'
which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 4553c14... Missing constness.

Таким чином ви не втрачаєте жодної інформації, таким чином ви можете перейти до нової версії, коли вона стане стабільною.


2
Але також неважливо, що ви знаходитесь на відірваній голові, що добре для операцій лише для читання. Але коли ви маєте намір внести зміни, починаючи з цієї версії, вам потрібно створити нову гілку. Див. Sitaramc.github.com/concepts/detached-head.html для отримання додаткової інформації.
— Руді

@Rudi: Дякую Це був лише приклад показати використання. Оновлено, щоб згадати про це.
— jweyrich

Повернутися до "робочого статусу" ви можете саме git checkout developтам, де розвивається - назва вашої філії.
— Стів Таубер

1
@SteveTauber добре, припустимо , ви маєте іншу гілку , яка працює , змінюється в тому , що галузь досить дійсно.
— jweyrich

19

Якщо ця версія вам потрібна, це гілка або тег, тоді:

git clone -b branch_or_tag_name repo_address_or_path

2

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

Можливо, на той час були теги, щоб позначити певну версію. Якщо ні, ви можете створити їх самостійно. Хороший спосіб зробити це - використовувати git logабо, можливо, більш візуально за допомогою таких інструментів gitk(можливо, gitk --allщоб побачити всі гілки та теги). Якщо ви можете виявити хеши комітетів, які використовувалися в той час, ви можете позначити їх за допомогою, git tag <hash>а потім перевірити їх у нових робочих копіях (наприклад, git checkout -b new_branch_name tag_nameабо безпосередньо за допомогою хеша замість імені тегу).


1

Ви можете вирішити це так:

git reset --hard sha

де shaнаприклад:85a108ec5d8443626c690a84bc7901195d19c446

Ви можете отримати потрібний ша за допомогою команди:

git log

1

uploadpack.allowReachableSHA1InWant

Оскільки Git 2.5.0 цю змінну конфігурації можна ввімкнути на сервері, тут запит на функцію GitHub та GitHub зобов’язання включити цю функцію .

Сервер Bitbucket включив його з версії 5.5+ .

Використання:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"

0

Дерево-джерело, яке ви потребуєте, все ще доступне у сховищі git, однак вам знадобиться SHA1 комітету, який вас цікавить. Я б припустив, що ви можете отримати SHA1 з поточного клону, який у вас є?

Якщо ви можете отримати цей SHA1, ви можете створити там гілку / скинути, щоб мати однакове сховище.

Команди відповідно до відповіді Руя


0

Можливо, git resetвирішує вашу проблему.

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