Я новичок в Git, поэтому не стесняйтесь относиться ко мне как к новичку.
У нас такой рабочий процесс. У нас есть филиал, по dev
которому я могу связаться origin/dev
. Когда мы вносим изменения, мы создаем ответвление от dev:
git checkout -b FixForBug origin / dev
Теперь у меня есть ветка, FixForBug
которая отслеживает (думаю, это правильное слово) origin/dev
. Таким образом, если я сделаю это, git pull
это внесет новые изменения, и origin/dev
это здорово. Теперь, когда я закончил исправление, я нажимаю на удаленную ветку с тем же именем.
Сначала я извлекаю любые изменения из origin/dev
и делаю перебазирование:
git pull --rebase
Затем я отправляю изменения в удаленную ветку с тем же именем:
git push origin FixForBug
Теперь на удаленном сервере есть ветка, и я могу создать запрос на перенос, чтобы это изменение было одобрено и снова слито с веткой dev. Я никогда ничего origin/dev
себе не навязываю . Я предполагаю, что это довольно распространенный рабочий процесс.
В первый раз, когда я делаю git push
, он отлично работает и создает удаленную ветку. Однако, если я нажимаю второй раз (допустим, во время проверки кода кто-то указывает на проблему), я получаю следующую ошибку:
ошибка: не удалось отправить некоторые ссылки на ' https://github.limeade.info/Limeade/product.git '. Подсказка: обновления были отклонены, потому что вершина вашей текущей ветки находится за подсказкой: ее удаленный аналог. Интегрируйте удаленные изменения (например, подсказку: 'git pull ...') перед повторным нажатием. Подсказка: подробности см. в «Примечании о быстрой перемотке вперед» в «git push --help».
Однако, если я делаю это, git status
он говорит, что я опережаю origin/dev
на 1 фиксацию (что имеет смысл), и если я следую подсказке и бегу git pull
, он говорит, что все обновлено. Я думаю, это потому, что я перехожу в другую ветку, чем моя восходящая ветка. Я могу исправить эту проблему, запустив:
git push -f origin FixForBug
В этом случае, он будет толкать изменения в удаленной ветви, говоря (принудительное обновление) и все , что появляется , чтобы быть хорошим на удаленном филиале.
Мои вопросы:
Почему -f
требуется в этом сценарии? Обычно, когда вы что- то принуждаете , это потому, что вы делаете что-то неправильно или, по крайней мере, против стандартной практики. Могу ли я сделать это, или это что-то испортит в удаленной ветке или создаст проблемы для тех, кому в конечном итоге придется объединить мои материалы с разработчиком?
git pull origin FixForBug
прежде чем я на это нажму ? Хорошо, это имеет смысл. Не стесняйтесь добавлять в качестве ответа!Ответы:
-f
Это на самом деле требуется из-за перебазирования. Всякий раз, когда вы выполняете перебазирование, вам нужно будет выполнить принудительное нажатие, потому что удаленная ветвь не может быть быстро перенаправлена на вашу фиксацию. Вы всегда хотели бы убедиться, что вы выполняете вытягивание, прежде чем нажимать, но если вам не нравится принудительно нажимать на master или dev, вы можете создать новую ветку для отправки, а затем объединить или сделать PR ,источник
Чтобы убедиться, что ваша локальная ветка FixForBug не опережает удаленную ветку, FixForBug извлекает и объединяет изменения перед отправкой.
источник
the tip of your current branch is behind its remote counterpart
означает, что в удаленной ветке произошли изменения, которых у вас нет локально. и git сообщает, что вы импортируете новые измененияREMOTE
и объединяете их с вашим кодом, а затемpush
на удаленный компьютер.Вы можете использовать эту команду для принудительного внесения изменений на сервер с помощью local repo ().
с
-f
тегом, который вы заменитеRemote Brach code
своим кодом.источник
Если вы хотите избежать использования
-f
, вы можете использовать тольковместо того
При отсутствии перебазирования изменения будут извлечены из вашей ветки
origin/dev
и объединены с нимиFixForBug
. Тогда вы сможете запуститьбез использования
-f
.источник
-f
потому что вы заменяете фиксации в вышестоящем репозитории на другие с другой (перебазированной) историей. Если бы вы использовали такой продукт, как Gerrit, тогда он поддерживает этот вид рабочего процесса пересмотра кода без необходимости использования-f
при нажатии. Мы используем Gerrit в работе таким образом, и он работает очень хорошо.Команда, которую я использовал с Azure DevOps, когда я обнаружил сообщение «обновления были отклонены, потому что верхняя часть вашей текущей ветки отстает», была / является следующей командой:
git pull origin master
(или можно начать с новой папки и сделать клонирование) ..
Этот ответ не касается поставленного вопроса, в частности, Кейф ответил на него выше, но он отвечает на заголовок / текст заголовка вопроса, и это будет распространенный вопрос для пользователей Azure DevOps.
Я заметил комментарий: «Вы всегда должны быть уверены, что делаете тягу, прежде чем толкать» в ответе Кейфа выше!
Я также использовал инструмент Git Gui в дополнение к инструменту командной строки Git.
(Я не был уверен, как сделать эквивалент команды командной строки «git pull origin master» в Git Gui, поэтому я вернулся в командную строку, чтобы сделать это).
На диаграмме показаны различные команды git для различных действий, которые вы, возможно, захотите предпринять:
источник
Это случилось со мной.
Решение: Потяните вниз по моей собственной отрасли , так я понимаю , что дополнительное обязательство. Затем верните его в мою удаленную ветку.
буквально то, что я сделал в своей ветке, было:
источник
Вот как я решил свою проблему
Предположим, что восходящая ветвь - это та, из которой вы разветвились, а origin - ваше репо, и вы хотите отправить MR / PR в восходящую ветвь.
У вас уже есть, скажем, около 4 коммитов, и вы получаете
Updates were rejected because the tip of your current branch is behind.
Вот что я сделал
Во-первых, раздавите все свои 4 коммита
Вы получите список коммитов с
pick
написанным на них. (открыт в редакторе)пример
в
После этого вы можете сохранить комбинированный коммит
следующий
Вам нужно будет спрятать свою фиксацию
Вот как
теперь переустановите свою ветку вверх по течению
Теперь вставьте свой спрятанный коммит
зафиксировать эти изменения и подтолкнуть их
источник
Это должно быть потому, что фиксация опережает ваш текущий толчок.
1) git pull origin "имя ветки, которую вы хотите нажать"
2) git rebase
если git rebase прошла успешно, то хорошо. В противном случае вы разрешаете все конфликты слияния локально и продолжаете его до тех пор, пока перебазирование с удаленным не будет успешным.
3) git rebase --continue
источник
У меня возникла эта проблема при попытке нажать после перезагрузки через Visual Studio Code, моя проблема была решена путем простого копирования команды из окна вывода git и выполнения ее из окна терминала в Visual Studio Code.
В моем случае команда была примерно такой:
git push origin NameOfMyBranch:NameOfMyBranch
источник
Вы, должно быть, добавили новые файлы в свои коммиты, которые не были отправлены. Проверьте файл и снова нажмите этот файл, и попробуйте потянуть / нажать, он будет работать. Это сработало для меня ..
источник