Git push не удалось после git rebase - PullRequest
0 голосов
/ 01 октября 2019

Я новичок в Git и пытаюсь понять, как лучше всего обновлять базу кода с учетом последних изменений в основной ветке. Вот моя ситуация - я работаю над функцией, скажем, функцией А, и я создаю ветку из своего мастера с именем функция А, используя git checkout -b featureA.

Я понимаю, что на данный момент функция А является моей локальнойветвь, такая же, как локальная главная ветвь (потому что именно там я и разветвлялся). Я добавляю свои изменения в свою локальную ветку и в конце дня я фиксирую свои изменения и отправляю их в свою удаленную ветку (origin / featureA).

На следующий день я хочу продолжить работу над FeatureA, откудаЯ остановился. Поэтому я перебазирую свою ветку featureA последним мастером. Для этого я использую,

git fetch
git rebase -i origin/master

Обычно это работает нормально. Но снова в конце второго дня, когда я пытаюсь отправить свои последние изменения в мою удаленную ветку (origin / featureA), я не могу этого сделать, и я получаю следующее сообщение -

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Я пыталсяпроталкивая мои изменения с помощью git push -f, но даже это не помогло.

Однако, если я объединяю основную ветвь с моей ветвью функций (а не перебазирую основную ветвь), я могу перейти к удаленной функцииответвление.

Пожалуйста, помогите мне понять -

Является ли rebase хорошим вариантом при работе в большой команде? Если да, то как избежать ситуации выше? Если нет, то какова другая альтернатива?

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Когда вы перебазируете свою локальную ветку featureA, строка истории ветки меняется. Линия истории этой локальной ветки расходится с веткой репо "featureA".

Чтобы протолкнуть разветвленную ветвь к ее удаленному аналогу, вам нужно сделать «принудительный толчок» с помощью -f, сокращенно --force.

git push origin featureA -f
0 голосов
/ 01 октября 2019

Если вы не можете перенести свою локальную ветвь в удаленную ветвь, это, скорее всего, связано с одной из двух причин:

  1. Кто-то уже отправил в удаленную ветвь, в результате чего ваша локальная ветвьветвь становится не синхронизированной и git для подтверждения конфликтов слияния
  2. Вы изменили свою локальную историю фиксации таким образом, что для push-запроса потребуется изменить историю удаленной фиксации

Вариант 2может произойти, если вы используете «rebase» вместо «слияние». Как правило, я бы предложил избегать rebase любой ценой в пользу слияния: rebase буквально изменит вашу историю коммитов (с дополнительным преимуществом сохранения чистоты дерева коммитов), в то время как слияние сохранит историю коммитов с «обратной стороной» создания вашегосовершать историю несколько сложно.

Следующий процесс всегда будет обеспечивать беспроблемное взаимодействие с git:

  • ветвь от 'master' (или нужной ветки) с 'git checkout -b'
  • developmentлокально, затем переместите вашу ветку на удаленную позицию с помощью 'git push --set-upstream origin (при условии, что вы являетесь единственным человеком, работающим над этой веткой)
  • периодически "перебазируйте" с мастером (перебазирование здесь является общим терминомфактическая команда git, которую вы используете - это «слияние») с «мастером git слияния», когда вы зарезервированы для вашей локальной ветки

Пример:

git clone <repo>
git checkout master
git pull
git checkout -b <branch_name>
... development
git add *
git commit -m "message"
git push --set-upstream origin <branch_name>
... development
git add *; git commit -m "message"
git checkout master
git pull
git checkout branch_name
git merge master
... resolve conflicts, if any
git push <branch_name>
... repeat until pull request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...