Переместите эти файлы или удалите их перед переключением веток
Можно, конечно, и объяснением через командную строку, но желательно через Git GUI (а иначе зачем создавать gui-клиент, который не может того, что может консоль).
Суть в том, что у разных веток разное количество файлов. И часть из файлов используется 'вручную'. В общем, мне нужно, чтобы при переключении с Ветки1 на Ветку2 удалялись файлы, не используемые Веткой2 и создавались те, что используются ей. Такое возможно?
Да, я мог бы спросить об этом у создателей программы, но здесь есть шанс на более быстрый ответ, да и, как я и сказал, меня устроит и решение через консоль.
а иначе зачем создавать gui-клиент, который не может того, что может консоль - не слышал ни об одном клиенте, который может всё, что может консоль. Всё-таки в консоли вы программу пишете, даже если однострочную. Но делать всё большинству пользователей и не нужно.
3 ответа 3
В общем, мне нужно, чтобы при переключении с Ветки1 на Ветку2 удалялись файлы, не используемые Веткой2 и создавались те, что используются ей.
В целом так и происходит. Давайте для начала разберёмся с терминологией, чтобы точно понимать друг друга.
Ветка - это всего лишь легковесный указатель на коммит. Она реализована просто как файл, а в файле лежит номер (SHA-1) коммита. Переключаясь на другую ветку вы на самом деле переключаетесь на другой коммит.
Файлы и папки не используются веткой или коммитом. Правильнее говорить, что файл (или конкретное состояние файла) принадлежит коммиту или сохранено в коммите.
Коммит внутри себя содержит структуру файлов и папок, которые в нём были сохранены, в том числе содержимое файлов. По своей сути это такая "фотография" рабочей области вашего проекта.
При переключении на другой коммит происходит перестроение всех файлов и папок на то состояние, которое сохранено в том коммите. Давайте представим, что у нас есть две ветки: master и feature и рассмотрим различные ситуации. Здесь буквы - это разные коммиты.
Пусть у нас есть некоторый файл. Обозначим его содержимое в коммитах C, D, E, в рабочей области проекта (working tree, wt ) и результат checkout 'a (или его попытки).
- x - файл удалён
- 1 , 2 , 3 - различные варианты содержимого
Итого, результат checkout для каждого файла можно описать таким псевдокодом:
Я создал тестовую ветвь, внес в нее некоторые изменения, затем вернулся к главной ветке, и все изменения, которые я сделал в тестовой ветке, также находятся в главной ветке. Я не могу переключать ветки перед фиксацией?
2 ответа
Перед фиксацией ваши изменения находятся на диске («рабочая копия») или после git add «промежуточной области». Ни один из них не принадлежит к определенной ветви. Когда вы переключаете ветки, незафиксированные изменения сохраняются. Если изменение ветки приведет к перезаписи незафиксированных изменений, Git не позволит вам переключиться.
Когда у вас есть работа и вы хотите переключить ветки, вы должны поместить ее в тайник, используя git stash . См. Раздел Хранение и очистка в Pro Git.
В качестве альтернативы вы можете зафиксировать незавершенную работу, а затем использовать git commit --amend для добавления в фиксацию. См. историю перезаписи в Pro Git.
Я не могу переключать ветки перед фиксацией?
Вы можете [1]; и если вы это сделаете, незафиксированные изменения придут с вами. Возможно, это не то, чего вы ожидали, но часто бывает очень полезно. Помимо полезности, это действительно единственное разумное поведение по умолчанию для git. Ваши изменения находятся в рабочем дереве и, возможно, в индексе на этом этапе, но по умолчанию у вас есть только один из них (а не один на ветку); поэтому переключение ветвей без внесения изменений будет означать отмену изменений.
Если вы хотите переключать ветки без внесения локальных изменений с собой, у вас есть несколько вариантов.
1 - Вы можете спрятать свои изменения. Затем, после того как вы закончите просматривать другую ветку, вы можете вернуться к ветке, где есть изменения, и распаковать изменения.
2 - Вы можете создать временную ветку для ваших изменений. Обычно (т.е. если ваши изменения не включают удаление файлов) вы можете использовать форму checkout , чтобы вернуть изменения позже.
Если у вас есть удаления, вы все равно можете заставить его работать, но вместо того, чтобы обойти это, вероятно, имеет смысл использовать один из других методов, которые я перечислил, по крайней мере, в этих случаях.
3 - Вы можете продолжить и зафиксировать свои изменения. Пока вы не отправляете их в общий репозиторий, отменить фиксацию в любом случае легко.
5 - Вы можете отменить свои изменения. Это может редко быть тем вариантом, который вам нужен, но его достаточно легко сделать, если вы этого хотите.
[1] - Ну, иногда можно - например, в описанном вами случае. Если ваши изменения будут перезаписаны попыткой переключения ветвей, тогда git не позволит вам просто переключать ветки, потому что вы потеряете данные.
однако, когда я пытаюсь изменить ветви, я получаю следующее:
это то, что моя .файл пример выглядит так:
как мне заставить это работать, чтобы я мог переключать ветви без удаления этих файлов?
если я внесу изменения, это повлияет на эти файлы? Другими словами, если я потом вернусь в эту ветвь, все будет идеально, как до моего последнего обязательства?
Я не хочу потерять эти файлы, я просто не хочу, чтобы их отслеживать.
похоже, вы хотите, чтобы файлы игнорируются, но они уже были совершены. .gitignore не влияет на файлы, которые уже находятся в репо, поэтому их нужно удалить с помощью git rm --cached . The --cached предотвратит его какое-либо влияние на вашу рабочую копию, и он будет просто помечен как удален при следующей фиксации. После файлы удаляются из репозитория тогда .gitignore предотвратит их добавление снова.
но есть еще одна проблема с вашим .гитюдного, вы чрезмерно используете подстановочные знаки, и это заставляет его соответствовать меньше, чем вы ожидаете. Вместо этого давайте изменим .gitignore и попробуйте это.
git 2.11 и новее
старый git
-x означает, что игнорируемые файлы также удалены, а также файлы, неизвестные git.
-d означает удаление неотслеживаемых каталогов в дополнение к неотслеживаемым файлам.
-f требуется, чтобы заставить его работать.
предупреждение: это приведет к удалению локальных файлов, которые не индексируются
просто заставить его : git checkout -f another-branch
Если вы находитесь в OS X, это может быть потому, что имя файла имеет определенные символы изменить регистр. Попробуйте установить следующий параметр конфигурации:
Git говорит вам, что он хочет создавать файлы (с именем public/system/images/9/. etc), но у вас уже есть существующие файлы в этом каталоге, которые не отслеживается Git. Возможно, кто-то еще добавил Эти файлы в репозиторий Git, и это первый раз, когда вы перешли к этой ветке?
вероятно, есть причина, почему эти файлы в вашем develop ветвь, но не в вашей текущей ветви. Возможно, вам придется спросить своих сотрудников, почему это так.
как мне заставить это работать, чтобы я мог переключать ветви без удаления этих файлов?
вы не можете сделать это, не заставляя файлы исчезнуть каким-то образом. Вы можете переименовать public to my_public или что-то.
если я вернусь в эту ветку после этого, все будет идеально, как до моего последнего обязательства?
если вы зафиксируете свои изменения, Git не потеряет их. Если вы не совершите изменения, то Git будет очень стараться не переписать работу, которую вы сделали. Это то, о чем Git предупреждает Вас в первом случае здесь (когда вы пытались переключить ветви).
существует команда для этой деликатной задачи (постоянное удаление неотслеженных файлов)
затем git pull будет делать.
к сожалению, ни git rm --cached или git clean -d -fx "" сделал это для меня.
мое решение закончилось тем, что моя ветка была удалена, клонирование нового РЕПО, а затем слияние в новом РЕПО. Другие люди, получившие доступ к РЕПО, должны были сделать то же самое.
мораль истории: используйте .gitignore файл от начала.
для тех, кто нуждается в чем-то менее далеко идущем, чем ответ Скотта Шафера,
будет, вероятно, работать. Я!--9-->очень предлагаем
первый. Эта команда выведет список файлов, которые git удалит, если вы запустите git clean -f , и может спасти вас от боли непреднамеренного удаления чего-то, что вы не хотели.
посмотреть этот стек Oveflow ответ или документы дополнительные информация о git clean .
у меня была такая же проблема при проверке ветви на основе более ранней фиксации. Git отказался от проверки из-за неотслеженных файлов.
я нашел решение, и я надеюсь, что это поможет вам тоже.
добавление затронутых каталогов в .gitignore и выдачи $ git rm -r --cached на них явно недостаточно.
Предположим, вы хотите сделать ветвь на основе более ранней фиксации K, чтобы проверить некоторые вещи и вернуться к текущей версии. Я бы сделал это в следующие шаги:
настройка игнорируемых файлов: отредактируйте .gitignore и применить $ git rm -r --cached в файлах и каталогах, которые вы хотите, чтобы git игнорировал. Добавьте также файл до .gitignore и не забудьте вопрос $ git rm -r --cached .gitignore . Это гарантирует, что поведение игнорирования git оставляет то же самое в предыдущих коммитах.
зафиксируйте изменения, которые вы только что сделано:
$ git add -A
$ git commit
сохранить текущий журнал, в противном случае вы можете получить проблемы, возвращаясь к текущей версии
$ git log > ../git.log
жесткий сброс к фиксации k
$ git reset --hard version_k
создайте ветвь на основе фиксации K
$ git branch commit_k_branch
выезд в эту ветку
$ git checkout commit_k_branch
делайте свое дело и совершайте его
проверка обратно в master снова
$ git checkout master
сброс до текущей версии снова
$ git reset current_version или $ git reset ORIG_HEAD
теперь вы можете сбросить жесткий к голове
git reset --hard HEAD
внимание! Не пропустите предпоследний шаг (например, e. г. $ git reset --hard ORIG_HEAD ) в противном случае untracked файлы git жаловался выше будет потерян.
я также убедился, что файлы, на которые жаловался git, не были удалены. Я скопировал их в текстовый файл и выдавал команду $ for i in $(cat ../test.txt); do ls -ahl $i; done
если вы проверяете ветку, упомянутую выше снова, не забудьте оформить $ git status чтобы убедиться, что не появляются нежелательные изменения.
Если вы хотите быстро решить этот вопрос, вы можете использовать эту команду:
Это случилось со мной на Windows 8 system, используя Git из командной строки. Остальная часть моей команды использует TFS, и я использую Microsoft git-tf нажать / потянуть между TFS и моим локальным репозиторием Git.
проблема возникла из-за некоторых файлы, которые были переименованы только для изменения их дела. Случилось, по-видимому, следующее:--10-->
- файлы были проверены со смешанным корпусом в их имена.
- в более поздней фиксации, имена файлов были изменены на все строчные.
- git-tf изначально получил файлы в смешанном случае.
- когда файлы были переименованы в нижний регистр, git-tf не получил файлы, потому что для Windows 8 эти имена файлов эквивалентны.
- поскольку Git чувствителен к регистру, он жаловался, что у меня были смешанные файлы, которые не были в системе управления версиями. Но используя git status , Я не видел никаких изменений, так как в окнах командная строка эти имена файлов эквивалентны.
самым простым решением для меня было:
- git checkout предыдущей версии проекта задолго до того, как эти файлы были добавлены.
- затем git checkout последняя версия проекта, с правильным корпусом файла.
это сработало для меня.
в моем случае, проблема была с подмодулями. master был объединен с другой веткой, которая добавила в проект новый подмодуль. В филиале, который я пытался проверить, его не было, поэтому git жаловался на неотслеженные файлы, и ни одно из других предлагаемых решений не работало для меня. Я подтолкнул кассу к моему новому отделению и потянул мастера.
- git checkout -f my_branch
- git pull origin master
- git submodule update --init
Я также столкнулся с аналогичной проблемой, и я попробовал все решения, опубликованные выше, но это не сработало
проблема была вызвана, когда я переименован мой onMusicUpdateListener.java to OnMusicUpdateListener.java на develop филиала.
теперь master had onMusicUpdateListener.java и develop имел тот же файл, что и OnMusicUpdateListener.java
теперь, когда я переключился на master, он дал мне ошибку
и потом aborted .
чтобы решить эту проблему, я с силой checked out master ветку а потом переименовал мой onMusicUpdateListener.java to OnMusicUpdateListener.java , committed и затем merged С develop филиала.
затем я обновил мой develop филиала merging на master и теперь все возвращается к норме, и проблема решена.
эти две функции(git rm --cached, git checkout-f another-branch)не работал для меня.
вместо этого я физически удалил файл (в eclipse), как говорит вам Git;пожалуйста, переместите или удалите их, прежде чем вы сможете переключать ветви.
и затем я добавляю / зафиксировал его.
а потом я потянул, и это сработало!
в моем случае git rm --cached не работает. Но я получил его с git rebase
Это может быть проблема с разрешением,
изменить праве собственности,
2 файлы с тем же именем, но в другом случае может быть проблема.
вы можете удалить один из этих файлов или переименовать его. Ex:
переместить файлы, а не удалить
один из способов избежать удаления файлов-переместить их вместо этого. Например:
Это легко решить, git говорит, что у вас есть те же файлы в обеих ветвях, поэтому вам нужно удалить определенные файлы из главной ветви, а затем вы сможете объединить:
git объединить "вашу ветку"
Я надеюсь, что это работает для вас, я только что решил свою ошибку. моя ошибка была:
ошибка: следующие неотслеженные рабочие файлы дерева будут перезаписаны слиянием: .vs / slnx.базы данных SQLite Пожалуйста, переместите или удалите их перед вами объединить. Аборт
теперь он работает! В моем случае .vs / slnx.sqlite был создан visual studio, мне нужно было закрыть его перед удалением.
в моем случае я видел эту ошибку, потому что я использую популярную CMS с открытым исходным кодом, а каталог, который вызывал проблемы, был каталогом загрузки, в который пишет CMS.
Итак, он говорил, что есть файлы, которых у вас нет, но которые вы не можете получить от управления версиями.
Я хватаю все файлы с живого сайта на свой локальный, затем я проверю это в РЕПО в надежде, что это исправит проблему.
удалить .gitignore С appname/gen/ чтобы решить эту проблему.
Я просто пошел в файловую систему и удалил файл напрямую, затем продолжил с git checkout, и это сработало.
У меня была проблема несколько раз, и это может быть связано с разработчиками, делающими удаление, push, re-add, push или что-то подобное.
просто удалите файлы или переименуйте их.
мне пришлось переименовать/удалить ajax / продукт.в PHP и ajax / produtPrice.в PHP.
Не волнуйтесь, git pull вернет их. Я предлагаю вам переименовать их вместо удаления, потому что вы можете потерять некоторые изменения.
Если это не помогает, то вам нужно удалить всю ветку и создать ее снова, а затем сделать git pull origin remotebranch
Допустим есть master, где есть какие-то незакоммиченные файлы.
Создаю новую ветку new_branch, переключаюсь на неё, делаю в ней какие-то изменения.
Переключаюсь обратно на master и вижу те же самые изменения в master
Что-то не пойму, так и должно быть?
Ветка master должна видеть только свои изменения, насколько я понял.
2 ответа 2
В тот момент, когда Вы переключаетесь на другую ветку, но не закоммитились (вообще то это очень плохая практика, так не нужно делать), то будет слития (merge) изменений. Соотвественно, когда ещё и в новой ветке сделаете изменения и снова переключитесь, то теперь суммарные изменения будут в master.
Хорошая практика говорит, что перед тем, как переключиться на другую ветку, нужно закомитить изменения, спрятать или удалить.
Кстати, спрятать изменения - очень хорошая штука. Вначале делаете git stash . git запоминает Ваши изменения в специальном "кармане" и удаляет их из кода. Потом можно переключиться на другую ветку, поработать, закомитить и вернуться в назад. И теперь нужно достать изменения с кармана с помощью git stash pop . Карман работает как стек и туда можно вложить много изменений.
Похоже, что на тот момент, когда вы переключились обратно на master , вы ещё не сделали ни одного коммита в new_branch . Для Git'a обе ветки совершенно одинаковы, они указывают на один и тот же коммит. При переключении веток не может произойти конфликт, потому что вообще нечего переключать. Поэтому все ваши изменения остаются нетронутыми.
Вот этот пример можно скопировать целиком в консоль и посмотреть на результаты.
А вот если бы вы сделали из них коммит, тогда ветки бы разошлись и указывали на разные коммиты. Тогда при переключении на master в рабочей области было бы содержимое последнего коммита master .
Почти то же самое, но теперь мы сделаем коммит в новой ветке.
Точно также вы можете сначала внести изменения, а потом создать ветку, переключиться на нее и сохранить эти изменения. Например, вы что-то изменили с момента последнего коммита, хотите оставить это как альтернативный путь решения и начать заново. Аналогичный пример:
Запутался немного в коммитах. Сейчас мне надо смержить одну ветку в другую. checkout - работает нормально, но при попытке мержа выдает ошибку "The following untracked working tree files would be overwritten by merge". Изменений в каталоге status не находит. Что за фигня такая и как это лечить?
Это значит, что в текущем рабочем дереве есть неотслеживаемые файлы, которые будут затёрты при merge и Git не позволяет вам потерять возможно важные файлы.
Нужно либо их удалить, либо закоммитить, либо сделать stash, либо занести в .gitignore.
Но у меня нету там никаких не отслеживаемых файлов! Еще раз говорю git status - никаких изменений или не отслеживаемых файлов не видит.
Victor: git status: "На ветке list нечего коммитить, нет изменений в рабочем каталоге." git merge: "error: The following untracked working tree files would be overwritten by merge: clib.layout Please move or remove them before you can mege. Aborting"
DarkByte2015: Вот он ругается на файл clib.layout. Странно, что status его не отображает.
Вы там его без лишних аргументов вызываете? Типа "git status --untracked-files=no", что скрывает неотслеживаемые файлы.
Victor: я даже не знал что у git status есть аргументы. :D Просто в другой ветке с которую я мержу я некоторые файлы которые тут тоже есть убрал из гитигнора. Просто когда проект в code blocks создавал добавил файлы проекта в игнор, а потом когда переключаться между ветками стал - понял что это была ошибка и в другой ветке удалил их оттуда, а теперь пытаюсь смержить и никак. :(
DarkByte2015: Попробуйте перенести clib.layout за пределы проекта, увидит ли это status? И попробуйте merge.
Читайте также: