2016-05-24 1 views
1

я создаю новую веткуGit удалить файл из филиала, держать его в мастер

git checkout -b mybranch 

я удалить файл из него

git rm --cached myfile.txt 

, но я хочу, чтобы держать его в мастер; почему, когда я проверка на мастер

git checkout master 

я получаю «ошибку: Следующие неотслеживаемые рабочие файлы дерева будут переписаны на кассе: file.txt», и если я заставляю кассе

git checkout master -f 

в файл удаляется из файловой системы?

Уверен, что у меня что-то не хватает, но я просто хотел удалить файл из ветки, а не из мастера, хотя кажется, что git хочет объединить ветвь, когда я проверяю мастер.

Причина, по которой я использовал git rm, а не gitignore, заключалась в том, что файл уже был зафиксирован.

ответ

1

Если вы хотите сохранить отслеживание myfile.txt на главном, но удалить из mybranch, вам просто нужно удалить его и зафиксировать удаление.

git checkout -b mybranch 
rm myfile.txt 
git commit -am "delete myfile.txt" 

Теперь, когда вы извлекаете мастера, вы увидите файл вернулся и, когда вы извлекаете mybranch его уже не будет снова.

Предупреждение: если вы объедините mybranch в master, он также будет удален на master.

+0

Спасибо, это работает, но мне нужно добавить «git add -u» перед тем, как совершить или использовать «git rm» вместо rm , Если вы отредактируете свой ответ, я приму его. – Eugenio

+0

@Eugenio спасибо, что поймал это! Я отредактировал свой ответ, чтобы использовать 'git commit -am', который добавит все изменения, включая удаленные файлы. –

0

Завершите изменение на mybranch перед тем, как перейти к мастеру.

1

git покажет файл как невосстановленный, потому что он еще не зафиксирован. Вы должны внести изменения, прежде чем переключаете ветви.

Итак, вы создали ветку и внесли изменения в эту ветку. При попытке вернуться к master мерзавца запретит это, потому что есть изменения, которые еще не были зафиксированы (или явно игнорировали, (что на самом деле то, что untracked средства)

Причина файл восстанавливается, когда вы вынуждаете проверку (git checkout -f master) master происходит потому, что файл находится в master

Если вы хотите сделать это, вы должны сделать следующее

Создать и проверить ветку

git checkout -b somebranch 

Удалить файл с somebranch (--cached фактически удалит файл из индекса, но оставит файл неповрежденным в вашей файловой системе.См git-rm reference docs)

git rm --cached somefile 

Зафиксируйте изменение

git commit -m "Remove somefile" 

Это удалит файл из мерзавца, но не с диска, так что теперь мерзавец у вас есть неотслеживаемые изменения (некое-файл на диске, но не в мерзавец)

Если вы хотите, чтобы другие участники, чтобы иметь возможность оформить сук, связать его с удаленным

git push --set-upstream origin somebranch 

Теперь файл удаляется из origin/somebranch и не master

При добавлении файла в .gitignore он не удаляется из репозитория, если он уже совершил. Изменения в файле, howeve, будут проигнорированы (так же удаляем его). Если вы это сделаете, вам все равно придется удалить файл и зафиксировать его. После этого git больше не будет отслеживать файл при воссоздании (или любом другом действии в файле).

+0

Это именно то, что я сделал, я совершил перед «мастером проверки». Файлы не были восстановлены (это было то, что я ожидал, на самом деле они все еще находились в файловой системе перед проверкой), после проверки они были удалены из файловой системы. – Eugenio

+0

Не использовать --cached. Просто сделайте «git rm somefile», это также удалит файл из вашей файловой системы. Он должен быть восстановлен, когда вы снова проведете мастер – Rik

+0

«git rm somefile» на самом деле будет делать то же самое, что «git rm --cached somefile && rm somefile». Так что только удаление его из индекса (кеш) и его оставление в вашей файловой системе - git, как если бы вы добавили файл на диск, но не git). Надежда очищает что-то до – Rik

Смежные вопросы