2009-08-18 12 views
30

Как вы можете git-checkout без перезаписи данных?Git checkout без перезаписи данных

Я бегу

git checkout master 

я

error: Entry 'forms/answer.php' would be overwritten by merge. Cannot merge. 

Это удивительно, так как я не знаю, что Git сливается, когда я git-checkout. Я всегда запускаю команду отдельно git merge new-feature. Кажется, что это явно не нужно, если Git сливается при оформлении заказа.

ответ

51

Git предупреждает вас, что формы/answers.php имеют изменения в вашей рабочей копии или индексе, которые не были зафиксированы.

Вы можете использовать git-stash, чтобы сохранить изменения, то ГИТ-тайник применять восстановить их.

Общее использование git-stash - это то, что вы работаете над изменениями, но затем должны временно проверить другую ветку, чтобы исправить ошибку. Таким образом, вы можете указать stash ваши изменения в вашем индексе и рабочей копии, проверить другую ветку, исправить ошибку, зафиксировать, проверить исходную ветку и git-stash применить для восстановления ваших изменений и отправки туда, куда вы ушли выкл.

+1

Благодарим за упоминание 'git-stash'! - Я не знал, что его цель должна использоваться в таких ситуациях, как эта. –

+2

По какой-то причине я не мог использовать команду git-stash. Вместо этого мне пришлось использовать «git stash» (без дефиса). –

+0

Если все, что вам нужно, - это проверить другую ревизию, сохраняя при этом свои незафиксированные изменения (что иногда бывает при поиске исправления, вносящего ошибку), предложение Jakub ('git checkout -m') намного проще. –

18

Гит делает 2-полосное слияние uncomitted изменений при переключении ветвей (используя git checkout <branch>), но обычно это делает только тривиальным (дерево-уровень) слияние.

Кроме git-stashsolution by Karl Voigtland, вы можете дать дополнительные опции git checkout, выбрав одну из следующих опций:

  • Телль мерзавец в стараться объединить uncomitted изменения в отрасли вы переключитесь с -m/--merge вариант. С помощью этой опции выполняется трехстороннее слияние между текущей ветвью, содержимым рабочего дерева и новой веткой, и вы будете в новой ветке.

  • Сообщите git переписать несоблюдение изменений, отбрасывание местных изменений с помощью -f вариант. Предупреждение: незавершенные изменения будут потеряны!

+2

Спасибо за это. Второй («git checkout -f master») помог мне вернуться. Я не знаю, какие изменения я потерял, но они не были важны, поскольку это очень старая копия репо, которую я просто хотел проверить. – mgilson

+0

Можно ли сделать «противоположное» 'git checkout -f'? В принципе, я бы хотел, чтобы Git отказался от проверки файлов, которые могли бы вызвать конфликт. – giusti