На каких мерзавцах ты пойман?

Худший, кого я поймал, был с подмодулями git. У меня был субмодуль для проекта на github. Проект был необслуживаемым, и я хотел представить патчи, но не смог, поэтому я разобрался. Теперь подмодуль указывал на исходную библиотеку, и мне нужно было, чтобы он указывал на вилку. Поэтому я удалил старый подмодуль и заменил его подмодулем для нового проекта в том же коммите. Оказывается, это сломало все остальные репозитории. Я до сих пор не уверен, как правильно справиться с этой ситуацией, но в итоге я удалил подмодуль, заставив всех извлекать и обновлять, а затем я создал новый подмодуль и заставил всех снова извлекать и обновлять. Потребовалась лучшая часть дня, чтобы понять это.

Что другие люди сделали, чтобы случайно не испортить git-репозитории неочевидными способами, и как вы решили это?

9 ответов

Решение

Обычная косая черта при добавлении подмодуля:

Когда вы используете git add в подмодуле, убедитесь, что у вас нет косой черты.

> git add local/path
  -- adds the submodule

> git add local/path/
  -- adds all the files in the submodule directly into your repository, big no-no

Это не гоча, это мерзавец.

Публикация в общедоступном репозитории, не осознавая моего git config user.name было неверно.
Это означает, что публичное репо теперь получает имя (и электронное письмо), которое я бы вообще не публиковал. Если этот репозиторий реплицируется,... слишком поздно.

Вот почему я предпочитаю, чтобы мой user.name отображался в моей оболочке git prompt, то есть вместо этого:

 MY_HOSTNAME /c/Prog/myGitProject (master)$

Я вижу это:

 MY_HOSTNAME /c/Prog/myGitProject (master) VonC $

Я знаю, кто я по самой первой команде, которую я набираю в этой сессии Git bash!

  1. Только понимая, что вы забыли запись в .gitignore как только у вас спички распространились по множеству веток.

  2. Забыв, что git add не добавляет того, чего там нет...

    мерзавец добавить.
    мерзавец совершить
    мерзавец статус
    //Привет! почему он не передал мои удаления? Да, глупый я
    git add -u
    git commit --amend
    

  3. Если вы делаете git branch list, вы получите новую ветку под названием list, но если вы делаете git stash, вы получите свое рабочее место спрятанным; для заначки вам нужен list если вы хотите список...

Скоро, наверное...

  1. Работа Работа работа
  2. Копить изменения
  3. Получить последние
  4. Rebase
  5. Получайте конфликты, исправляйте их
  6. Забудьте "git rebase --continue"
  7. Шкатулка поп
  8. Поймите, я забыл "git rebase --continue"
  9. git rebase --abort
  10. Изменения, которые я спрятал изначально - пффффт, пропал.

Работа Работа работа...

git commit

Работа Работа работа...

git commit

Хм... время интегрироваться

git rebase -i origin/master

Какие? Конфликты? Давай начнем сначала

git reset --hard origin/master

Плакать, плакать, плакать...


Git позволяет вам стирать вашу местную историю без угрызений совести. Самая большая проблема в том, что вы - сеть безопасности.

Один из моих самых неловких моментов с git-репозиторием, хотя это больше о sed:

Я когда-то делал find ... -exec sed -i ... операция в подкаталоге моего репозитория. Я бы проверил это без -i во-первых, отвлекся, вернулся и сумел переключиться на верхний каталог в моем репо, прежде чем запустить его. Теперь важные файлы git доступны только для чтения, но sed -i по умолчанию перетаскивает файл, переименовывая, а затем записывает обратно в оригинал, поэтому он отлично работает с файлом только для чтения, таким как объекты git. Замена не была обратимой, и мне пришлось восстанавливать хранилище путем клонирования и извлечения данных от кого-то, кто отслеживал мой как удаленный.

Я даже не думал, что sed будет работать с файлами, доступными только для чтения. Мораль истории: использовать sed -i -c, который копирует файл, затем пытается перезаписать оригинал.

Работа Работа работа. Начните вносить изменения. Обратите внимание, что вы не хотите, чтобы все совершалось. Сделайте частичный коммит тщательно.

В конце концов решите, что это не готово к текущей ветке. Я хочу зафиксировать поэтапные изменения в новой временной ветке. Звучит так тривиально концептуально, верно?

Гугл как это сделать. Топ ответ говорит stash, checkout -b newbranch, stash pop, Делайте это неохотно, задаваясь вопросом, почему нет более легкого пути.

Выясните, что это полностью стерло различие между вашими поэтапными и неустановленными изменениями. Спасибо, Git!

Создайте новую ветку:

git branch new-branch

Работай, комментируй, работай... Пойми, вся моя работа на мастере, а не на новой ветке.

Я должен был сделать:

git checkout -b new-branch

Почему я не могу сделать что-то вроде:

git branch -c new-branch

(с для проверки) с возможностью сделать это поведение по умолчанию???

Другие вопросы по тегам