вытащить только один (последний нажатый) коммит

Я работал над своим локальным репозиторием и несколько раз отправлял данные на сервер git, в то время как сервер, на котором я развертываю свою работу, все еще находится позади всех этих коммитов.
Вкратце, ситуация такая:

local: commit n+5
git server: commit n+5
dev server: commit n  

Теперь я хочу вытащить на сервер разработки только коммит с номером n+5 (не включая коммиты n+1, n+2, n+3 и n+4).
Я погуглил и нашел несколько решений, в том числе этот на Stackoverflow.
Я попробовал git reset --hard <commit>, но это не сработало , я получил эту ошибку:

git status 
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
git reset --hard 77de3a5
fatal: ambiguous argument '77de3a5': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Я хотел попробовать другое предложенное решение (используя git fetch и git merge), но я запутался, когда это было сказано

Примечание: git merge получит все изменения и их происхождение, так что это работает, если это самая старая не объединенная фиксация.
Я боюсь, что этот подход будет включать (вытягивать/сливать) все зафиксировать n+5.

Есть ли способ вытащить только один коммит (не включая предыдущие коммиты)?
PS: Я знаю, что самый чистый способ — это использовать разные ветки, но что делать, когда вы получаете немного беспорядочный!


person singrium    schedule 15.11.2019    source источник
comment
Я думаю, вам следует прочитать, что такое git cherry-pick. git help cherry-pick   -  person eftshift0    schedule 15.11.2019
comment
@eftshift0 Пробовал git cherry-pick -n 77de3a5, тоже не сработало, получилось: fatal: bad revision '77de3a5'   -  person singrium    schedule 15.11.2019
comment
вытягивание последней фиксации автоматически выровняет ваши файлы со всеми изменениями, сделанными до сих пор   -  person Raphael    schedule 15.11.2019
comment
Я предполагаю, что вы предоставляете неправильный идентификатор версии для выбора вишни. Проверьте идентификатор, который вы используете. Что показывает git show --summary 77de3a5?   -  person eftshift0    schedule 15.11.2019
comment
Вероятно, вам придется выполнить git fetch --all на сервере развертывания, чтобы получить новую информацию с удаленного сервера. Затем вы можете повторить попытку выбора вишни.   -  person Daniel Farrell    schedule 15.11.2019
comment
@eftshift0, на моем локальном компьютере (где он обновлен с репозиторием git) он показывает автора фиксации, сообщение фиксации ... Но на сервере разработки (который не обновлен с сервером git) , он показывает fatal: ambiguous argument '77de3a5': unknown revision or path not in the working tree.   -  person singrium    schedule 15.11.2019
comment
@DanielFarrell, я попробую. Спасибо   -  person singrium    schedule 15.11.2019


Ответы (1)


Конечно, чтобы получить ровно один коммит:

git fetch [remote] [branch/commit] --depth=1

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

Что касается ошибки reset --hard, это не удалось, потому что вы не выполнили git fetch, а сервер еще не знал о существовании 77de3a5.

Если вы просто пытаетесь очистить историю сервера разработки, вам может понадобиться:

git fetch
git merge --squash [commit#]

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

git fetch
git merge --ff-only [commit#]

Наконец, если вам нужны только изменения, внесенные этим одним коммитом

git fetch
git cherry-pick [commit#]
person Mr Blue    schedule 15.11.2019