Git: как клонировать первый коммит?

Может ли кто-нибудь сказать мне, как клонировать первую фиксацию? Я не хочу удалять последние коммиты, просто сделайте копию клонов исходного состояния, чтобы я мог захватить некоторые файлы.

Ответ 1

Чтобы ответить на вопрос, который, я думаю, вы хотели спросить:

Вы можете получить весь свой репозиторий в состояние первого коммита с помощью:

git checkout <commit SHA1>

После того, как вы закончите работу, вы можете сделать git checkout master, чтобы вернуться туда, где вы были.

И вы можете получить отдельные файлы в их состояние с первого коммита с помощью:

git checkout <commit SHA1> <file or directory> ...

Снова, после того, как вы закончите, вы можете сделать git checkout master <file or directory>, чтобы вернуться туда, где вы были.

Нет необходимости "клонировать" фиксацию (по которой я предполагаю, что вы имеете в виду клонирование репозитория и проверку первой фиксации?). Конечно, если по какой-то причине вы не смогли бы изменить какие-либо файлы в вашем репозитории (например, не хотите, чтобы ваш сборник устарел), вы могли бы, конечно, клонировать его, а затем сделать то же самое в клонированном репо.

Ответ 2

Я думаю, что хочу сделать то же самое. Проверьте первоначальную фиксацию и оттуда оттуда. Я не уверен, что ответ принят. Но, я думаю, это могло (частично) заполнить исходный вопрос. После прочтения этой темы я, однако, поеду с помощью bash скриптов вокруг

git log --pretty=oneline  master | tail -1

Я думаю, я надеялся, что для этого будет какая-то фиксация или древовидная ссылка.

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

git checkout `git log --pretty=oneline | tail -1 | sed 's/ .*$//'`

Обновление 2017: с '12 (GIT 1.8.1) у нас есть лучший вариант: git rev-list, См. Другие ответы здесь или KyleMit у суперпользователя для лучшего способа написания этого сценария.

Ответ 3

Если с помощью "first commit" вы подразумеваете родительское коммитирование ветки, у которой нет самих родителей, вы хотите использовать git -rev-list для этого. Просто используйте

git rev-list --max-parents=0 HEAD

Это получит ваш "Исходный коммит" для текущей HEAD. Используйте мастер, если вы перечислите, или любую другую спецификацию редакции ребенка. оберните это в $(...), чтобы использовать это в выражении, например:

git checkout $(git rev-list --max-parents=0 HEAD)

Ответ 4

Я думаю, все, что вам нужно сделать, это создать новую ветку из первоначальной фиксации, которую вы хотите, проверить это, а затем объединиться обратно в HEAD ветки, на которой вы работаете.

Если abcxyz... является SHA1 комманды, которую вы хотите, и вы работаете в главной ветки, обычно это то, что вы хотели бы сделать:

git branch oldskool abcxyz... # creates a new branch called oldskool from the commit
git checkout oldskool
#make changes
git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited)
git checkout master
git merge oldskool