Git слить и нажать

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

У меня есть 2 локальных ветки:

  • мастер
  • локальный/производство

И 2 пульта:

  • мастер
  • производство

Мне нужно передать локальные изменения в производство. Итак, мой рабочий процесс был:

git checkout local/production
git merge master
git commit
git push

git merge: Кажется, хорошо работает, он обнаружил все различия.

git commit:

В локальном/производственном филиале

Ваша ветка опережает "происхождение/производство" на 2 фиксации.

ничего не зафиксировать (рабочий каталог чист)

И git нажмите:

Все обновленные

Чтобы все это, я не мог нажать мои изменения в удаленный репозиторий.

Ответ 1

Корневая причина: Чтобы сократить пояснение, мне кажется, что ваш local/production не отслеживает origin/production. Вы можете проверить это с помощью git branch -avv.

О git push: обратите внимание, что git push без аргументов обновит все удаленные ветки, обновленные в ваших локальных ветвях отслеживания (с страницы руководства git-push(1)):

git push ...  [<repository> [<refspec>...]]

The special refspec : (or +: to allow non-fast-forward updates) directs git to
push "matching" branches: for every branch that exists on the local side, the
remote side is updated if a branch of the same name already exists on the remote
side. This is the default operation mode if no explicit refspec is found (that is
neither on the command line nor in any Push line of the corresponding remotes
file---see below).

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

git push origin local/production:production

Если вы хотите local/production отслеживать origin/production, вы можете сделать ветку отслеживания local/production для origin/production с помощью опции -u:

git push -u origin local/production:production

(требуется только один раз). Затем вы можете вывести из источника значение local/production.

Резюме: вам нужно понять концепцию ветки отслеживания и своеобразную семантику git push.

P.S. Я задаюсь вопросом о вашем выборе названия вашего ветки local/production здесь. Почему не просто production? Я подозреваю, что у вас уже есть production отслеживание origin/production и, возможно, используйте local/production для вашей локальной разработки. В этом случае разумный рабочий поток выглядит следующим образом:

  • git pull origin production:production, чтобы вытащить изменения в production
  • Если в production появляются новые коммиты, то есть local/production, то либо rebase your local/production on production (или merge production on local/production)
  • В тот момент, когда вы хотите нажать свои изменения, merge или cherry-pick, ваш фиксатор на production и нажмите изменения с помощью git push origin production:production.