ПредыдущийВ этой статье мы познакомили с основными понятиями git, в этой статье мы поговорим о ветках.
ветвь
Ветка в git на самом деле просто указатель на объект коммита, а не копирование всей текущей версии, как в традиционной системе контроля версий. На самом деле за ним стоит файл. Мы можем перейти в папку .git/refs/heads, чтобы просмотреть его. Каждый файл в нем на самом деле является веткой, а содержимое на самом деле представляет собой строку значений SHA1. Что это за значение SHA1? Это идентификатор коммита. Следующий рисунок является примером. Фактически, файл основной ветки хранит последний идентификатор коммита в главной ветке, а ветвь за ним представляет собой цепочку объектов коммита.
А что такое HEAD, по сути, это тоже указатель, указывающий на текущую ветку, а не на коммит-объект. В каталоге .git есть файл HEAD, в котором записана ветка, на которую указывает HEAD.
слияние ветвей
Далее я буду использовать пример, чтобы представить процесс слияния веток git Сначала предположим, что мы находимся в главной ветке.
Затем мы создаем новую ветку dev из текущего мастера и переключаемся на текущую ветку.git checkout -b dev
Затем мы модифицируем и отправляем новый коммит в ветку dev.Затем возвращаемся в ветку master и выполняемgit merge dev
объединить ветвьЗдесь следует отметить, что слияние по умолчанию использует режим быстрой перемотки вперед, что означает, что главный указатель напрямую указывает на последний идентификатор коммита.Промежуточная основная ветвь не будет изменена, и новый коммит не будет создан. , но на самом деле ни при каких обстоятельствах мы не можем напрямую перемотать вперед таким образом.При слиянии одно и то же содержимое одного и того же файла не изменяется, его можно напрямую перемотать вперед, но поскольку обе ветки зафиксированы, поэтому при слиянии Обязательно будет сгенерирован новый коммит-объект.В то же время, когда мы модифицируем тот же файл и тот же контент, слияние вызовет конфликт.После этого мы должны вручную исправить конфликт.После решения используйте git add, чтобы указать что конфликт был разрешен.И отправить с помощью git commit, это неизбежно сгенерирует новый коммит. В свою очередь, после слияния, если объединенная ветка хочет перейти к ветке, которая была объединена, ее можно перемотать вперед напрямую, думая, что две ветки уже имеют соединение, поэтому просто перемотайте вперед к соединению. мы можем на самом деле обобщить здесь правило, при каких обстоятельствах может выполняться быстрая перемотка вперед, то есть, когда текущая цепочка объектов фиксации может перейти от ветки, которая в настоящее время хочет выполнить слияние, к точке фиксации для слияния, тогда ее можно напрямую перемотать вперед .После разговора о режиме быстрой перемотки, естественно, есть режим без быстрой перемотки вперед.Даже если нет конфликта в режиме без быстрой перемотки в вышеупомянутой ситуации, новая фиксация будет сгенерирована, если два ветки не изменяются одновременно, при слиянии мы просто добавляем--no-ff
Вот и все,git merge --no-ff dev
, в чем преимущество режима без перемотки вперед?На самом деле, как показано на рисунке ниже, режим без перемотки вперед может помочь нам сохранить внешний вид ветки, и ветка может быть полностью видна в древовидная структура
Reset
На самом деле есть 3 режима git reset,mixed,soft и hard.Если он не прописан по умолчанию, то будет вызываться смешанный режим.Так в чем разница между тремя?По сути,mixed это перенос изменений между фиксация после сброса и исходная фиксация в рабочей области, в то время как софт переносится в область временного хранения, и, наконец, хард напрямую отбрасывается, поэтому видно, что сброс немного отличается от его буквального значения, мы часто неправильно понимаем что это сброс и отсечка последующих коммитов, по факту он просто возвращается в предыдущее состояние.
Stash
Какова роль git stash?Предположим, когда мы работаем над feature1, нам вдруг нужно срочно поработать над feature2.В это время нам нужно временно сохранить работу над feature1 с помощью git stash, а затем перейти к работе над feature2. вернуться к feature1, чтобы удалить ранее сохраненные изменения через git stash pop. Следует отметить, что git stash запомнит текущий идентификатор коммита, поэтому, если stash дважды изменит одну и ту же строку одного и того же файла в рамках одного и того же коммита, после первого восстановления и фиксации, второе восстановление будет иметь конфликт.
Tag
Тег на самом деле является объектом тега, о котором мы упоминали ранее, и он также указывает на объект фиксации.Разница между ним и ветвью заключается в том, что когда происходит фиксация, ветвь будет двигаться вперед вместе, но как только тег установлен, он не будет Он снова перемещен, поэтому обычно используется, когда наш проект достигает вехи и необходимо выпустить новую версию. Теги Git делятся на два типа облегченных тегов (облегченных) и аннотированных тегов (аннотированных).Как и в буквальном значении, разница между легкими и аннотированными тегами заключается в том, что у одного есть описательная информация, а у другого нет.
Diff
За git diff фактически используется модуль diff, который поставляется с linux, для сравнения различий между файлами.Если вам интересно, вы можете узнать об этом.
инструкция
-
Посмотреть список филиалов
git branch
-
создать ветку
git branch 分支名
-
переключить ветку
git checkout 分支名
-
переключиться на последнюю ветку
git checkout -
-
удалить ветку()
git branch -d 分支名
Здесь следует отметить, что текущая ветвь не может быть удалена.Если неосновная ветвь изменилась, но не была объединена, ее нельзя использовать, если не использовать
git branch -D 分支名
-
Создайте новую ветку и переключитесь на новую ветку
git checkout -b 分支名
-
Отображает самое последнее сообщение коммита для текущей ветки
git branch -v
-
Объединить ветку в текущую ветку
git merge 分支名
-
Отключите перемотку вперед, будет еще один идентификатор коммита
git merge --no-ff 分支名
-
Откат к предыдущей фиксации (на основе текущей фиксации)
git reset --hard HEAD^
-
Откат к последнему коммиту (все основано на текущем коммите)
git reset --hard HEAD^^
-
Откат к первым n коммитам в текущей ветке (n раз до текущего коммита)
git reset --hard HEAD~n
-
Вернуться к указанному коммиту
git reset --hard commit信息的前几位
-
изменить название ветки
git branch -m 原分支名 新分支名
-
Сохраните изменения в рабочей области
git stash
-
список всех сохранений
git stash list
-
Вручную установить описание тайника
Информация описания, возвращаемая по умолчанию при выполнении git stash,
На самом деле он содержит новость о последнем коммите, тогда мы можем изменить информацию описания с помощью следующей командыgit stash save 'hello basic'
-
Восстановите самое последнее сохранение и удалите это сохранение из списка
git stash pop
-
Восстановить самое последнее сохранение, не удаляя его из списка
git stash apply
-
примените конкретную версию и сохраните это время в списке и удалите
git stash apply stash@{0}
-
Вручную удалить указанную версию сохранения
git stash drop stash@{0}
-
Создавайте легкие теги
git tag v1.0.1
-
Создание меток заметок
git tag -a v1.0.2 -m 'release 1.0.2'
-
Просмотреть теги
git tag
Все теги можно просмотреть, но также и черезgit tag show 标签名
посмотреть на этикетку -
Найти теги
git tag -l 'v1.0'
В нем можно использовать шаблон, например 'v*', который представляет все теги, начинающиеся с v. -
убрать тэг
git tag -d 标签名
-
Укажите, кто изменил каждую строку, в какое время и какой коммит
git blame 文件名
-
Сравните разницу между текущим файлом и файлом рабочей области, которые включены в модификацию промежуточной области.
git diff
-
Сравните разницу между текущим последним коммитом и рабочей областью
git diff HEAD
-
Сравните разницу между фиксацией и рабочей областью
git diff commit_id
-
Сравните разницу между последним коммитом и промежуточной областью
git diff --cached
-
Сравните разницу между фиксацией и промежуточной областью
git diff --cached commit_id
-
Нажмите теги, которые не были отправлены локально одновременно
git push origin --tags
-
удалить удаленный тег
позвонив
git push origin --delete tag 标签名
или используйтеgit push origin :refs/tags/v6.0
Нажмите пустую метку -
Отрезать текущую удаленную ветку
Иногда пользователь a может выполнить команду для удаления удаленной ветки a1, а затем для пользователя b, когда он выполнит
git remote show origin
, вы обнаружите, что удаленная ветка a1 находится в устаревшем состоянии, то есть удаленной ветки больше нет, но локальная все еще существует, и вы можете выполнить ее в это время.git remote prune origin
, это приведет к удалению удаленной ветки в этом устаревшем состоянии
Сцены
-
когда мы используем
git reset --hard
Когда команда возвращается к предыдущему Commital,git log
Я могу видеть только текущий коммит и его предыдущие коммиты, поэтому, если я хочу вернуться к более позднему коммиту, как мне получить идентификатор коммита?Мы можем выполнить
git reflog
Давайте проверим журнал операций и посмотрим историю наших инструкций с помощью git, чтобы мы могли получить наш предыдущий идентификатор коммита.Здесь reflog фактически записывает историю изменений указателя HEAD, поэтому я обычно говорю не изменять его вручную Файлы в каталоге .git не будут записаны в reflog после ручной модификации. -
Я случайно поставил ветку с
git branch -D 分支名
Насильно удалил, можно ли сохранить?Он сохраняется.Первое, что здесь следует подчеркнуть, это то, что ветвь на самом деле является просто указателем, поэтому, даже если указатель будет удален, наш объект фиксации все еще будет там, поэтому, конечно, его можно сохранить, пока мы передаем
git reflog
Найдите идентификатор фиксации, на который указывает исходная ветка, и выполнитеgit branch 分支名 commit-id
Пришло время пересоздать обратно в нашу ветку. Вот расширение, чтобы сказать, на самом деле, вgit merge
Время на самом деле объединяет объекты фиксации, поэтому мы можем фактически передатьgit merge commit-id
Для слияния ветка просто дает нам стикер, который просто отмечает, что делает цепочка коммитов ветки.
Q&A
-
git checkout commit-id
а такжеgit reset --hard commit-id
какие отличия есть?Оба могут вернуться к соответствующей точке коммита, но разница между checkout и reset в том, что он будет в свободном состоянии.Если какая-либо модификация не будет отправлена, будет предупреждение, которое не позволяет нам перейти к другим коммитам. В то же время мы можем пройти модификацию.
git branch 分支名 当前checkout的commit-id
для создания новой ветки.