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