Есть ли какой-нибудь способ совершать локально, но игнорировать удаленно?
Нет.
Точнее, не так, как вы думаете.То, что вы можете сделать, становится очевидным, когда вы понимаете, что в некоторой степени Git все равно не заботится о файлах .Git заботится о том, что переносит из репозитория в репозиторий, это commitits .Важной частью этого для алгоритмов Git, которые работают с графом коммитов, являются коммиты и их родительские / дочерние отношения.Файлы просто приходят для поездки.
Предположим, вы начинаете с некоторого набора коммитов в своем хранилище, который вы скопировали из какого-то другого хранилища (так что у другого хранилища также есть эти две ветви):
...--o--o--o <-- master
\
o--o <-- develop
Каждый раунд o
здесь представляет коммит.Вы создаете новую ветку work
, которая указывает на такой же коммит, который develop
указывает на:
...--o--o--o <-- master, origin/master
\
o--o <-- develop, origin/develop, work (HEAD)
(* origin/*
имена - это ваш способ Git вспомнить, что вашGit видел на их Git, так что, пока ваш Git не получил от них ничего нового, ваши origin/*
имена по-прежнему указывают на те же самые коммиты.)
Теперь вы выполняете некоторую работуна новой ветке и коммит.Давайте назовем этот новый коммит A
, чтобы мы могли поговорить об этом (на самом деле он имеет большой уродливый хэш-идентификатор):
...--o--o--o <-- master, origin/master
\
o--o <-- develop, origin/develop
\
A <-- work (HEAD)
Если вы git push
из вашего репозитория Git, единственный новый коммит вы можете предложить им A
.
Фиксация фактического идентификатора A
, большой уродливый хеш, зависит от всего о commit A
: сюда входят все файлы, прикрепленные к commit A
, и тот факт, что коммит, на который указывает ваш develop
, является коммитом A
родителя.
Если вы дадите коммит A
другому Git, вы обязаны предоставлять им каждый файл , который идет с коммитом A
.Если у них нет всех файлов, у них нет коммита A
.
Вы можете сделать новый коммит - давайте назовем это A'
- вот и все как A
, только немного отличается.Давайте сделаем A'
таким, чтобы в нем не было файла.Его родитель такой же, как родительский A
, и у него есть все другие файлы - помните, что каждый коммит представляет собой полный снимок всех файлов, которые A
имеет.Давайте поместим A'
на develop
, сделав это с git checkout develop
, а затем скопировав A
, за исключением того, что мы опускаем один файл:
...--o--o--o <-- master, origin/master
\
o--o <-- origin/develop
|\
| A' <-- develop (HEAD)
\
A <-- work
Теперь вы можете заставить свой Git вызывать другой Gitи предложите это, не A
, а A'
, через ваше имя develop
.Если они решат принять его, ваш Git теперь будет помнить, что их develop
указывает на A'
.
Этот конкретный метод довольно болезненный в использовании.Это не тот путь, если вы можете найти какой-то другой путь.