Мне нравятся два ответа на этот вопрос в то время, когда я пишу свой - оба ответа axia c и kapsiR * , но я бы сказал так:
git checkout
объединяет слишком много команд в одном интерфейсе. Некоторые из этих команд являются «безопасными», в том случае, если у вас есть незафиксированная работа, они не будут уничтожать ее, а некоторые из них «небезопасны», в том случае, если у вас есть незафиксированная работа и вы сообщаете им уничтожить мою незафиксированную работу , они это сделают.
git switch
реализует «безопасное» подмножество.
git restore
реализует «небезопасное» подмножество.
Пока что нет особой причины отдавать предпочтение ни старой одиночной команде, ни новой паре команд. Но мы добавим еще один элемент:
git checkout <em>name</em>
может выполнить или небезопасный один или безопасный один, в зависимости от что-то, о чем вы, возможно, даже не задумывались!
Теперь, этот последний пункт отмечен в последних Git версиях. Предположим, у вас есть имя для удаленного отслеживания origin/dev
и вы хотите создать ветку dev
соответственно. Обычно вы можете просто выполнить:
git checkout dev
Предположим, однако, что ваша текущая (вероятно, master
) проверка имеет каталог с именем dev
, и в этом каталоге вы проделал кучу работы и еще не совершил ее. Вы только что вспомнили: Я должен зафиксировать всю эту работу, которую я только что выполнил в ветке dev
, а не в ветке master
.
Теперь нет ветки dev
в все, но там есть dev/
файлы . Вот что делает старый Git:
sh-3.2$ git --version
git version 2.20.1
sh-3.2$ git branch -r
origin/dev
(то есть origin/dev
существует; ветка dev
не существует, и я здесь master
)
sh-3.2$ git status --short
M dev/file
sh-3.2$ git diff
diff --git a/dev/file b/dev/file
index e69de29..c238a0b 100644
--- a/dev/file
+++ b/dev/file
@@ -0,0 +1 @@
+look at all this work I did
Добавление этой строки заняло недель кропотливой работы! : -)
sh-3.2$ git checkout dev
Э-э-э. Почему это не говорит мне о создании ветви с именем dev
, настроенной на отслеживание origin/dev
?
sh-3.2$ git status
On branch master
nothing to commit, working tree clean
Гах! Моя тяжелая работа ушла!
Проблема в том, что git checkout
выполнил команду unsafe . Я мог ожидать, что он будет использовать безопасный ... но это не так.
Более современный Git (2.24.0) скажет мне, что git checkout dev
неоднозначно, что хорошо : это не просто забивает мой файл. (Я не проверял сам Git 2.23, где впервые появились команды разбивки на две части.)
В любом случае, используя команды new , вы по крайней мере знаете, верно когда вы вводите команду, получите ли вы безопасный или небезопасный режим. Если ваши привычки установлены, и вы продолжаете использовать git checkout
, или вас беспокоит примечание, в котором говорится, что эти новые команды все еще являются экспериментальными, вы все равно можете использовать старую - и она больше не просто уничтожает работу, в неоднозначный случай.