Как получить определенный коммит из проекта GitHub


151

Мне нужно скачать API Facebook с GitHub . Обычно я просто нажимаю на вкладку «Загрузки», чтобы загрузить последний исходный код. В этом случае мне нужен более старый коммит: 91f256424531030a454548693c3a6ca49ca3f35a , но я не знаю, как получить весь проект из этого коммита ...

Может кто-нибудь сказать, пожалуйста, как это сделать?

(Кстати, я на Mac. Не знаю, если это имеет какое-либо значение).


1
см. также stackoverflow.com/questions/13636559/… если вам «только» нужен «zipped-snapshot-code».
Жан Фонтен

Ответы:


216

Сначала клонируйте репозиторий с помощью git, например:

git clone git://github.com/facebook/facebook-ios-sdk.git

Это загружает полную историю хранилища, так что вы можете переключиться на любую версию. Затем перейдите в новый клонированный репозиторий:

cd facebook-ios-sdk

... и используйте, git checkout <COMMIT>чтобы перейти на правильный коммит:

git checkout 91f25642453

Это даст вам предупреждение, так как вы больше не находитесь на ветке и переключились непосредственно на определенную версию. (Это называется состоянием «отсоединенного HEAD».) Звучит так, как будто вы хотите использовать только этот SDK, а не активно его разрабатывать, поэтому вам не о чем беспокоиться, если только вы не хотите узнать подробнее о том, как работает git.


4
На данный момент вы также можете, git exportесли вы просто хотите файлы.
Xeoncross

1
git checkout -q <commit#>отключает предупреждение stderr во время проверки git.
Манавалан Гаджапати

Когда я делаю git checkout 441b034635240bc873700473af3e98533e94a0b5, это выдает ошибку: fatal: ссылка не является деревом: 441b034635240bc873700473af3e98533e94a0b5
ttb

135

Я не знаю , если он был там , когда ты отвечал на этот вопрос, но самый лучший и простой способ загрузки фиксации можно нажать на коммитах вкладки при просмотре хранилища. Затем вместо того, чтобы щелкнуть имя коммита, нажмите кнопку « Просмотреть репозиторий» в этой точке кнопки истории с символом <> справа от имени / сообщения коммита и, наконец, кнопку « Загрузить ZIP» , которая появляется при нажатии « Клонировать» или Кнопка загрузки .

Надеюсь, это поможет вам, ребята.


3
Это единственный способ восстановить «потерянные коммиты», которые являются тем, что у github есть история, но которые были стерты с «официального» временного графика git. Используя это, вы можете получить zip-снимок коммита, который был превращен в забвение, перенести этот коммит в новую ветку, извлечь эту ветку в существующее хранилище и снова выбрать его.
Аякс

@Ajax Это не правда. Вы все еще можете получить ша, используя git reflog, а затем
оформить

@AaronBrager, конечно, reflog будет работать, если вы находитесь на той же машине, на которой изначально был коммит. ОП уже знает о коммите, поэтому им не понадобится reflog, и он может просто оформить заказ напрямую. Тем не менее, я говорю о случаях, когда у вас нет коммитов локально, и это не относится ни к каким веткам, которые все еще находятся в публичном репо. В этих случаях у github все еще может быть запись о коммите, которую вы можете скачать в виде zip-архива, чтобы иметь возможность восстановить указанный коммит.
Аякс

@ Аякс Ах, спасибо за разъяснения. В качестве альтернативы, вы можете нажать GitHub API ( api.github.com/repos/facebook/facebook-ios-sdk/events ) и создать ветку из осиротевшего коммита ( инструкции здесь )
Аарон Брагер,

Очень хорошо. +1 Я не знал, что вы можете запросить рефлог GitHub, как это!
Аякс

27

Ответ Сивана в гифке введите описание изображения здесь

1. Нажмите на коммиты в github.

2.Выберите код обзора на правой стороне каждого коммита.

3.Нажмите на загрузку zip, которая загрузит исходный код в момент фиксации


Привет, Сурадж, расскажите, пожалуйста, как вы создали GIF на вашем экране?
Рахул Сатал

Используйте быстрый проигрыватель для записи видео с экрана. Выполните преобразование видео в gif с помощью любого доступного инструмента. Google it. @ Rahul Satal
Suraj K Thomas

1
Спасибо @SurajKThomas за GIF
Сиван

10

Чтобы просто загрузить коммит с помощью 7-значной короткой формы SHA1, выполните:

Рабочий пример:

https://github.com/python/cpython/archive/31af650.zip  

Описание:

 `https://github.com/username/projectname/archive/commitshakey.zip`

Если у вас есть длинный ключ хеша 31af650ee25f65794b75d4dfefed6fe4758781c1, просто получите первые 7 символов 31af650. Это по умолчанию для GitHub.


8

Я обнаружил, что самый простой способ восстановить потерянный коммит (который существует только на github, а не локально) - это создать новую ветку, включающую этот коммит.

  1. Откройте коммит (например, URL: github.com/org/repo/commit/long-commit-sha)
  2. Нажмите «Обзор файлов» в правом верхнем углу
  3. Нажмите на раскрывающийся список "Дерево: коротко-ша ..." в левом верхнем углу
  4. Введите имя новой ветви
  5. git pull новый филиал вниз к местному

Этот ответ является более общим, чем принятый. Я столкнулся с такой ситуацией, что требуемый коммит уже исчез в основной ветке, и Github не будет хранить все коммиты в несуществующих ветвях. Таким образом, этот подход создаст новую ветку из этого коммита на Github и сделает его доступным для обработки.
Ци Ло

Это позволило мне восстановить коммит (с исходным неповрежденным SHA) из удаленной вилки, с которой я сделал PR. После создания нового разветвления я открыл PR-коммит в репозитории верхнего уровня, затем «просмотрел файлы». Затем я скопировал этот URL и заменил имя пользователя своим собственным. Затем щелкнул ниспадающий список Tree: и создал новую ветку в моем форке. Работал отлично!
Аллен Люс

2

Название вопроса неоднозначно.


1

Как дополнение к принятому ответу:

Чтобы увидеть хэши, вам нужно использовать предложенную команду «git checkout hash », которую вы можете использовать git log. Однако, в зависимости от того, что вам нужно, есть более простой способ, чем копирование / вставка хэшей.

Вы можете использовать git log --onelineдля чтения многих сообщений коммитов в более сжатом формате.

Допустим, вы видите этот однострочный список коммитов с минимальной информацией и только частично видимыми хешами:

hash111 (HEAD -> master, origin/master, origin/HEAD)
hash222 last commit
hash333 I want this one
hash444 did something
....

Если вы хотите last commit, вы можете использовать git checkout master^. Это ^дает вам коммит перед мастером. Так hash222.

Если вы хотите n-й последний коммит, вы можете использовать git checkout master~n. Например, использование git checkout master~2даст вам коммит hash333.


0

Вместо навигации по коммитам вы также можете нажать yклавишу ( Github Help , Keyboard Shortcuts ), чтобы получить «постоянную ссылку» для текущей ревизии / коммита.
Это изменит URL с https://github.com/<user>/<repository>(master / HEAD) на https://github.com/<user>/<repository>/tree/<commit id>.

Чтобы загрузить конкретный коммит, вам необходимо перезагрузить страницу с этого URL, поэтому Clone or Downloadкнопка будет указывать на «снимок» https://github.com/<user>/<repository>/archive/<commit id>.zip вместо самого последнего https://github.com/<user>/<repository>/archive/master.zip.


0

Попробуйте следующую последовательность команд:

$ git fetch origin <copy/past commit sha1 here>
$ git checkout FETCH_HEAD
$ git push origin master

-1

Если вы хотите использовать какой-либо определенный коммит или кодировать какой-либо определенный коммит, вы можете использовать следующую команду:

git checkout <BRANCH_NAME>
git reset --hard  <commit ID which code you want>
git push --force

Пример:

 git reset --hard fbee9dd 
 git push --force

2
Это опасно, имеет больше смысла клонировать репо и
оформить
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.