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.