Лично я избегаю git pull
.Избегая этого, я могу сначала запустить git fetch
, а затем проверить, что поступает. Посмотрев, я затем использую git merge
, но обычно заканчиваю также , избегая, в первую очередь, этой конкретной ошибки, потому что я вижучто слияние может быть трудным и начинать с новой ветки заранее.
Тем не менее, полезно, чтобы иметь возможность восстановить ... и это легко!Просто сделайте это, как вы уже сделали:
git pull
# oh no, merge conflicts!
# resolve conflicts
git commit # or git merge --continue
и зафиксируйте ветку неправильная , а затем исправьте ее:
git branch new-branch-name # create new branch to contain the merge
git reset --hard HEAD^1 # back up current branch to first-parent
git checkout new-branch-name # return to new branch
Схематически выначните с:
o--o--o <-- your-branch (HEAD)
/
...
\
o--o--o <-- origin/your-branch
Завершение слияния продвигается your-branch
, чтобы указать на новый коммит слияния *
, который вы делаете:
o--o--o
/ \
... * <-- your-branch (HEAD)
\ /
o--o--o <-- origin/your-branch
Теперь мы добавляем новая ветка , указывающая на этот же коммит слияния:
o--o--o
/ \
... * <-- your-branch (HEAD), new-branch-name
\ /
o--o--o <-- origin/your-branch
и затем с помощью git reset
перетащите имя ветки, к которой HEAD
присоединен, на один шаг назад, в направлении первого родителя, который восстанавливает его до предыдущего коммита:
o--o--o <-- your-branch (HEAD)
/ \
... * <-- new-branch-name
\ /
o--o--o <-- origin/your-branch
и все готово.
Все это опирается на полезный принцип о Git: Git на самом деле все о совершает .Имена ветвей постоянно перемещаются;они просто как мы находим коммиты. коммиты являются постоянными (ну, пока мы можем их найти) и неизменяемыми.Получайте коммиты так, как вам нравится, и затем вы можете переставлять имена на досуге.
(Если HEAD^1
сложно ввести по разным причинам, учтите, что вы можете использовать любой из HEAD^
или HEAD~
или даже @^
или @~
. То есть:
HEAD
и @
являются синонимами. - *
^1
и ^
без 1, как суффиксы, являются синонимами: 1
подразумевается, если вы его опускаете. ~1
и ~
без 1, как суффиксы, являются синонимами: 1
являетсяподразумевается, если вы его опустите. - Хотя
^
и ~
делают разные вещи, оба означают «вернуться на некоторое количество шагов в графике».
Число после^
является номером родителя и имеет значение только для коммитов слияния: 1
означает первого родителя . Таким образом, HEAD^1
означает первого родителя HEAD
, и HEAD~1
означает вернуться к одному первому родителю . Применение всех правил синонимов дает нам конструкции @^
и @~
.)