2014-09-23 2 views
1

Я пытаюсь перейти от одной локальной ветви к другой. Гит говорит мне, что я не могу этого сделать, потому что мой local changes to the following files would be overwritten by checkout.В чем разница между git-stash и git-checkout?

Затем я получаю «рекомендацию» Please, commit your changes or stash them before you can switch branches.

Я знаю, что мне не нужны изменения в указанном файле. Это нормально, чтобы перезаписать их. Итак, я стараюсь stash. Я выполняю git stash file_name. В результате я получаю:

Usage: git stash list [<options>] 
    or: git stash show [<stash>] 
    or: git stash drop [-q|--quiet] [<stash>] 
    or: git stash (pop | apply) [--index] [-q|--quiet] [<stash>] 
    or: git stash branch <branchname> [<stash>] 
    or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] 
       [-u|--include-untracked] [-a|--all] [<message>]] 
    or: git stash clear 

ОК. Это не работает. Затем я попробую git checkout file_name. Никаких жалоб от git. Затем я могу переключиться с одной ветви на другую. Итак, кажется, что я получил то, что мне было нужно (перейдите во вторую ветку без сохранения изменений в первую ветку).

Однако, я хотел бы спросить, почему stash не работает, и как конечный результат будет отличаться в случае, если он сработал?

+1

'stash' не работает, потому что вы использовали его неправильно. См. 'Git help stash'. Разница, которую вы просите, заключается в том, что если бы вы спрятали изменения, они были бы спрятаны, но теперь вы потеряли эти изменения. – Biffen

+0

Что значит «сшить» изменения? Если изменения «спрятаны», то они как бы запомнены? Тогда в чем разница между «stash» и «add».Я запоминаю изменения (в ветке), если я «добавлю» эти изменения в промежуточную область. – Roman

+0

'git help stash' объяснит это подробно. – geoffspear

ответ

5

Вы не можете указать один файл в явном виде. Если бы вы запустили git-stash, это бы спрятало все ваши изменения.

git checkout -- file отбрасывает изменения в этом файле в рабочем каталоге и проверяет версию этого файла, записанную текущим фиксатором (то есть тот, на который указывает HEAD).

+0

Почему git предоставляет возможность хранить все, кроме одного файла? Не задерживает «отбрасывает мои изменения в файлы в рабочем каталоге и проверяет последнюю совершенную версию этого файла»? – Roman

+1

@roman, вы можете запрограммировать любую часть, которую хотите. Подобно 'git add -p', который позволяет добавлять или отклонять каждый фрагмент, вы можете выполнить' git stash -p'. См. [Здесь] (http://stackoverflow.com/a/5506483/912144) – Shahbaz

+1

* последний * не совсем подходящее слово, здесь; он оставляет место для неправильной интерпретации. Вместо этого вы должны правильно: * версия, записанная текущим фиксатором * (то есть тот, который указывает «HEAD»). – Jubobs

1

git stash сохраняет ваши изменения в «stash» - который выглядит как стек временных коммитов. Видно с git stash list.
С git stash можно занести определенный файл и даже кусок кода. Попробуйте git stash save -p. Он будет интерактивно спрашивать вас, что вы хотите сохранить.
Другим способом является добавление всего, но один файл для индексации с git add. Затем запустите git stash save -k. Он фиксирует измененный файл (красный в git status) без файлов, готовых к фиксации (зеленый в git status).

2

git stash работает в два этапа:

  1. Сохраняет рабочий каталог и индекс в безопасное место, и
  2. Восстанавливает рабочий каталог и индекс самой последней фиксации. Затем вы можете работать в других филиалах, совершать коммиты и т. Д., И когда вы будете готовы вернуться туда, где находитесь, вы вводите git stash pop, и вы вернулись, работая на полной скорости.

Попадание вашего тайника удаляет изменения с вашего приклада и возвращает их в вашу рабочую копию.

В качестве альтернативы вы можете повторно применить изменения к своей рабочей копии и сохранить их в своем кошельке с помощью git stash apply.

git checkout -- file отбрасывает изменения в этом файле в рабочем каталоге и проверяет версию этого файла, записанную текущим фиксатором (то есть тот, на который указывает HEAD).

Смежные вопросы