предисловие
Чит-книга врывается во вселенную, так при чем здесь чит-книга? То естьgit秘籍
, для начинающихgit
только знаюgit add .
,git commit -m 'commit message'
,git push origin main
Эти три движения! На самом деле, есть много git's move, достаточно, чтобы вы могли исследовать! Давайте освоим эти читы, чтобы отправиться во вселенную!
Давайте сначала вышлем вам полный список команд git! git общая блок-схема
Суть читов git — многопользовательский совместный конфликт
1. Что такое совместная разработка Git несколькими людьми
При разработке крупномасштабного проекта обычно сотрудничает много людей, и каждый человек отвечает за часть проекта.Git — наиболее распространенный инструмент для совместной разработки с несколькими людьми, но для тех, кто плохо знаком с Git, Совместная разработка столкнется со многими вопросами, содержание этого блога в основном состоит в том, чтобы дать правильные шаги для совместной разработки с участием нескольких человек, а также объяснить и решить проблемы, возникающие в этом процессе.
Как избежать конфликтов кода, когда так много людей разрабатывают совместно?
Мы сначала посмотрим на процесс совместной разработки, чем это!
2. Подготовка к совместной разработке несколькими людьми
- Создать новый склад
- Создайте ветку master, то есть загрузите начальный контент проекта в ветку master
- Члены команды разделяют труд (содержание, ответственное за каждого члена, не должно максимально конфликтовать)
3. Стадия разработки
- Каждый участник клонирует содержимое главной ветки удаленного хранилища.
- Выполняйте работу, за которую вы отвечаете, в соответствии с разделением труда
4. Этап фиксации (этап генерации конфликта)
(1) После того, как каждый участник завершит свою работу, ему сначала нужно обратить внимание на изменения на удаленном складе.
Способ 1: потяните удаленную ветку (команда git pull)
git pull指令
Его можно понимать как два шага:
- получить удаленную ветку
- Объединить выбранную удаленную ветку с локальной веткой
Способ 2: получить удаленную ветку (команда git fetch)
git fetch指令
понимание:
- Получить последнюю версию удаленной указанной ветки в локальную (то есть создать новую ветвь локально с последней версией удаленной указанной ветки)
- После получения ветки вы можете сравнить и просмотреть содержимое удаленной ветки, а затем, если вы хотите нажать, вы можете выбрать слияние с полученной веткой, а затем нажать.
(2), получите последнюю версию удаленного хранилища и объедините ее локально
Проблемы с конфликтами возникают при слиянии: Конфликты слияния
Производственная ситуация (3 вида):
- Два человека внесли изменения в разные файлы одного и того же проекта
- Два человека внесли изменения в разные области одного и того же файла для одного и того же проекта.
- В одну и ту же область одного и того же файла в одном и том же проекте были внесены разные модификации
Мышление: Итак, какая из трех вышеперечисленных ситуаций будет конфликтной?
Ответ будет раскрыт ниже:
Первые два могут быть автоматически объединены git, а третий случай не может быть объединен автоматически и должен быть объединен вручную (третий вызовет конфликты);
Вопрос 1: Что такое автоматическое слияние?
Слияние можно понимать по сути как интеграцию двух человек (филиалов) модификаций в базу проекта, обратите внимание на модификацию проекта. В первых двух из трех вышеперечисленных ситуаций два человека изменяют разные области проекта, не мешая друг другу, поэтому Git может автоматически интегрировать изменения двух людей в проект вместе.
Вопрос 2: Что такое ручное слияние?
Когда Git не знает, какое из двух изменений оставить, ему нужен человек, чтобы принять это решение, и он может выбрать сохранение любого из двух изменений или сохранить их оба. Завершение вышеупомянутых решений — это то, для чего нужны ручные слияния.
Вопрос 3: Почему мне нужно выполнить слияние вручную?
Когда его можно автоматически объединить, это означает, что изменения двух людей не будут конфликтовать, но когда два человека вносят изменения в одну и ту же область одного и того же файла, эти два изменения будут конфликтовать, и Git не сможет интегрироваться. эти два изменения, потому что Git не знает, какое из двух изменений он должен сохранить (или оба), требует ручного слияния людьми.
(3) После слияния вы можете самостоятельно загрузить (git push) на удаленный склад.
5. Просмотр этапа
Администратор просматривает код и объединяет его с основной веткой, если проблем не обнаружено. Администратор должен завершить этот процесс как можно скорее, чтобы гарантировать, что участники получат последнюю версию.
Конфликты также могут возникать во время процесса слияния администратора, и администратору необходимо связаться с участниками, чтобы понять ситуацию, а затем выполнить слияние вручную.
Роль администратора:
Поддерживайте основную ветвь удаленного репозитория, включая следующее:
- Проверьте код каждой ветки-члена на наличие проблем
- Объединить код из ветки-члена в основную ветку
- Когда возникает конфликт слияния, выполните слияние вручную
6. Разрешение конфликтов
1. Виды конфликта
логический конфликт
автоматическая обработка git (слияние/применение исправлений) выполняется успешно, но логика ошибочна.
Например, другой человек изменил имя файла, а я все еще использую старое имя файла, в этом случае автоматическая обработка может быть успешной, но на самом деле есть проблема.
Другой пример, значение возвращаемого значения функции меняется, но я все еще использую старое значение, эта ситуация автоматически обрабатывается успешно, но могут быть скрыты серьезные ошибки.
Такого рода проблемы в основном гарантируются автоматизированным тестированием. Поэтому лучше иметь возможность написать относительно полный автоматизированный тестовый пример.
Решением этого конфликта является исправление ОШИБКИ. На самом деле не разрешает конфликты, о которых сообщает git.
Контент конфликт
Два пользователя изменяют одну и ту же область одного и того же файла, и git сообщит о конфликте содержимого. Это то, что мы часто видим, и последующие решения в основном нацелены на такого рода конфликты.
конфликт дерева
Измените конфликт имени файла, называемый конфликтом дерева. Например, пользователь переименовал файл a.c, пользователь b переименовал тот же файл, что и b.c, а затем b, когда две фиксации слияния создают конфликты. Если доработать b.c, то решение будет следующим:
git rm a.c git rm origin-name.c git add b.c git commit
При выполнении первых двух git rms будет выдано предупреждение «имя файла: требуется слияние», и вы можете их игнорировать.
Разница между git rebase и git merge при слиянии
Когда операция слияния сталкивается с конфликтом, текущее слияние не может быть продолжено. После изменения конфликтующего содержимого вручную добавьте модификацию и зафиксируйте. Операция перебазирования прервет перебазирование и предложит разрешить конфликт. После разрешения конфликта выполните git rebase --continue после изменения добавления или git rebase --skip, чтобы игнорировать конфликт.
2. Перебазировать
Перебазирование следует использовать в ветке, извлеченной из вашего собственного локального хранилища, не выполняйте перебазирование ветки, у которой есть копия за пределами локального хранилища.
git pull и git pull --rebase
-
git pull = git fetch + git merge
-
git pull --rebase = git fetch + git rebase
git pull --rebase, здесь означает отменить каждый коммит (commit) в вашей локальной текущей ветке и временно сохранить их как патчи (patch) (эти патчи помещаются в каталог «.git/rebase»), затем обновить локальный текущую ветку в последнюю ветку «исходная» и, наконец, примените сохраненные исправления к локальной текущей ветке
конфликт 1
когда ты
commit
Позже, при выполненииgit pull –rebase
При возникновении конфликта выполните следующие действия, чтобы разрешить его:
- 1 Сначала найдите конфликтный файл и разрешите конфликт
- 2 Выполните git add xxx (xxx — это полный путь к файлу конфликта)
- 3 Выполнить git rebase – продолжить (конфликт слияния)
- 4 Выполните git pull --rebase
- 5 Выполнить git push
конфликт 2
Когда у вас есть модификации локально, вы выполняете git stash, а затем загружаете последний код с сервера (git pull --rebase), возникает конфликт, разрешите его следующим образом:
- 1 Найдите конфликтный файл и разрешите конфликт
- 2 Выполните git add xxx (xxx — это полный путь к файлу конфликта)
- 3 git commit
- 4 git вытащить --rebase
- 5 git push
Когда мультиплеер разрабатывается одной и той же удаленной ветвью, если вы хотите сгладить Push без автоматического создания Merge Commital, рекомендуется действовать в следующем порядке при каждой отправке:
//git stash 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
git stash
git pull --rebase
git push
//git stash pop 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。将暂存文件取出,与pull的文件对比
git stash pop
3. Откат (сброс и возврат)
git reset (сброс)
Разница между git reset --hard и git reset --soft
git reset --soft: вернуться к определенной версии (
已经git add的
), откатывается только информация фиксации, и она не будет восстановлена до уровня файла индекса. Если вы все еще хотите отправить, просто зафиксируйте напрямую;git reset --hard: полностью откатиться на определенную версию, локальный исходный код также станет содержимым предыдущей версии, а изменения, содержащиеся в отозванном коммите, будут смыты;
в:A
а также B
является обычным коммитом, в то время какC
а такжеD
отправлена ошибка. Теперь мы хотим поставитьC
а также D
отвали. В настоящее время,HEAD
указатель наD
представить(5lk4er)
. Нам просто нужно поставитьHEAD
указатель перемещается на B
представить(a0fvf8)
, цель может быть достигнута.
Итак, каков порядок? То естьgit reset
Заказ
1.git reset --hard
//git reset --hard <commit_id>
git reset --hard a0fvf8
После выполнения командыHEAD
указатель переместится наB
представить под
В это время удаленный складHEAD
Указатель остается прежним, по-прежнемуD
Отправить дальше. Итак, если вы напрямую используете git push
команда, не сможет отправить изменения в удаленный репозиторий. В настоящее время вы можете использовать только -f
Возможность принудительно отправлять коммиты в удаленное репо
git push -f
Очевидным недостатком отката кода таким образом является то, что он делает HEAD
Указатель перемещается назад, и последующие фиксации теряются. Если вдруг обнаружат в будущем,C
а такжеD
Какая замечательная идея, но они уже давно исчезли в длинной реке истории.
2. git сброс --мягкий
//git reset --soft <commit_id>
git reset --soft a0fvf8
пример:
Принцип: Функция git reset состоит в том, чтобы изменить позицию HEAD, то есть изменить позицию, на которую указывает HEAD, на предыдущую версию, как показано на следующем рисунке, предполагая, что мы хотим вернуться к версии 1:
Применимые сценарии: если вы хотите восстановить ранее отправленную версию, и мы не хотим, чтобы версия была отправлена после этой версии, вы можете использовать этот метод.
git вернуться (отменить)
git revert
Эффект обратного действия создает новую версию с тем же содержимым, что и целевая версия, к которой мы хотим вернуться, ноHEAD
Указатель указывает на эту вновь сгенерированную версию, а не на целевую версию.
использоватьgit revert
команду для реализации приведенного выше примера, мы можем сделать это:revert D
,Опять такиrevert C
(Если есть несколько коммитов, которые необходимо откатить, это нужно сделать от нового к старому.revert
):
// 1 revert D
git revert 5lk4er
// 2 revert C
git revert 76sdeb
Затем генерируются два новых коммита:D'
а такжеC'
Здесь требуется только два коммитаrevert
, мы можем вернуться один за другим. А если их десятки? Откат по одному определенно неэффективен и подвержен ошибкам. Мы можем сделать массовый откат, используя:
git revert OLDER_COMMIT^..NEWER_COMMIT
В это время неправильная подачаC
а такжеD
Он все еще зарезервирован, и в будущем будет время, когда придет время сбросить банк. Более того, если вы сделаете этоHEAD
Указатель перемещается назад и может использоваться напрямуюgit push
Команды отправляются в удаленный репозиторий. И именно такой подход поощряет компания.
примерПринцип: git revert используется для «отмены» определенной версии для достижения цели отмены модификации версии. Например, мы закоммитили три версии (версия 1, версия 2, версия 3), и вдруг обнаружили, что версия 2 не работает (например: есть баги), и хотим отозвать версию 2, но не хотим влиять коммит отзыва версии 3, мы можем использовать команду git revert, чтобы отменить версию 2 и создать новую версию 4. В этой версии 4 содержимое версии 3 будет сохранено, но содержимое версии 2 будет отозвано. Как показано ниже:
Применимые сценарии: если мы хотим отозвать предыдущую версию, но хотим сохранить версию после целевой версии и записать весь процесс изменения версии, мы можем использовать этот метод.
Ссылка на статью:Git может восстановить предыдущую версию двумя способами: сброс и откат (подробное изображение и текст)
сайт практики команд git
Веб-сайт, который может сообщить мне, что происходит после выполнения каждой команды (вы можете воспроизвести его, если вам интересно)Изучите Git Branching, сайт для практики команд git
отображение страницы сайта Например: попрактикуйтесь в вопросе
Знакомство с git rebase
git rebase main не выполняется
Выполнить git rebase main
git rebase bugfix не выполняется
Выполнить git rebase bugFix
Советы по работе с вопросами Знакомство с интерфейсом ответа на вопросы ОтвечатьВведя команду, мы можем заметить, что древовидная диаграмма справа изменится, что позволит нам лучше понять команду git.
Следующие все желающие могут ввести команду git, чтобы попробовать в соответствии с ответом, я не буду отвечать на них по очереди для всех! Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение в разделе комментариев!
//新建并切换到bugFix分支
git checkout -b bugFix
//提交一次
git commit
//切换到main分支
git checkout main
//提交一次
git commit
//再次切换到bugFix分支
git checkout bugFix
//rebase 到 main
git rebase main
Суммировать
Это также первое знакомство с git совместной работой нескольких человек, ведь студенты не сталкивались с этими проблемами в своей работе. Если есть какая-либо проблема, пожалуйста, помогите мне указать на нее, я изменю ее вовремя, заранее спасибо!
Некоторые из изображений выше украдены, если есть какие-либо нарушения, пожалуйста, свяжитесь со мной!
本人大三正在学习前端!