Я использую Visual Studio, а не командную строку Git, для выполнения операций git, и я случайно выполнил перебазирование назад (мастер на ветвь вместо перехода на мастер, мастер находится дальше). Изменения зафиксированы, но не отправлены. Теперь показывает, что у меня 21 входящее изменение и 19 исходящих изменений. Есть ли какой-нибудь способ в Visual Studio IDE отменить перебазирование на этом этапе? Все входящие изменения находятся в исходящих изменениях, кроме изменений в ветке, поскольку у меня был последний код. Могу ли я просто просмотреть все исходящие изменения и отменить их? Отменит ли это изменения и для других пользователей и по существу удалит их?
tl;dr: (Скорее всего) все, что вам нужно сделать, это удалить локальную копию master
. Если вы хотите сохранить его, удалите его и проверьте снова или git reset --hard origin/master
.
Отказ от ответственности: в приведенных ниже примерах используется командная строка, но при желании вы можете делать большую часть этого и в пользовательском интерфейсе Visual Studio, например извлекать ветки и удалять их. (Я предполагаю, что вы знаете, как это сделать.)
Подробности:
Если у вас не было новых личных коммитов на master
, то вы можете просто удалить свою локальную копию. В большинстве случаев вам даже не нужна локальная копия master
, поскольку вы можете (и, возможно, должны) просто использовать origin/master
вместо этого в любое время, когда вам нужно использовать его для чего-то. В Visual Studio просто используйте origin/master
вместо master
для того, что вы обычно делаете. Примеры командной строки:
# Update all my copies of remote branches:
git fetch
# Create a new branch
git switch -c some-new-feature origin/master --no-track
# Update your feature branch
git switch some-new-feature
git rebase origin/master
# Or in a single command even if your branch isn't checked out:
git rebase origin/master some-new-feature
Основное преимущество отсутствия локальной копии master
заключается в том, что она обычно устарела, и если вы забудете ее обновить, вы будете использовать ее старую копию.
При этом, если вы действительно хотите иметь локальную копию, в вашем случае вы можете выполнить ее полный сброс:
# checkout master
git switch master
# reset it to the remote version which is what you had before the rebase:
git reset --hard origin/master
# OR
git reset --hard @{u} # this is just shorthand for the remote tracking branch
# OR just delete it and check it out again
git switch --detach # in case you have master checked out right now
git branch -D master # delete your local copy
git switch master # check it out again which will be origin/master
Примечание: в случае, если у вас действительно были личные коммиты master
, которые вас интересуют, используйте git reflog
, чтобы найти идентификатор коммита, который вы использовали прямо перед перебазированием, а затем резко сбросьте его до этого значения:
git switch master
git reset --hard <commit-id-before-rebase>
Судя по формулировке вопроса, я не думаю, что это так.
@TimF, точно. Просто короткая и приятная команда. Нет необходимости в таком длинном ответе, если честно :D
@joker Вот почему у меня вверху написано «tl;dr:». Но я только что подправил это, чтобы подчеркнуть, что удаление и повторная проверка или просто сброс ветки имеют тот же эффект.
git reset --hard origin/master сделал то, что мне было нужно. Спасибо!