Разница в целевой ветви на удаленном сервере.
Предположим, вы сидите на ветке foobar
.
git checkout foobar
..workwork..
git push origin HEAD
HEAD
новейшая версия вашей текущей локальной ветки . Таким образом, в данном примере это означает foobar
. Поэтому эта команда просто отправит foobar
на удаленный сервер. На удаленном сервере он обновит / перезапишет ветку, которая «соответствует» *) той, которую вы отправляете. Обычно это означает отправку foobar
как foobar
. Здесь нет сюрпризов.
С другой стороны
git checkout foobar
..workwork..
git push origin HEAD:master
явно инструктирует git отправить вашу ГОЛОВУ как master . Это означает, что он отправит ваш самый последний foobar
на удаленный сервер как master
на удаленном сервере. Просто так, именно так. Ваш местный master
не изменится и останется нетронутым. Пульт foobar
, если он вообще существует, не изменится. Однако удаленный master
теперь будет синхронизироваться с вашим локальным foobar
*) именно клиент (ваша локальная сторона) решает, какую ветвь выбрать на удаленной стороне. Отображения по умолчанию между локальной веткой и удаленной веткой хранятся в вашем файле .git/config
. Абсолютно возможно заставить вашу локальную ветку aaa
автоматически отправлять на удаленную aaa
или на удаленную bbb
, так что на самом деле я не могу сказать вам, куда именно git push origin xxxx
подтолкнет ветку xxxx - это зависит от сопоставлений - и вы можете изменить их --set-upstream
или просто отредактировав файл конфигурации. С другой стороны, git push origin xxx:yyy
всегда означает именно это: отправьте x как y.
Что касается .gitignore
части - она не имеет ничего общего. Ни тянуть, ни толкать ничего нельзя для .gitignore
. Git-ignore не мешает вам что-либо толкать. Это только помогает вам в не фиксировать ненужные файлы . Даже в этом контексте это не мешает вам, так как вы всегда можете добавить любой файл через git add -f
, и такие файлы будут отправляться на любые пульты во время push, как обычный файл (которым они на самом деле являются).
Обратите внимание, что эти две команды, которые вы показали, используют разные репозитории:
... git.heroku.com/$HEROKU_APP_NAME_PRODUCTION.git
... git.heroku.com/$HEROKU_APP_NAME.git
может быть, именно это и заставило вас думать, что git-ignore меняет дело?