2016-06-14 5 views
2

я пошел через чтение кучу вещей на SO и в документации Git, и заметил что-то, после того, как Мессинг вокруг, что я не совсем понимаю:Git не перебазироваться нет версии аргумент против один аргумент версии

Скажем, я имеют следующее состояние и конфигурацию после выборки, этап 2 в мерзавца тяги, и принудительное обновление произошло на происхождения/мастера:

$ git log -2 --oneline 
a589c89 foo2 
e0e5946 foo 

$ git log -2 --oneline origin/master 
e0e5946 foo 

$ git config branch.master.remote 
origin 

$ git config branch.master.rebase 
true 

$ git config branch.master.merge 
refs/heads/master 

Док говорит (https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html)

If <branch> is specified, git rebase will perform an automatic git 
checkout <branch> before doing anything else. Otherwise it remains on 
the current branch. 

If <upstream> is not specified, the upstream configured in 
branch.<name>.remote and branch.<name>.merge options will be used 

Когда я указываю единственный вариант аргумент мерзавца перебазироваться это происходит:

$ git rebase origin/master 
Pruned remote csv test branches 
Successfully rebased and updated refs/heads/master. 

$ git log -2 --oneline 
a589c89 foo2 
e0e5946 foo 

Круто, foo2 до сих пор существует в моем местном отделении, как и ожидалось. Теперь, делая это, это должно быть одно и то же (неявно), потому что согласно документам, branch.master.remote и branch.master.merge разрешаются как начало/мастер, как показано выше, если я не интерпретирую ошибки:

$ git rebase 
Pruned remote csv test branches 
Successfully rebased and updated refs/heads/master. 

$ git log -2 --oneline 
e0e5946 foo 

За исключением foo2 теряется, и мы должны сделать git reset --hard [email protected]{2} для восстановления. На самом деле этого не ожидал. Любая идея, почему у меня другое поведение здесь? И как я могу предотвратить предотвращение потери foo2 в процессе без переключение branch.master.rebase на false? Я собираюсь сделать попытку сделать перестановку.

ответ

1

Разница зависит от конкретной версии Git.

В настоящее время (Git версии выше 2.something, я не уверен, экспромтом, что-то есть), самая большая разница в том, что три-аргументе версия отключает--fork-point по умолчанию, в то время как два-аргумента версия позволяет по умолчанию использовать.

git pull Вводя в смеси делает вещи еще сложнее, потому что git pull где --fork-point возникла, и более старые версии Git ведут себя гораздо более по-другому, чем новые. В частности, до --fork-point был свой собственный отдельный вариант, толькоgit pull сделал fork-point стиль rebasing. Я сомневаюсь, что это проблема в вашей конкретной версии Git, так как тогда вы не увидите разницы с git rebase origin/master vs git rebase (с конфигурациями branch.master.*, поставляющими <upstream>). По крайней мере, я думаю, что ты этого не сделаешь.

(. Для полноты, вы можете захотеть, чтобы показать выход git config --get-all remote.origin.fetch, хотя я ожидал, что это будет стандартная одна строка +refs/heads/*:refs/remotes/origin/*)

Дальнейшее чтение на --fork-point: the git rebase documentation и the git merge-base documentation section on --fork-point.

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

  • Нет связанных вопросов^_^