2014-09-25 3 views
3

Возможно, я передумал это, но может ли кто-нибудь уточнить следующее утверждение?Как пересогласовать и слить «состояние» в Git?

парадоксально, rebases и слияния являются отслеживанием состояния, и мерзавец может уступить управления обратно к вам до того, как слияние/перебазироваться закончена.

После краткого обзора state, я считаю, что это имеет отношение к rebases и сливается, состоящий из серийных (последовательных) шагов, где каждый шаг является атомарным изменения и, таким образом, он может быть произведен откат. Это верно? Может ли кто-нибудь объяснить это лучше, и почему это противоречиво? Если rebase и merge не были бы сдержанными, были бы они необратимыми?

И, наконец, есть перестановка и слияние только в Git?

+3

«и git может уступить вам контроль» --- Я уверен, что он неявно упоминает конфликты слияния, которые необходимо разрешить вручную. Таким образом, они являются сдержанными, потому что не каждый слияние/переустановка может выполняться таким же образом <---- просто предположение. – zerkms

ответ

2

Как original poor explainer commenter, я могу уточнить, что я имел в виду.

В отличие от многих команд Git (например, проверки), которые обновляют ваш репо/индекс/WorkDir, а затем возвращают управление обратно к вам, возможно, для мерзавец, чтобы выйти из в серединеmerge или rebase и дать контроль назад к пользователю. Это особенно важно, потому что это дает вам возможность разрешить конфликты слияния, прежде чем продолжить слияние или переустановку.

git merge --abort 
git rebase --continue | --skip | --abort | --edit-todo 

Если merge терпит неудачу, мерзавец покажет вам это сообщение:

Автоматическое слияние не удалось; исправить конфликты и затем зафиксировать результат.

И во время rebase, мерзавец покажет вам это сообщение:

Не удалось объединить изменения.

Patch потерпел неудачу в (шаг)

Когда вы решили эту проблему запустить "мерзавца перебазироваться --continue". Если вы предпочли бы пропустить этот патч, вместо этого запустите «git rebase -skip». Чтобы восстановить исходную ветвь и остановить перезагрузку «git rebase --abort».

В любом случае работает git status перечислю некоторые файлы как

# Unmerged paths: 
# (use "git add/rm ..." as appropriate to mark resolution) 
# 
# both modified:  YOURFILE 
# 

Он никогда особо не противоречит здравому смыслу, , если вы ожидаете мерзавец либо удастся полностью или не сразу перед возвратом управления к вам. Вы также можете столкнуться с проблемами, если вы оставите каталог в середине слияния или переустановки, забудьте об этом и вернетесь к нему позже, ожидая, что он будет работать как обычно. Один полезный метод - add your branch name and merge state onto your shell prompt, который я нашел полезным, чтобы помнить, в каком состоянии работает мой рабочий каталог в любой момент времени.

1

Довольно просто, как только вы начинаете слияние или переустановку, оно «в процессе». Это еще не закончено, и вам нужно либо откат, либо фиксацию. Вы не можете выполнять другие основные команды git (например, коммиты).

+0

Ну, rebase (особенно интерактивная rebase) намеренно останавливается и позволяет вам совершать. Но, как правило, когда вы находитесь в середине переустановки или слияния, и имея дело с конфликтами, вы не хотите начинать что-то еще большое, да. – torek

4

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

Чтобы увидеть его для типа слияния git merge --no-commit <some branch>, а затем ls -l .git, и вы увидите файлы MERGE_HEAD, MERGE_MODE и MERGE_MSG. Когда происходит слияние, эти файлы удаляются.

Для переустановки просто сделайте что-нибудь вроде git rebase -i HEAD~1 и измените любую строку с "pick" на "edit". Когда git возвращает вам управление ls -l .git, вы увидите, что существует каталог .git/rebase-merge, созданный с целым рядом файлов, включая список действий по восстановлению, которые еще предстоит выполнить. git rebase --abort (или когда сводка заканчивается сама по себе), и эти файлы удаляются.

Я понятия не имею, почему человек, который сказал, что думает, что любая из этих операций имеет состояние, противоречила интуиции. Если вы chunking совершает один за другим через rebase, вы должны иметь список «todo», который хранится где-то. И если вы сливаетесь, вы должны знать, что объединено в SHA, поэтому вы делаете на него в дополнение к HEAD.

+0

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