Git: Как мне узнать, является ли мой открытый файл главным или в ветке - PullRequest
1 голос
/ 08 мая 2020

Допустим, у меня есть локальное репо с файлом. sql. В настоящее время на моем ноутбуке открыт файл. sql.

Теперь я создаю новую ветку. Файл. sql все еще открыт на моем ноутбуке.

Если я внесу изменения в файл. sql, как я узнаю, будут ли они сохранены в основной ветке или в новой?

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Хотя ответ написан @torek довольно подробно. Но чтобы ответить вам быстро, я бы сказал, что это зависит от условий. Давайте посмотрим на них.

  1. Вы находитесь в ветке develop и .sql файл открыт, вы не не вносили никаких изменений в .sql файл или любой файл под git invigilation, и вы создали другую ветку из develop.

    Ну, в этом случае вы переключитесь на новую ветку, и все новые коммиты будут go в вашей новой ветке .

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

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

ПРИМЕЧАНИЕ: Мое объяснение сделано для того, чтобы вы поняли вещи в условиях непрофессионала. Git работает немного по-другому, если вы погрузитесь в него глубоко. :)

1 голос
/ 08 мая 2020

Файлы, в очень важном техническом смысле, не находятся в какой-либо ветке, в Git. Другими словами, вы задаете неправильный вопрос. Вы должны спросить: Какие коммиты, если они есть, содержат этот файл? Затем вы можете уточнить вопрос до , который содержит именно эту версию этого файла или которые коммиты изменили этот файл по сравнению с их родительским коммитом и т. д.

(я подозреваю, что один из этих ответов прямо сейчас таков: no commit содержит этот файл, или эту версию этого файла, но вы не дали нам достаточно go здесь, чтобы я был уверен.)

Git работает немного хитроумно:

  • Git хранилища репозиториев фиксирует , а не файлы. Конечно, каждая фиксация хранит несколько файлов, поэтому можно с уверенностью сказать, что Git хранит файлы, верно? Ну, вроде как, но это приведет вас по садовой дорожке . Попробуйте представить коммиты как некую единицу. Это единица памяти, с которой вы будете работать, когда будете работать с Git.

  • Само слово ветка сложно: см. Что именно мы подразумеваем под «ветвью»?

  • Конечным результатом всего этого является то, что дана ветка имя как master , мы должны сначала найти один конкретный c commit . Затем мы можем решить, находится ли какая-либо версия какого-либо файла в этой c фиксации или нет.

  • В любом случае файлы, которые находятся внутри коммитов, полностью, полностью, 100% только для чтения. Они хранятся в специальном формате, который понимает только Git, и они дедуплицируются, потому что каждая фиксация хранит полную копию каждого файла! Дедупликация делает это нормально.

Когда вы активно работаете с репозиторием, вы начинаете с выполнения:

git checkout master

или git checkout другого имени ветки. 1 Эта операция проверки копирует файлы только замороженного формата Git из некоторой фиксации, расширяя их в обычные повседневные файлы.

Эти обычные повседневные файлы go в рабочая зона где вы можете поработать над ними. Git называет эту рабочую область вашим рабочим деревом или рабочим деревом . 2 Файлы, которые вы можете просматривать и с которыми / работать, находятся в этом рабочем дереве . Рабочее дерево не является частью репозитория! Здесь хранятся только изменения.

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

Git делает новые коммиты не из файлов, которые находятся в вашем рабочем дереве, а скорее из файлов, которые хранятся в Git index . Индекс немного сложен, и я не буду здесь go вдаваться в детали, за исключением того, что git checkout заполняет оба Git индекс и ваше рабочее дерево из выбранного вами коммита. Это не мешает работе файлов дерева работы, о которых Git ничего не знает. Опять же, таких файлов нет в Git. Они просто существуют в вашем рабочем дереве.

Если файл равен в репозитории Git, он сохраняется внутри фиксации в специальном замороженном формате Git -only. Выполнение git checkout приведет к извлечению этого файла, в результате чего появятся еще две копии: одна, которую вы не можете увидеть в индексе Git, готова go к следующей фиксации , 3 и тот, который вы можете видеть и работать с ним в вашем рабочем дереве. Когда вы изменили копию своего рабочего дерева, обновленный файл не будет go в новую фиксацию, пока вы не скопируете его обратно в индекс, заменив старую копию индекса: это то, для чего git add.

Git использует фразу неотслеживаемый файл для обозначения файла, который в настоящее время не находится в индексе Git, но находится в вашем рабочем дереве . Команда git status покажет такие файлы, как untracked . 4


1 В Git 2.23 или более поздних версиях вы здесь можно использовать git switch. Он делает то же самое - он просто был отделен от git checkout, поскольку git checkout выполнял как минимум две отдельные команды для разных заданий. В Git 2.23 git switch выполняет одно задание, а git restore - другое, вместо того, чтобы втиснуть оба в git checkout.

2 В Git 2,5 или более поздних версиях , вы можете добавить дополнительные рабочие деревья с помощью git worktree add. Для этого лучше всего иметь Git 2.15 или новее из-за довольно неприятной ошибки, которая не была исправлена ​​до тех пор. (Ошибка проявляется только в том случае, если вы оставите добавленное дерево работы как минимум на две недели, поэтому, если у вас есть старый Git и вы хотите использовать git worktree add для быстрого исправления, это нормально, просто не позволяйте ему сидеть слишком долго.)

3 Технически, то, что находится в индексе, не является буквальной копией файла, а скорее именем файла , режим и внутренний Git ID объекта . Но это проявляется только в том случае, если вы копаетесь в записях индекса, используя внутренние команды Git, такие как git ls-files --stage и git update-index.

4 Чтобы git status заткнулся файлы, вы можете перечислить их в формате .gitignore. Обратите внимание, что перечисление отслеживаемого файла - того, что является в индексе Git - в .gitignore, тем не менее, не имеет никакого эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...