вытащить конкретный коммит / файл из git - PullRequest
9 голосов
/ 19 января 2012

Я сделал два коммита в своем git-репозитории и отправил их на мой git-сервер

Два коммита

  • В файле первого коммита A фиксируется
  • Во втором коммите файл B фиксируется

Теперь на другом сервере разработки я хочу получить только первый коммит или ФАЙЛ A с git-сервера. Как это сделать?

Ответы [ 2 ]

19 голосов
/ 19 января 2012

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

git fetch origin master (or whatever branch you need)

Затем есть несколько вариантов для достижения того, что вы хотите:

Cherry выбирает первый коммит - он просто «отбирает» выбранный коммит из другой ветки / репо и применяет его к вашей текущей локальной ветке.Это может быть очень полезно, но его следует использовать с осторожностью (см. Ниже).

git cherry-pick  <hash-of-commit-you-want>

В этом конкретном случае вы можете сделать

git cherry-pick FETCH_HEAD^ (gets commit before the HEAD of what's been fetched)

Или потянуть все и затем сделатьполный сброс к коммиту, который вы хотите (в данном случае тот, что перед HEAD).Аппаратный сброс эффективно перематывает вашу локальную ветвь назад во времени к выбранному коммиту, изменяя состояние всех файлов на то, каким они были в то время (поэтому в этом случае файл B либо будет удален, либо вернется к тому, что было раньше, либоcommit, в зависимости от того, существовал ли он ранее или нет).

git pull
git reset --hard HEAD^ (or git reset --hard <hash-of-commit-you-want>)

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

РЕДАКТИРОВАТЬ- Другое решение (учитывая, что это живой сервер и что в любой момент файл B не может появиться на сервере), заключается в следующем:

git fetch origin master
git checkout FETCH_HEAD^

. При этом выбираются все коммиты из репо., а затем проверяет ваше локальное хранилище перед коммитом перед заголовком того, что было извлечено.Единственным недостатком здесь является то, что вы будете в состоянии «отсоединённая голова» и вам придется создавать новую ветку локально, но это не большая проблема.

0 голосов
/ 19 января 2012

Это не имеет особого смысла - если вы все равно отправили файлы, которые у вас есть в репо.

Может быть, это то, что вы хотите

git checkout -- FileAOnly

или

git checkout origin/master -- FileAonly
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...