2017-02-22 49 views

ответ

2

Вы можете взглянуть на What exactly do we mean by "branch"? отделения имен являются просто указателями, указывающие на конкретная фиксация. Каждая фиксация содержит моментальный снимок, который находится в индексе в момент создания моментального снимка. (Каждая фиксация также «указывает» на ее родительский фиксатор (а), а также, конечно, имеет сообщение автора, коммиттера и фиксации.)

Выполнение нового коммита сначала выписывает индекс, а затем записывает фиксацию ссылаясь на сохраненный индекс (a tree), а также ссылаясь на текущий, или HEAD, совершить. Наконец, новая фиксация становится текущей/HEAD фиксацией, записывая ее идентификатор в название ветки. Имя ветви затем указывает на новейшую фиксацию (файл HEAD содержит только имя ветки, это имя ветви, указывающее на фиксацию).

Если вы хотите, чтобы новая фиксация содержала определенный набор файлов, вы должны добавить эти файлы в индекс и удалить любые другие файлы из индекса. Все, что находится в индексе, станет содержимым моментального снимка , следующего за, которое вы совершаете.

Чтобы посмотреть, что находится в индексе прямо сейчас, запустите git ls-files. Для более подробного/подробного вывода используйте git ls-files --stage, который показывает, какие индексные слоты (может быть несколько, во время конфликта слияния, но в остальном все в слоте 0) также заняты.

Как и в Bertrand Martel's answer, вы можете копировать файлы в индекс с помощью git checkout:

git checkout <commit-specifier> -- <path> [ <path> ... ] 

копирует файл для каждого <path> из указанной фиксации, имя ветви указывает на кончике совершить на этой ветке, но вы можете использовать что-нибудь от gitrevisions здесь - в индекс, а затем из индекса в дерево работы.

Вы можете также скопировать файл в индекс, взяв его из работы дерева:

git add <path> [ <path> ... ] 

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

Для того, чтобы удалить файл из индекса, используйте git rm, аналогично git add. Обратите внимание, однако, что это удаляет его от и индекс и рабочее дерево; для удаления только из индекса, используйте git rm --cached.

Для сложных операций сценариев вы можете использовать git update-index, чтобы вносить изменения непосредственно в индекс, но для этого требуется гораздо больше знакомство с внутренними компонентами Git (например, вы должны индивидуально использовать объекты хэша blob, например, и знать, когда их использовать --add, --replace и т. Д.).

1

Создать свой новый филиал, удалить все файлы в этой отрасли, извлекать некоторые файлы из другой ветви и совершающие изменения:

# create a new branch 
git checkout -b branch_name 
# remove all files for this branch 
git rm -rf . 
# retrieve some files from master branch 
git checkout master -- file1 file2 file3 file4 
# commit changes 
git commit -m "create new branch" 
+0

Спасибо за ваш ответ. Это работа для небольшого количества файлов, но что, если у меня есть около 100 файлов и вы хотите переместить 40 файлов? – vikv

+0

Я обновил сообщение для другого метода, удалил все файлы и захватил только файлы, которые вы хотите от других ветвей. –

+0

Спасибо, может быть, я попытаюсь с этим подходом, имеет смысл. – vikv