TL; DR
Возможно, вы захотите изменить настройку upstream вашей ветви и перебазировать:
git branch --set-upstream-to origin/PH-19312
git rebase
Обратите внимание, что если ваш Git очень древний,у вас не будет --set-upstream-to
.Вы можете использовать git branch --set-upstream
, но вы должны быть более многословным и использовать то, что выглядит как неправильный порядок аргументов (вот почему современный Git имеет --set-upstream-to
вместо --set-upstream
):
git branch --set-upstream estrom/PH-19312 origin/estrom/PH-19312
Long
Здесь возникают две проблемы, связанные с исходной командой git checkout
.
Настройка
Давайте сначала посмотрим на эту команду:
$ git checkout -b estrom/PH-19312 origin/release-18.9.0
Branch estrom/PH-19312 set up to track remote branch release-18.9.0 from origin.
Switched to a new branch 'estrom/PH-19312'
Флаг -b
указывает git checkout
создать новую ветвь.Следующее слово, estrom/PH-19312
, предоставляет имя для новой ветви.Последующее слово origin/release-18.9.0
указывает, какой коммит проверяется, и делает еще одну вещь при использовании с -b
: оно сообщает Git, что по умолчанию имя новой ветви должно иметь this имя установлено как upstream .
Пришло время сделать небольшую паузу и обсудить, что мы подразумеваем здесь под "ветвью" (см. Также Что именно мы подразумеваем под "ветвью"«).В этом случае фраза branch estrom/PH-19312
означает имя estrom/PH-19312
в refs/heads
пространстве имен ссылок , а "восходящий поток" - записьв .git/config
относительно имени estrom/PH-19312
. Само имя ветви просто действует как указатель на какой-то существующий коммит, где-то на графике «всех когда-либо сделанных коммитов», который находится в вашем собственном репозитории Git.Перечислять все коммиты могут только те, у кого на самом деле есть клон репозитория, но, просто сделав некоторые предположения из вышеприведенного вывода, я нарисую это так, что, вероятно, немного не так, но по крайней мере что-то правильно :-):
o--o--o <-- origin/develop
/
...--o--o--o--o <-- master (HEAD), origin/master
\ \
\ E <-- origin/estrom/PH-19312
\
o--* <-- origin/release-18.9.0
Круглые узлы o
представляют коммиты.Я выбрал несколько особенно интересных коммитов и дал им другой символ, чтобы мы могли поговорить о них позже.
Затем вы просите Git (через git checkout -b ...
):
- Найдите коммит, на который
origin/release-18.9.0
указывает: я пометил этот коммит *
здесь. - Извлеките коммит в index (также известный как staging area *).1070 * и кеш; см. Другие публикации StackOverflow или документацию Git) и рабочее дерево .
- Создайте новую метку
estrom/PH-19312
, указывающую на этоcommit.
В результате сам график остается неизменным, но есть новая метка ветви, и теперь ваш HEAD присоединен к этой новой метке ветви:
o--o--o <-- origin/develop
/
...--o--o--o--o <-- master, origin/master
\ \
\ E <-- origin/estrom/PH-19312
\
o--* <-- estrom/PH-19312 (HEAD), origin/release-18.9.0
На этом этапе вы выполняете некоторую работу, успешно
Вы изменили некоторые файлы, git add
отредактировали их в индексе и git commit
ed:
$ git commit -am "PH-19312 hide calories for literacy item in order history"
[estrom/PH-19312 5ace4de] PH-19312 hide calories for literacy item in order history
1 file changed, 2 insertions(+)
Это создало новый коммит в графе коммитов, поэтому давайте обновим чертеж (я собираюсь отбросить верхнюю строку полностью since Я не использую его):
...--o--o--o--o <-- master, origin/master
\ \
\ E <-- origin/estrom/PH-19312
\
o--* <-- origin/release-18.9.0
\
N <-- estrom/PH-19312 (HEAD)
Обратите внимание, что родитель нового коммита N
является существующим коммитом *
.Это, вероятно, неправильно: вы начали с release-18.9.0
, как видно на origin
(который ваш Git запоминает как origin/release-18.9.0
), а не с estrom/PH-19312
, как видно на origin
.
Первыйнеудачная команда Git
В этот момент вы запустили:
$ git push
To ssh://stash.mycompany.com:7999/phi/qo6.git
! [rejected] estrom/PH-19312 -> estrom/PH-19312 (non-fast-forward)
По умолчанию git push
пытается нажать, основываясь на настройке push.default
.В этом случае все, что вы установили, заставило ваш Git нажать estrom/PH-19312
.Однако ваша настройка push
не является ни simple
, ни upstream
.Это может быть matching
(особенно если ваш Git довольно древний, например, Git с 1.7 до 1.9 вместо 2.0+).Так что ваш Git подумал, что ему следует попросить другого Git на ssh://stash.mycompany.com:7999/phi/qo6.git
, чтобы этот другой Git установил его estrom/PH-19312
, чтобы он указывал на коммит N
.
Но их estrom/PH-19312
очков совершают E
.Если они установят их estrom/PH-19312
для указания на N
, они потеряют совершить E
.Поэтому они говорят: Нет, я не буду этого делать: отклонено: без ускоренной перемотки вперед. Вот что означает без ускоренной перемотки вперед : ярлык, который у них теперь есть, указывает на какой-то коммити вы предлагаете, чтобы они удалили некоторые коммиты из своей ветви, при этом устанавливая в своей ветке указатель на ваш новый коммит N
.
Обратите внимание, что если вы использовали simple
поскольку ваш push.default
, ваш Git откажется делать push, потому что вышестоящее имя - release-18.9.0
(ваш origin/release-18.9.0
).Если бы вы использовали upstream
в качестве настройки push.default
, ваш Git попросил бы их Git установить их release-18.9.0
- это возможно, но я думаю, маловероятно, что это именно то, что вы хотите.
Rebase делаетничего из-за настройки восходящего потока
Когда вы используете git rebase
или git pull --rebase
, ваш Git пытается скопировать ваш коммит N
поверх вашего origin/release-18.9.0
.Как видно из графика, ваш коммит N
уже находится над коммитом, на который указывает origin/release-18.9.0
, поэтому rebase ничего не делает.
Если вы измените настройку восходящего потока для ветки estrom/PH-19312
на origin/estrom/PH-19312
, git rebase
скопирует N
в новый коммит N'
, который находится на вершине origin/estrom/PH-19312
:
...--o--o--o--o <-- master, origin/master
\ \
\ E <-- origin/estrom/PH-19312
\ \
\ N' <-- estrom/PH-19312 (HEAD)
\
o--* <-- origin/release-18.9.0
\
N [abandoned]
Этот коммит теперь подходит для отправки другому Git для it чтобы добавить его его до estrom/PH-19312
.Я подозреваю, что это то, что вы хотите.