2016-07-13 2 views
4

Я пытать разветвление модели, как описано в следующей статье: http://nvie.com/posts/a-successful-git-branching-model/Гит Порядок фиксаций после слияния отделения

  1. Я сделал новую ветку под названием элементы из мастера, сделал несколько фиксаций там
  2. вернулся к мастеру ветви и сделал одну фиксацию
  3. git merge --no-ff элемент ветви затем разрешить любые конфликты слияния

Я предположил, что все объединенные коммиты из другого филиала будут приведены в порядок, но это не похоже на это. Ниже приводится вывод git log:

f28e150 Merge branch 'items' 
8281666 [Master] Another middle commit before merge 
73d0ca9 [items] commit 2 
0442978 [items] commit 1 

Почему первые два коммиты пункта филиала показа перед главной ветви? Разве не имело бы смысла показывать их вместе под фиксацией слияния, так как тогда, когда я объединил все это с моим кодом?

Вызов опция графика: git log --graph показывает в правильном порядке

* f28e150 Merge branch 'items' 
|\ 
| * 73d0ca9 [items] commit 2 
| * 0442978 [items] commit 1 
* | 8281666 [Master] Another middle commit before merge 
|/ 

Поэтому я хочу, чтобы они все вместе, чтобы сделать его проще для меня, чтобы отменить все слияния

ответ

7

Короткий ответ что git log сортирует свой вывод, и вы должны выбрать порядок сортировки, который вы предпочитаете. (Это сортирует, потому что необходимо: parent/child relationships in a graph provide only a partial order но git log потребности наложить общий порядок.)

Подробности описаны в the git log documentation, что очень долго; найдите commit ordering (ссылка здесь должна сразу перейти к вам).

Требование о «обратном хронологическом порядке» по умолчанию - это немного ложь (это было верно в более старых версиях Git), поэтому порядок, который вы получите по умолчанию, будет зависеть от вашей конкретной версии Git. Обратите внимание, что --graph автоматически включается --topo-order, поэтому --topo-order может быть тем, что вы хотите.

Заметим также, что вы можете ограничить пересмотр ходить смотреть только на первого родителя каждого слияния, используя --first-parent. В этом случае вы не увидите другую ветку вообще. Для того чтобы --first-parent был полезен, каждый, кто сливается, должен быть несколько осторожен в этом, так что у вас нет «фокстрот-слияний», толкание переходит в боковые ветви. См. GIT: How can I prevent foxtrot merges in my 'master' branch?

+0

Спасибо за разъяснение. Однако когда вы выполняете сброс git для прошедшего x числа коммитов, какой порядок будет использоваться? –

+0

Команда 'git reset' сама не использует такую ​​систему нумерации. Однако 'gitrevisions' * * * разрешает' ~ n' (например, 'HEAD ~ 5'). Это следует за родительскими ссылками *, а именно с * родительскими * ссылками. Это не «перезагрузка git», а общая цель «называть конкретную фиксацию по отношению», и вы можете использовать, например, «git show», чтобы увидеть эту конкретную фиксацию. Более подробная информация содержится в https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html. – torek