«Git checkout branch1» внезапно объединяет изменения из ветки2 в ветку1 вместо того, чтобы предупреждать меня о необходимости сначала выполнить фиксацию

Допустим, я работаю над branch1 и создаю branch2 из branch1.

Вплоть до недавнего времени, когда я внес некоторые изменения в branch2 и не зафиксировал их, не переключившись на branch1, консоль IntelliJ предупредила меня, что мне сначала нужно зафиксировать свои изменения, иначе я не смогу их изменить.

Но теперь, когда я использую git checkout branch1, когда я нахожусь на branch2, без фиксации моих изменений на branch2, по какой-то причине все мои изменения автоматически фиксируются и передаются на branch1.

Например:

Я использую branch2 и модифицирую некоторые файлы. Забываю зафиксировать изменения и пытаюсь переключиться на branch1. Вот что происходит ...

git checkout branch1
Switched to branch 'branch1'
M       src/main/java/Test.java
Your branch is up to date with 'origin/branch1'.

... и все изменения, которые я сделал в branch2, перенесены в branch1!

Я не хочу такого поведения. Я не хочу переносить все изменения, сделанные в branch2, на branch1, когда я использую git checkout. Он должен предупредить меня, что я забыл выполнить фиксацию, вместо того, чтобы принять изменения.

Обновлено:

Раньше я получал сообщение об ошибке, подобное следующему:

git checkout branch1
error: Your local changes to the following files would be overwritten by checkout:
    Test.java
Please, commit your changes or stash them before you can switch branches.
Aborting

И теперь сообщение игнорируется, и изменения просто автоматически объединяются / переносятся с branch2 на branch1, как в приведенном выше примере, не показывая мне ошибки.

У вас еще нет преданный идее вашей новой ревизии. Git переносит это через кассу, если может. См. stackoverflow.com/q/22053757/1256452. Обратите внимание, что нет флага, чтобы остановить это; вам просто нужно вернуть git checkout, зафиксировать и тогдаgit checkout другую ветку. (IDE могут вести себя по-разному - все это ориентировано на командную строку.)

torek 01.05.2018 20:20

@torek Спасибо, я в курсе. Моя проблема в том, что я хочу, чтобы git предупреждал меня о фиксации, а не переносил изменения. Я прочитал ссылку, которую вы предоставили ранее, но до сих пор не могу понять, как решить проблему.

ful 01.05.2018 20:23

Я бы рекомендовал часто использовать git status или, возможно, даже использовать одну из тех вещей, которые задают подсказку оболочки, которая изменяет ваше приглашение, чтобы вы знали, есть ли у вас незавершенная работа. (У меня есть собственный, но есть и стандартный для bash как часть «дополнительного программного обеспечения» Git.) В Git нет настройки, позволяющей заставить вести себя так, как вы хотите.

torek 01.05.2018 20:27

@ful, это не "проблема". Это сознательный выбор разработчиков Git. Ваши незафиксированные изменения не переносятся из одной ветки в другую - они не существуют в ветке любой.

Chris 01.05.2018 20:50

@Chris, Ха, я действительно в замешательстве. Мои незафиксированные изменения теперь по какой-то причине автоматически переносятся в другие ветки, когда я использую git checkout. Раньше это было не так, и мне приходилось сначала фиксировать их, иначе это не позволило бы мне изменить свою ветку. Некоторые настройки, должно быть, были изменены, так как теперь он ведет себя иначе. И я пытаюсь понять, что именно, чтобы лучше понять. Может это проблема IntelliJ?

ful 01.05.2018 20:58

@ful, если изменение ветки приведет к потере данных, вы получите такое приглашение. Если смена ветвей не вызывает конфликтов, подсказки нет.

Chris 01.05.2018 21:00

@Chris, я отредактировал свой пост, чтобы прояснить мою проблему. Раньше я получал сообщение об ошибке, о котором вы говорите. Но теперь в каждом случае сообщение об ошибке пропускается, и все изменения автоматически фиксируются и переносятся в ветку, на которую я хочу переключиться.

ful 01.05.2018 21:13

Все изменения автоматически преданный идее? Это было бы очень странно, но это не то, что показывает ваш пример. Вы просто видите незафиксированные изменения, которые, опять же, не принадлежат к ветке любой. Они нет переносятся из одной ветки в другую. Это не в ветке для начала. Пожалуйста, прочтите вопрос, который Торк разместил в своем первом комментарии. Он написал очень подробный принятый ответ, и он должен прояснить это для вас.

Chris 01.05.2018 21:16

@Chris, еще раз спасибо за помощь, вы привели меня в правильное русло. Хорошо, тогда мои незафиксированные изменения автоматически переносятся в новую ветку. Я прочитал весь ответ как минимум 3 раза, но все еще не мог понять, как это исправить. Почему он автоматически сохраняет изменения? Как мне это отключить? Я не мог этого понять.

ful 01.05.2018 21:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
274
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это поведение git по умолчанию. Когда возникают конфликты между незафиксированными изменениями и извлеченной веткой, git отказывается сказать, что вы должны сначала зафиксировать изменения.

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

IntelliJ просто обрабатывает случай, предлагая вам Smart checkout (Stash changes - Checkout - Unstash), когда это возможно.

Ответ принят как подходящий

Изменения, которые вы описываете как «на ветке 2», на самом деле не относятся к ветке 2. Это изменения в вашем рабочий набор, которые не были размещены и не зафиксированы в какой-либо ветке.

Если в вашем рабочем наборе есть изменения, и вы проверяете ветку, эти изменения остаются в рабочем наборе, если они не конфликтуют с другой веткой.

Чтобы избежать этой проблемы, вы можете проверить наличие незафиксированных изменений перед извлечением ветки (я делаю git status -sb перед любой проверкой). И даже если вы забыли это сделать, вы всегда можете просто вернуться в ветку 2 с помощью git checkout branch2, а затем зафиксировать изменения.

Другие вопросы по теме