Предположим, у меня есть 5 локальных коммитов. Я хочу подтолкнуть только 2 из них к централизованному репо (используя рабочий процесс в стиле SVN). Как мне это сделать?
Это не сработало:
git checkout HEAD~3 #set head to three commits ago
git push #attempt push from that head
Это заканчивает тем, что подталкивает все 5 местных коммитов.
Я полагаю, что я мог бы сделать git reset, чтобы фактически отменить мои коммиты, затем git stash и затем git push - но у меня уже есть записанные сообщения коммитов и организованные файлы, и я не хочу их переделывать.
Я чувствую, что какой-то флаг, переданный для нажатия или сброса, будет работать.
Если это поможет, вот мой конфиг
[ramanujan:~/myrepo/.git]$cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = ssh://server/git/myrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
источник
master~3
. Любая ссылка на желаемую «до» фиксацию в равной степени действительна, например,HEAD~3
илиHEAD~~~
, или конкретный SHA, или тег, который маркирует эту фиксацию.git push
...)master
для удаленной стороны refspec, напримерgit push origin tocommit:newbramch
Что я делаю, так это работаю в местном отделении под названием «работа». Эта ветвь содержит все временные коммиты (такие как обходные пути или опции частной сборки или что-то еще), которые я не собираюсь выдвигать в обратный репозиторий. Я работаю далеко на этой ветке, а затем , когда я хочу , чтобы совершить переключаюсь на главной ветви, вишня подобрать соответствующие коммиты , что я действительно хочу , чтобы совершить, а затем нажмите мастер.
Вытащив изменения из апстрима в мою главную ветку, я
git checkout work
иgit rebase master
. Это переписывает все мои локальные изменения, чтобы быть в конце истории.Я на самом деле использую
git svn
с этим рабочим процессом, так что моя операция "толкать" включает в себяgit svn dcommit
. Я также используюtig
хороший просмотрщик репозиториев в текстовом режиме для выбора подходящих коммитов.источник
work
ветки. Затем вы объединяете определенные ветки,master
чтобы не потерять их историю. Работая сwork
, вы объединяете все свои ветви в него. Это больше накладных расходов, но в некоторых случаях может стоить того.По умолчанию git-push помещает все ветви. Когда вы делаете это:
Вы переходите к отдельному HEAD (вы не находитесь ни в одной ветви), а затем проталкиваете все ветви, включая локальный мастер (который все еще там, где он был), к удаленному мастеру.
Ручное решение:
Если вы обнаружите, что поведение по умолчанию для всех веток сбивает с толку (и опасно!), Добавьте это в ваш ~ / .gitconfig:
Тогда толкается только та ветка, на которой вы находитесь. В вашем примере (отдельная голова) вы бы получили это сообщение об ошибке, а не случайно нажали неправильные коммиты:
источник
Короткий ответ:
git push <latest commit SHA1 until you want commits to be pushed>
Примеры:
git push fc47b2
git push HEAD~2
Длинный ответ:
Коммиты связаны друг с другом в виде цепочки с родительским / дочерним механизмом. Таким образом, отправка коммита фактически также подталкивает все родительские коммиты к этому коммиту, которые неизвестны удаленному. Это неявно делается, когда вы делаете
git push
текущий коммит: все предыдущие коммиты также передаются, потому что эта команда эквивалентнаgit push HEAD
.Таким образом, вопрос может быть переписан в Как нажать конкретный коммит, и этот конкретный коммит может быть, например, HEAD ~ 2.
Если коммиты, которые вы хотите выдвинуть, не являются последовательными, просто измените их порядок
git rebase -i
перед определенным толчком .источник
1) Используйте «git rebase», чтобы изменить порядок ваших коммитов, если хотите.
Эта команда отобразит что-то вроде этого в вашем редакторе (я использую vim)
2) Упорядочить ваши коммиты по вашему выбору с помощью простой резки пасты. Предположим, новый заказ
выбрать 9781434 коммит
выбрать c3d4961 commitC
выбрать 4791291 commitA
выберите aa1cefc commitD
выберите a2bdfbd commitB
Сделайте эти изменения в вашем редакторе и нажмите Ctrl + O (writeOut)
Или вы также можете использовать
Вы можете проверить новую последовательность с
3) Теперь используйте
Если только одна ветвь в удаленной (источник) и одна в локальной (мастер), просто используйте
Это подтолкнет commitB и commitD.
источник