git rebase после вытягивания

Обычно я использую git pull --rebase если я работаю непосредственно над мастером (который я стараюсь не делать в любом случае). В случае, если я забыл сделать rebase и просто сделал git pull, есть ли способ отменить это и сделать его линейным, а не слияние? Будет ли перебаза на данный момент плохой идеей (если это будет даже что-то делать)?

Я знаю, что могу поменять возможность переустановки по умолчанию по умолчанию, поэтому я не забываю, но это больше проблема понимания того, что делать в этом случае.

Ответ 1

я думаю, git reset --hard назад, прежде чем тянуть и переделать, то тянуть путь

Ответ 2

Короткий ответ (уже заданный @Alex в комментариях): git reset --hard HEAD^, но только в том случае, если есть фиксация слияния (в противном случае вы просто выполняете резервное копирование одной фиксации с вашей быстрой перемотки вперед).

Длинная версия с объяснением:

git pull действительно просто git fetch за которым следует git merge (если вы не переопределяете --rebase, как вы заметили). Поэтому вам просто нужно убедиться, что у вас есть фактическое слияние или нет:

$ git pull
Updating 171ce6f..523bacb
Fast-forward
 mp.py |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
 create mode 100644 mp.py

В этом случае не было комманды слияния, просто перемотка вперед, поэтому нет проблем - изменений в rebase нет! Если вы делаете git log вы увидите недостаток-merge-commit, особенно если вы используете графические элементы ниже.

Пусть сила слияния.

$ git reset --hard HEAD^
HEAD is now at 171ce6f ignore *.log files

[теперь я один за remotes/origin/master ]

$ echo '# pointless comment' >> selfref.py
$ git add selfref.py 
$ git commit -m 'added to force merge'
[master 260e129] added to force merge
 1 files changed, 1 insertions(+), 0 deletions(-)
$ git pull
Merge made by recursive.
 mp.py |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
 create mode 100644 mp.py

Мы видим, что это произошло, даже если приведенный выше текст отсутствует:

$ git log --graph --decorate --abbrev-commit --pretty=oneline
*   c261bad (HEAD, master) Merge branch 'master' of [ssh url]
|\  
| * 523bacb (origin/master, origin/HEAD) add multiprocessing example
* | 260e129 added to force merge
|/  
* 171ce6f ignore *.log files

Мы хотим, чтобы master имени локального ветки указывал на (в данном случае) 260e129 снова. К счастью, это очень легко назвать:

$ git rev-parse HEAD^
260e1297900b903404c32f3706b0e3139c043ce0

(Другим родителем текущего, двух родительского, слияния является HEAD^2) Итак:

$ git reset --hard HEAD^
HEAD is now at 260e129 added to force merge

и теперь мы можем переустановить на remotes/origin/master (я буду использовать очень короткое имя, origin, чтобы назвать это):

$ git rebase origin
First, rewinding head to replay your work on top of it...
Applying: added to force merge

Теперь однострочный журнал graph-y показывает:

$ git log --graph --decorate --abbrev-commit --pretty=oneline
* 4a0b2e2 (HEAD, master) added to force merge
* 523bacb (origin/master, origin/HEAD) add multiprocessing example
* 171ce6f ignore *.log files

Из всего этого вы должны быть в состоянии выяснить, что делать, если вы запускаете git pull и жалуетесь на слияние слияния. :-)

Ответ 3

Я хочу дать вам несколько советов, которые помогут сохранить историю линейной. Установите следующую конфигурацию git, чтобы автоматически отменить ветвь, когда вы делаете pull.

$ git config branch.autosetuprebase always

После применения этого параметра вам не нужно вводить команду full pull с параметром --rebase, просто git pull.

Более подробную информацию вы можете получить в этой статье http://stevenharman.net/git-pull-with-automatic-rebase