Принцип Git и расширенное использование (2)

Git Linux

ПредыдущийВ этой статье мы познакомили с основными понятиями 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, для сравнения различий между файлами.Если вам интересно, вы можете узнать об этом.

инструкция

  1. Посмотреть список филиалов

    git branch

  2. создать ветку

    git branch 分支名

  3. переключить ветку

    git checkout 分支名

  4. переключиться на последнюю ветку

    git checkout -

  5. удалить ветку()

    git branch -d 分支名

    Здесь следует отметить, что текущая ветвь не может быть удалена.Если неосновная ветвь изменилась, но не была объединена, ее нельзя использовать, если не использоватьgit branch -D 分支名

  6. Создайте новую ветку и переключитесь на новую ветку

    git checkout -b 分支名

  7. Отображает самое последнее сообщение коммита для текущей ветки

    git branch -v

  8. Объединить ветку в текущую ветку

    git merge 分支名

  9. Отключите перемотку вперед, будет еще один идентификатор коммита

    git merge --no-ff 分支名

  10. Откат к предыдущей фиксации (на основе текущей фиксации)

    git reset --hard HEAD^

  11. Откат к последнему коммиту (все основано на текущем коммите)

    git reset --hard HEAD^^

  12. Откат к первым n коммитам в текущей ветке (n раз до текущего коммита)

    git reset --hard HEAD~n

  13. Вернуться к указанному коммиту

    git reset --hard commit信息的前几位

  14. изменить название ветки

    git branch -m 原分支名 新分支名

  15. Сохраните изменения в рабочей области

    git stash

  16. список всех сохранений

    git stash list

  17. Вручную установить описание тайника

    Информация описания, возвращаемая по умолчанию при выполнении git stash,

    На самом деле он содержит новость о последнем коммите, тогда мы можем изменить информацию описания с помощью следующей командыgit stash save 'hello basic'

  18. Восстановите самое последнее сохранение и удалите это сохранение из списка

    git stash pop

  19. Восстановить самое последнее сохранение, не удаляя его из списка

    git stash apply

  20. примените конкретную версию и сохраните это время в списке и удалите

    git stash apply stash@{0}

  21. Вручную удалить указанную версию сохранения

    git stash drop stash@{0}

  22. Создавайте легкие теги

    git tag v1.0.1

  23. Создание меток заметок

    git tag -a v1.0.2 -m 'release 1.0.2'

  24. Просмотреть теги

    git tagВсе теги можно просмотреть, но также и черезgit tag show 标签名посмотреть на этикетку

  25. Найти теги

    git tag -l 'v1.0'В нем можно использовать шаблон, например 'v*', который представляет все теги, начинающиеся с v.

  26. убрать тэг

    git tag -d 标签名

  27. Укажите, кто изменил каждую строку, в какое время и какой коммит

    git blame 文件名

  28. Сравните разницу между текущим файлом и файлом рабочей области, которые включены в модификацию промежуточной области.

    git diff

  29. Сравните разницу между текущим последним коммитом и рабочей областью

    git diff HEAD

  30. Сравните разницу между фиксацией и рабочей областью

    git diff commit_id

  31. Сравните разницу между последним коммитом и промежуточной областью

    git diff --cached

  32. Сравните разницу между фиксацией и промежуточной областью

    git diff --cached commit_id

  33. Нажмите теги, которые не были отправлены локально одновременно

    git push origin --tags

  34. удалить удаленный тег

    позвонивgit push origin --delete tag 标签名или используйтеgit push origin :refs/tags/v6.0Нажмите пустую метку

  35. Отрезать текущую удаленную ветку

    Иногда пользователь a может выполнить команду для удаления удаленной ветки a1, а затем для пользователя b, когда он выполнитgit remote show origin, вы обнаружите, что удаленная ветка a1 находится в устаревшем состоянии, то есть удаленной ветки больше нет, но локальная все еще существует, и вы можете выполнить ее в это время.git remote prune origin, это приведет к удалению удаленной ветки в этом устаревшем состоянии

Сцены

  1. когда мы используемgit reset --hardКогда команда возвращается к предыдущему Commital,git logЯ могу видеть только текущий коммит и его предыдущие коммиты, поэтому, если я хочу вернуться к более позднему коммиту, как мне получить идентификатор коммита?

    Мы можем выполнитьgit reflogДавайте проверим журнал операций и посмотрим историю наших инструкций с помощью git, чтобы мы могли получить наш предыдущий идентификатор коммита.Здесь reflog фактически записывает историю изменений указателя HEAD, поэтому я обычно говорю не изменять его вручную Файлы в каталоге .git не будут записаны в reflog после ручной модификации.

  2. Я случайно поставил ветку сgit branch -D 分支名Насильно удалил, можно ли сохранить?

    Он сохраняется.Первое, что здесь следует подчеркнуть, это то, что ветвь на самом деле является просто указателем, поэтому, даже если указатель будет удален, наш объект фиксации все еще будет там, поэтому, конечно, его можно сохранить, пока мы передаемgit reflogНайдите идентификатор фиксации, на который указывает исходная ветка, и выполнитеgit branch 分支名 commit-idПришло время пересоздать обратно в нашу ветку. Вот расширение, чтобы сказать, на самом деле, вgit mergeВремя на самом деле объединяет объекты фиксации, поэтому мы можем фактически передатьgit merge commit-idДля слияния ветка просто дает нам стикер, который просто отмечает, что делает цепочка коммитов ветки.

Q&A

  1. git checkout commit-idа такжеgit reset --hard commit-idкакие отличия есть?

    Оба могут вернуться к соответствующей точке коммита, но разница между checkout и reset в том, что он будет в свободном состоянии.Если какая-либо модификация не будет отправлена, будет предупреждение, которое не позволяет нам перейти к другим коммитам. В то же время мы можем пройти модификацию.git branch 分支名 当前checkout的commit-idдля создания новой ветки.