В чем разница между git-stash и git-checkout?

Я пытаюсь перейти от одного ветки к другому. Git говорит мне, что я не могу этого сделать, потому что мои local changes to the following files would be overwritten by 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
</message></stash></branchname></stash></stash></stash></options>

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

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

4 ответа

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

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


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

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

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

Кроме того, вы можете повторно применить изменения к своей рабочей копии и сохранить их в своем приложении с приложением git stash apply.

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


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


Если вы не изменяете изменения, когда вам нужно изменить ветку, вы можете использовать команду git stash для сохранения изменений в стек незавершенных изменений. Если вам нужно отложить только выбранную часть выполненных работ, вы можете использовать git stash -p. Для повторного использования сохраненных изменений используйте команду git stash pop.

В команде git checkout если вы даете команду в качестве git checkout ваше рабочее дерево будет направлено на текущую HEAD. git checkout branchname Когда вы git checkout branchname из ветки, и если есть неоправданные изменения, эти изменения добавляются в новую ветку проверки с измененными изменениями. git checkout filepath когда вы используете checkout с пути к файлу, будут потеряны незавершенные изменения файла.

Ссылка - https://git-scm.com/docs/git-checkout

https://git-scm.com/book/en/v1/Git-Tools-Stashing

licensed under cc by-sa 3.0 with attribution.