git log для возврата только коммитов, сделанных в главную ветку?

Я сделал немного поиска и нашел:

git log myBranchName

как возможное решение. Но что происходит, когда моя ветка является основной веткой? когда я бегу:

git log master

Кажется, вернуть все зафиксированные в любую ветку. Основываясь на том, что я прочитал, он перечисляет все коммиты, связанные с главной веткой. Зная это, как я могу вызвать историю коммитов только в основной ветке?

2 ответа

Я думаю, это то, что вы хотите

git log --first-parent master

Цитировать руководство

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

Из-за модели ветвления в Git коммиты не принадлежат одной или нескольким веткам. Ветви - это указатели на отдельные объекты фиксации во всем графе фиксации. Поэтому, когда вы говорите, что коммит находится "на ветке X" в X, вы обычно подразумеваете, что он достижим, когда начинается с коммита, на который указывает ветка X.

За git log поведение по умолчанию равно git log HEAD где HEAD относится к коммиту, на который указывает текущая ветвь. Так что, если вы находитесь на главной ветке, она равна git log master, показывая все коммиты, которые доступны при запуске с самого последнего коммита.

К сожалению, то, что вы называете коммитом, сделанным для определенной ветки, в Git четко не определено. Если я сделаю коммит на master, а затем создам новую ветку, которая указывает на тот же коммит (например, используя git branch newbranch), то эта ветвь буквально идентична основной ветке, за исключением имени. Таким образом, каждое свойство, "сделанное на ветке master", теперь также подразумевает "сделанное на ветке newbranch". Таким образом, вы не можете иметь это свойство в Git.

Даже решение Parkydr, которое показывает все коммиты, которые были сделаны только на одной стороне слияний, не является отказоустойчивым решением. В идеале это будет скрывать все те коммиты, которые были сделаны в отдельной ветке, не являющейся мастером, и которые затем были объединены в мастер. Таким образом, вы получите только те коммиты, которые либо сделаны непосредственно в мастер-линию, либо коммиты слияния слились с некоторыми другими коммитами. Однако есть две вещи, которые не позволят этому работать:

  1. Ускоренное слияние: когда вы переходите от мастера и создаете некоторые коммиты, не создавая новых непосредственно на мастере, тогда git merge somebranch on master ускоряет пересылку коммитов, в результате чего ветвь master указывает на тот же коммит, что и somebranch. Таким образом, вы "теряете" информацию о том, что эти коммиты изначально были созданы в отдельной ветке. Вы можете заставить Git всегда создавать коммиты слияния, используя git merge --no-ff но это не поможет вам потом.
  2. Порядок слияния не гарантируется: если вы находитесь на главном сервере и объединяете ветку, то предыдущий главный коммит всегда будет первым родителем. Таким образом, вы получите желаемое поведение. Однако вполне возможно оказаться в указанной ветке и вместо этого объединить master, в результате чего master commit будет вторым родителем. Затем мастер может быть быстро перенаправлен (или сброшен) на новый коммит, что приведет к "обращенному" представлению.

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

Другие вопросы по тегам