GIT Branches - редактирование файлов - PullRequest
0 голосов
/ 17 мая 2018

Вот мой вопрос. Скажем, у меня есть репозиторий с файлом app.js в главной ветке. Затем я делаю новую ветку и проверяю эту ветку. Есть ли способ отредактировать и сохранить изменения в «app.js» в новой ветке, затем переключиться обратно на мастер и получить исходный файл, который я могу открыть обратно в редакторе? Если я открываю файл в своем текстовом редакторе, он просто сохраняет его в папке, где он у меня есть, независимо от того, в какой ветке я нахожусь. Извините, если это нубский вопрос, и спасибо за поддержку!

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

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

Фон

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

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

Поэтому, когда вы запускаете git checkout для переключения ветвей, git, вероятно, должен выдать предупреждение и отказать в извлечении - и в некоторых случаях, когда в противном случае данные могут быть потеряны, это произойдет. Но в случае, если файл одинаков при последних фиксациях в обеих ветвях, он будет сохранять изменения в рабочем дереве и / или индексе при переключении ветвей. (В командной строке он, по крайней мере, дает небольшую обратную связь, чтобы сообщить вам, что это произошло.

$ git checkout master
M       file1
Switched to branch 'master'

говорит, что незафиксированные изменения были перенесены в file1.)

* Решения 1022 *

Commit

Первое решение, которое вы могли увидеть в комментариях, это зафиксировать ваши изменения. Если изменения готовы к фиксации, это хорошее решение. Даже если они не готовы стать частью постоянного коммита, если вы не push коммит, вы всегда можете отредактировать его из истории позже - например, выполнив следующий коммит с опцией --amend.

Stash

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

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

git checkout branch
# edit some stuff
git add .
# edit more stuff
git stash
# NOTE: at this point it will look like your changes have simply been
# reverted; but they haven't.
git checkout master
# now you have the `master` versions of all files
# ... do stuff ...
git checkout branch
git stash pop
# branch version of file is back

Несколько рабочих деревьев

stash неплохо, но не всегда идеально.

Может быть, вы хотите, чтобы незафиксированные изменения в нескольких ветвях одновременно. Это может быть сделано с помощью тайников, но тогда вы должны держать вещи прямыми - например, какой тайник принадлежит какой ветке. (git может немного помочь в этом, но все еще легко испортить.) Итак, еще одно решение, которое стоит рассмотреть:

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

git worktree add /path/for/additional/worktree branch

См. git worktree документы.

Теперь у вас есть обе версии файла, одновременно доступные по разным путям в вашей файловой системе, так что любой инструмент может «видеть» и работать с любым из них или с обоими.

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

0 голосов
/ 17 мая 2018

Git, внутренне, может иметь произвольное количество различных файлов с именами app.js и может различать их по коммит-хэшу или другому спецификатору фиксации, например HEAD или имени ветки:

git show HEAD:app.js
git show a9fc302:app.js
git show master:app.js

и так далее.Может ли ваш редактор сделать это, и если да, то как, вопрос о вашем редакторе.

Все остальное не является непосредственно частью ответа, но важно понять

Обратите внимание, что ваш редактор работает с обычными файлами, хранящимися в обычной системе хранения файлов вашего компьютера, в вашем рабочем дереве , где Git позволяет вам выполнять вашу работу.При работе с Git вы должны иметь в виду, что Git в основном касается commitits , которые (в основном) являются постоянными, (полностью) доступными только для чтения, снимками каждого файла взаявите, что файл имел когда вы его зафиксировали.Но файлы, которые фиксирует Git, не обязательно являются файлами рабочего дерева!

Git хранит файлы Git в специальном сжатом формате.После того как файлы зафиксированы, они доступны только для чтения и существуют до тех пор, пока существует сама фиксация, но, поскольку они находятся в специальном формате Git, только Git может получить к ним доступ напрямую.git checkout делает, когда вы извлекаете некоторую фиксацию (через имя какой-либо ветви, например, git checkout <em>branch</em>), извлекает эти файлы только для чтения:

  • Сначала Git копирует их в Git's index .Индекс также называется промежуточной областью или иногда кеш .В индексе файлы по-прежнему имеют специальную форму Git-only, но теперь они могут быть перезаписаны .

  • Тогда - ну, действительно, в то же времякак копирование в индекс, потому что это более эффективно - Git извлекает версию index каждого файла в ваше рабочее дерево, распаковывая специальную форму Git-only в форму, которая используется остальной частью вашей компьютерной системы.может работать с

Так что work-tree копий файлов, с которыми вы работаете, на самом деле вообще не являются файлами Git.Когда вы запускаете git add <em>file</em>, вы говорите Git скопировать версию рабочего дерева file в индекс Git.В это время Git сжимает файл до специального формата Git-only и перезаписывает текущую индексную версию этого файла новой заменой.

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

Эторазница между изменением, не подготовленным для фиксации , и изменением, подготовленным для фиксации: выполняется git status имеет Git сравнивает текущий коммит с индексом , и все остальное подготовлено для фиксации , потому что вы скопировали его в индекс.Затем git status заставил Git сравнить index с рабочим деревом : , что бы ни отличалось, не подготовлено для фиксации , потому что вы еще не скопировали его виндекс.

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


1 Могут быть некоторые, которые могут, но если это так, они, вероятно, делают это путем извлечения индексного файла в обычный файл, а затем используют git add, чтобы вернуть его в индекс. Внутренний формат индекса может изменяться в каждой новой версии Git, поэтому неразумно слишком сильно от него зависеть.

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