2013-05-31 4 views
13

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

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

+3

я догадываюсь 'мерзавец сбросить --hard' назад, прежде чем тянуть и повторить тянуть путь. – Alex

+0

Спасибо. Не могли бы вы разместить это как ответ, а не комментарий? –

ответ

3

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

14

Короткий ответ (уже дано @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 

В этом случае не было никакого слияния коммит, просто быстро вперед, поэтому никаких проблем, нет никаких изменений, пересчитать динамические! Если вы делаете 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 (I будете использовать очень короткое имя, origin, чтобы назвать это):

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

Теперь граф-у журнала показывает одну строку:

$ 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, и он жалуется, что слияние не выполняется. :-)

0

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

$ git config branch.autosetuprebase always 

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

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

+0

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

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