2016-09-07 2 views
3

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

git log дает мне совершенно согласованный список коммитов, которые я ожидаю увидеть. И если я использую git reset --hard HEAD^, чтобы двигаться назад в фиксации по одному, все работает так, как ожидалось, - до тех пор, пока я не вернусь к десятку коммитов без предупреждения.

Я начинаю с this commit с ID 367df61041c380b3e769177779cb7c8ab21630b4 и журнал мерзавца, который выглядит как:

367df61 fixing flake8/syntax errors 
14210b8 Merge remote-tracking branch 'origin/dev' into dev 
a6818d5 Merge pull request #55 from rec/fast-gamma 
e8ffdf2 Tweak exit manager code (fix #56). Please enter the commit message for your changes. Lines starting 
d1c464c Tweak masterBrightness. 
975de68 Re-enable timedata end-to-end. 
bf7e918 Add optional timedata.Renderer to driver_base.py. 
b4daff6 Simplify _render slightly. 
a306798 Stop slicing colors and add an offset instead. 
b379f21 Move generate_header into util. 
e50ec8c Simplify frame rendering slightly. 
12cfc2d Extract data and functions into return_codes.py 
764e4b9 Convert LDP8806.py from DOS line endings to Unix. 
d3dc333 Remove old gamma tables. 
5ae2934 Simplify gamma.py; prove backward compatibility. 
bae1cf4 Temporarily disable timedata and simplify rendering. 
c436f19 showing timedata usage 
5228261 updating colors.py for py3 

Если я исполняю git reset --hard HEAD^ один раз, я перехожу к 14210b8 Merge remote-tracking branch 'origin/dev' into dev, как я ожидал, и git log согласуется с выше.

Но теперь, если я исполню git reset --hard HEAD^ в второй время, я перехожу к c436f19 showing timedata usage, в нижней части приведенного выше списка! Все фиксации между a6818d5 и bae1cf4 включительно просто исчезнут.

Мой подозрительный глаз нарисован на фиксации a6818d5a2, который, как представляется, содержит все эти исчезнувшие изменения.

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

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

  1. Что происходит? Является ли это разумным состоянием для филиала, и я делаю ошибку с помощью git или что-то «сломано»?

  2. Если он сломан, как его исправить? И как мы можем изменить наш рабочий процесс, чтобы избежать разрыва ветки?

  3. Если он не сломан, как мы можем изменить рабочий процесс git для обработки этого случая?

Мой ответ на 3. - запретить слияние.

Все они сводятся к одному вопросу - учитывая, что у меня есть эти слияния, как мне переустанавливать их?

+0

@matt: суффикс hat/caret означает, в первую очередь, родитель * first *, если вы не добавите номер. 'HEAD ^' и 'HEAD^1' являются родителями # 1, а' HEAD^2' является родительским # 2. Если у вас есть слияние осьминога (более двух родителей), это продолжается с 'HEAD^3' и т. Д. Фактический порядок родительских коммитов трудно наблюдать с помощью большинства инструментов (хотя некоторые графические зрители используют цвета линий: один и тот же цвет при прохождении слияния означает «родительский №1»), но указан: первый родитель - это филиал, который вы были «включены» (как, например, «git status» говорит «на ветке»), когда вы сделали слияние. – torek

ответ

0

Что происходит? Является ли это разумным состоянием для филиала, и я делаю ошибку с помощью git или что-то «сломано»?

Помните, что git log показывает линейный список коммитов по умолчанию. Это может быть немного запутанным в случае слияний, потому что слияние имеет более одного родителя. Вы можете использовать git log --oneline --graph, чтобы увидеть график фиксации. Он будет включать дополнительную визуализацию, чтобы помочь вам увидеть всех родителей каждого коммита.

Если он не сломан, как мы можем изменить рабочий процесс git для обработки этого случая?

Я новичок в git, что я не уверен в поведении HEAD^, когда коммит имеет более одного родителя. На самом деле это корень вашей проблемы, когда вы возвращаете обратно историю фиксации. Кроме того, я не знаю о поведении git rebase, когда диапазон фиксации содержит слияния. Вам нужно будет провести некоторое исследование по обоим этим вопросам.

+0

Значит, вы не знаете ответа. Это на самом деле просто (длинный) комментарий. – matt

+0

@matt IMO, это ответ, хотя и неполный. Возможно, мое редактирование делает более понятной, какую часть OP, на которую я пытаюсь ответить. –

+0

'git log --online --graph', по крайней мере, делает его наглядным образом понятным, в чем проблема. –

-1

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

Затем, не используйте git reset --hard, когда текущий HEAD по-прежнему важен. Используйте git checkout <hash>, чтобы перейти туда, где хотите, и пометьте фиксацию там или откройте ветку с git checkout -b <branchname> <hash>. Все эти более безопасные команды предотвратят случайную потерю HEAD.

Я еще не видел, что HEAD^ указывает на нечто иное, чем (первое) родительское совершение. Вы можете найти хорошее объяснение для этих способов навигации here. Но когда вы не совсем уверены, тогда посмотрите, что HEAD^ есть с git log HEAD^.

На всякий случай вы потеряли HEAD, возможно, вы все еще можете найти старые коммиты с git reflog, если сборщик мусора еще не выполнил свою работу.

+0

Что !? Я не потерял своего начальника - я не потерял работу. Все отлично; Я просто пытаюсь отладить, что не так с этой веткой, которая мешает мне перезагрузить его. –

+0

Вы не объяснили, в каком состоянии находится рабочая копия, и вы не ответили на другие вопросы, как выглядит граф слияния. Вы написали, что ваши коммиты исчезли. Я просто хотел помочь. –

+0

Просто потому, что что-то неожиданное происходит, когда я переустанавливаю, не означает, что я действительно теряю работу! Я пытался отладить ветку, которую невозможно было перегрузить. Никто на самом деле не просил увидеть график слияния, но да, проблема в том, что слияние имеет два родителя. По-прежнему не знаю, как переустанавливать их и сохранять их, хотя ... –

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