Допустим, я работаю над 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
, как в приведенном выше примере, не показывая мне ошибки.
@torek Спасибо, я в курсе. Моя проблема в том, что я хочу, чтобы git предупреждал меня о фиксации, а не переносил изменения. Я прочитал ссылку, которую вы предоставили ранее, но до сих пор не могу понять, как решить проблему.
Я бы рекомендовал часто использовать git status
или, возможно, даже использовать одну из тех вещей, которые задают подсказку оболочки, которая изменяет ваше приглашение, чтобы вы знали, есть ли у вас незавершенная работа. (У меня есть собственный, но есть и стандартный для bash как часть «дополнительного программного обеспечения» Git.) В Git нет настройки, позволяющей заставить вести себя так, как вы хотите.
@ful, это не "проблема". Это сознательный выбор разработчиков Git. Ваши незафиксированные изменения не переносятся из одной ветки в другую - они не существуют в ветке любой.
@Chris, Ха, я действительно в замешательстве. Мои незафиксированные изменения теперь по какой-то причине автоматически переносятся в другие ветки, когда я использую git checkout. Раньше это было не так, и мне приходилось сначала фиксировать их, иначе это не позволило бы мне изменить свою ветку. Некоторые настройки, должно быть, были изменены, так как теперь он ведет себя иначе. И я пытаюсь понять, что именно, чтобы лучше понять. Может это проблема IntelliJ?
@ful, если изменение ветки приведет к потере данных, вы получите такое приглашение. Если смена ветвей не вызывает конфликтов, подсказки нет.
@Chris, я отредактировал свой пост, чтобы прояснить мою проблему. Раньше я получал сообщение об ошибке, о котором вы говорите. Но теперь в каждом случае сообщение об ошибке пропускается, и все изменения автоматически фиксируются и переносятся в ветку, на которую я хочу переключиться.
Все изменения автоматически преданный идее? Это было бы очень странно, но это не то, что показывает ваш пример. Вы просто видите незафиксированные изменения, которые, опять же, не принадлежат к ветке любой. Они нет переносятся из одной ветки в другую. Это не в ветке для начала. Пожалуйста, прочтите вопрос, который Торк разместил в своем первом комментарии. Он написал очень подробный принятый ответ, и он должен прояснить это для вас.
@Chris, еще раз спасибо за помощь, вы привели меня в правильное русло. Хорошо, тогда мои незафиксированные изменения автоматически переносятся в новую ветку. Я прочитал весь ответ как минимум 3 раза, но все еще не мог понять, как это исправить. Почему он автоматически сохраняет изменения? Как мне это отключить? Я не мог этого понять.
Это поведение git по умолчанию. Когда возникают конфликты между незафиксированными изменениями и извлеченной веткой, git отказывается сказать, что вы должны сначала зафиксировать изменения.
Когда нет конфликтов, незафиксированные изменения остаются нетронутыми в рабочем дереве. Это невозможно изменить. Вы можете прочитать об этом подробнее, например, здесь
IntelliJ просто обрабатывает случай, предлагая вам Smart checkout (Stash changes - Checkout - Unstash), когда это возможно.
Изменения, которые вы описываете как «на ветке 2», на самом деле не относятся к ветке 2. Это изменения в вашем рабочий набор, которые не были размещены и не зафиксированы в какой-либо ветке.
Если в вашем рабочем наборе есть изменения, и вы проверяете ветку, эти изменения остаются в рабочем наборе, если они не конфликтуют с другой веткой.
Чтобы избежать этой проблемы, вы можете проверить наличие незафиксированных изменений перед извлечением ветки (я делаю git status -sb
перед любой проверкой). И даже если вы забыли это сделать, вы всегда можете просто вернуться в ветку 2 с помощью git checkout branch2
, а затем зафиксировать изменения.
У вас еще нет преданный идее вашей новой ревизии. Git переносит это через кассу, если может. См. stackoverflow.com/q/22053757/1256452. Обратите внимание, что нет флага, чтобы остановить это; вам просто нужно вернуть
git checkout
, зафиксировать и тогдаgit checkout
другую ветку. (IDE могут вести себя по-разному - все это ориентировано на командную строку.)