Как я могу выдвинуть определенный коммит на удаленный, а не предыдущий коммит? - PullRequest
746 голосов
/ 12 июля 2010

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

Возможно ли это?

Ответы [ 6 ]

955 голосов
/ 12 июля 2010

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

git push <remotename> <commit SHA>:<remotebranchname>

при условии, что <remotebranchname> уже существует на пульте дистанционного управления.(Если этого не произойдет, вы можете использовать git push <remotename> <commit SHA>:refs/heads/<remotebranchname> для его автоматического создания.)

Если вы хотите отправить коммит без проталкивания предыдущих коммитов, вы должны сначала использовать git rebase -i, чтобыпереупорядочить коммиты.

144 голосов
/ 22 декабря 2010

Попробовал предложенное решение:

git push <remotename> <commit SHA>:<remotebranchname>

как это:

git push origin 712acff81033eddc90bb2b45e1e4cd031fefc50f:master

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

63 голосов
/ 12 января 2015

Другие ответы отсутствуют в описаниях переупорядочения.

git push <remotename> <commit SHA>:<remotebranchname>

будет выдвигать один коммит, но этот коммит должен быть самым старым из ваших локальных, не выдвинутых, коммитов, чтобы не быть перепутаннымс top, first или tip commit, которые, по моему мнению, являются неоднозначными.Для коммита требуется самый старый из ваших коммитов, то есть самый дальний из ваших последних коммитов.Если это не самая старая фиксация, тогда все фиксации от вашего самого старого, локального, не выдвинутого SHA к указанному SHA будут переданы.Для переупорядочения коммитов используйте:

git rebase -i HEAD~xxx

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

Для подведения итогов я использовал

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

дляотправить один коммит в мою удаленную главную ветку.

Ссылки:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

См. также:

  1. git: дублирование коммитов после локальной перебазировки с последующим извлечением
  2. git: нажатие отдельных коммитов, переупорядочение с перебазированием, дублирование коммитов
25 голосов
/ 13 июля 2010

Я бы предложил использовать git rebase -i;переместите коммит, который вы хотите нажать, на вершину коммитов, которые вы сделали.Затем используйте git log, чтобы получить SHA перебазированного коммита, проверить его и нажать на него.Ребаз будет иметь гарантию того, что все ваши другие коммиты теперь являются дочерними по отношению к тому, который вы нажали, поэтому будущие толчки будут также работать нормально.

20 голосов
/ 17 октября 2013

Cherry-pick лучше всего работает по сравнению со всеми другими методами при нажатии определенного коммита.

Способ сделать это:

Создать новую ветку -

git branch <new-branch>

Обновите новую ветку, указав исходную ветку -

git fetch

git rebase

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

Cherry-выберите sha id, который вы хотите сделать push -

git cherry-pick <sha id of the commit>

Вы можете получить sha id, запустив

git log

Подтолкни его к своему происхождению -

git push

Запустите gitk, чтобы увидеть, что все выглядит так, как вы хотели.

11 голосов
/ 12 июля 2010

Полагаю, вам придется «вернуться» назад к этому коммиту и затем нажать его. Или вы можете cherry-pick зафиксировать в новую ветку и отправить ее в ветку в удаленном хранилище. Что-то вроде:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}
...