Многолетний опыт работы с Git и часто задаваемые вопросы

Git JavaScript

Блок-схема Git

  • Workspace: Рабочее пространство
  • Index / Stage: кэш-память
  • Repository: складская площадь (или местный склад)
  • Remote: удаленный репозиторий

Настроить Git

# 配置全局用户
$ git config --global user.name "用户名" 
$ git config --global user.email "git账号"
# 配置别名
$ git config --global alias.co checkout
$ git config --global alias.ss status
$ git config --global alias.cm commit
$ git config --global alias.br branch
$ git config --global alias.rg reflog
# 这里只是美化 log 的输出,实际使用时可以在 git lg 后面加命令参数,如: git lg -10 显示最近10条提交
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 删除全局配置
$ git config --global --unset alias.xxx
$ git config --global --unset user.xxx

Просмотр информации о Git

# 查看系统配置
$ git config --list
# 查看用户配置
$ cat ~/.gitconfig 
# 查看当前项目的 git 配置
$ cat .git/config
# 查看暂存区的文件
$ git ls-files
# 查看本地 git 命令历史
$ git reflog
# 查看所有 git 命令
$ git --help -a 
# 查看当前 HEAD 指向
$ cat .git/HEAD

# git 中 D 向下翻一行  F 向下翻页  B 向上翻页  Q 退出
# 查看提交历史
$ git log --oneline  
          --grep="关键字"
          --graph 
          --all      
          --author "username"     
          --reverse 
          -num
          -p
          --before=  1  day/1  week/1  "2019-06-06" 
          --after= "2019-06-06"
          --stat 
          --abbrev-commit 
          --pretty=format:"xxx"
          
# oneline -> 将日志记录一行一行的显示
# grep="关键字" -> 查找日志记录中(commit提交时的注释)与关键字有关的记录
# graph -> 记录图形化显示 !!!    
# all -> 将所有记录都详细的显示出来
# author "username" -> 查找这个作者提交的记录
# reverse -> commit 提交记录顺序翻转      
# before -> 查找规定的时间(如:1天/1周)之前的记录   
# num -> git log -10 显示最近10次提交 !!!    
# stat -> 显示每次更新的文件修改统计信息,会列出具体文件列表 !!!
# abbrev-commit -> 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符 !!!
# pretty=format:"xxx" ->  可以定制要显示的记录格式 !!!
# p -> 显示每次提交所引入的差异(按 补丁 的格式输出)!!!

git reflog

  • показываетHEADУказать в список раз, когда произошло изменение. Когда вы переключаете ветки, используйтеgit commitпредставить, иgit resetПри отмене коммитаHEADнаведение изменится, но когда вы сделаетеgit checkout -- <filename>отозвать илиgit stashПри сохранении файлов и т. д.HEADне изменится, эти изменения никогда не были зафиксированы, поэтомуreflogИ это не может помочь нам восстановить их.
  • git reflogНе навсегда, Git будет периодически очищать эти «неиспользуемые» объекты, не ожидайте, что коммиты, сделанные несколько месяцев назад, будут там все время.

git log точечный график

  • Ветка в git — это указатель, а создание новой ветки — это создание нового указателя на основе текущего указателя.
  • Переход на ветку - это указать HEAD на ветку (указатель)
  • Переключение на фиксацию означает указание HEAD на фиксацию

Объяснение символа:

*	表示一个 commit
|	表示分支前进
/	表示分叉
\	表示合入
|/	表示新分支

Git общие команды

# 查看工作区和暂存区的状态
$ git status 
# 将工作区的文件提交到暂存区
$ git add .  
# 提交到本地仓库
$ git commit -m "本次提交说明"
# add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库)
$ git commit -am "本次提交说明"  
# 将本地分支和远程分支进行关联
$ git push -u origin branchName 
# 将本地仓库的文件推送到远程分支
$ git push
# 拉取远程分支的代码
$ git pull origin branchName 
# 合并分支
$ git merge branchName 
# 查看本地拥有哪些分支
$ git branch
# 查看所有分支(包括远程分支和本地分支)
$ git branch -a 
# 切换分支
$ git checkout branchName 
# 临时将工作区文件的修改保存至堆栈中
$ git stash
# 将之前保存至堆栈中的文件取出来
$ git stash pop

Подробное объяснение общих команд Git

add

Добавьте файлы рабочей области в промежуточную область.

# 添加指定文件到暂存区(追踪新增的指定文件)
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区(追踪所有新增的文件)
$ git add .
# 删除工作区/暂存区的文件
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名工作区/暂存区的文件
$ git mv [file-original] [file-renamed]

# Git 2.0 以下版本
#只作用于文件的新增和修改
$ git add .  
#只作用于文件的修改和删除
$ gti add -u
#作用于文件的增删改
$ git add -A 

# Git 2.0 版本
$ git add . 等价于 $ git add -A 
  • git add .:Объектом операции являются все изменения файлов в «текущем каталоге»., "." означает текущий каталог. Будет следить за деревом состояний рабочей области, используя его будетЗафиксировать все измененияв промежуточную область, включая изменения содержимого файла (modified) и новый файл (new),ноНе включает удаленные файлы.
  • git add -u:Объектом операции являются изменения файла, отслеженные всем рабочим пространством, независимо от того, в каком каталоге оно находится в данный момент.. Монитор толькофайл, который был добавлен(которыйtracked file), который фиксирует измененные файлы (включая удаленные файлы) в промежуточной области.git add -uне будет подавать новые документы (untracked file). (git add --updateаббревиатура)
  • git add -A:Объектом операции - это изменение всех файлов в «целом рабочем пространстве», независимо от того, какой каталог он в настоящее время находится в. представляет собой комбинацию двух вышеуказанных функций (git add --allаббревиатура).

status

# 查看工作区和暂存区的状态
$ git status 

commit

# 将暂存区的文件提交到本地仓库并添加提交说明
$ git commit -m "本次提交的说明"   

# add 和 commit 的合并,便捷写法
# 和 git add -u 命令一样,未跟踪的文件是无法提交上去的
$ git commit -am "本次提交的说明"  

# 跳过验证继续提交
$ git commit --no-verify
$ git commit -n

# 编辑器会弹出上一次提交的信息,可以在这里修改提交信息
$ git commit --amend
# 修复提交,同时修改提交信息
$ git commit --amend -m "本次提交的说明"
# 加入 --no-edit 标记会修复提交但不修改提交信息,编辑器不会弹出上一次提交的信息
$ git commit --amend --no-edit
  • git commit --amendМожно изменить как содержимое последнего отправленного файла, так и описание последнего отправленного файла. будет использовать новыйcommitОбновите и замените последний коммитcommit. Если в области подготовки есть контент, этот новыйcommitбудет сочетать любую модификацию с предыдущейcommitсодержание объединено. Если в области временного хранения нет контента, то эта операция сохранит только последнийcommitСообщение переписано.Никогда не исправлять фиксацию, которая была отправлена ​​в общедоступный репозиторий, отклонит отправку в репозиторий.

push & pull

  • Порядок отправки ветки записывается как:
# 将本地仓库的文件推送到远程分支
# 如果远程仓库没有这个分支,会新建一个同名的远程分支
# 如果省略远程分支名,则表示两者同名
$ git push <远程主机名> <本地分支名>:<远程分支名>
$ git push origin branchname  

# 如果省略本地分支名,则表示删除指定的远程分支
# 因为这等同于推送一个空的本地分支到远程分支。
$ git push origin :master
# 等同于
$ git push origin --delete master

# 建立当前分支和远程分支的追踪关系
$ git push -u origin master
# 如果当前分支与远程分支之间存在追踪关系
# 则可以省略分支和 -u 
$ git push

# 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
$ git push --all origin

# 拉取所有远程分支到本地镜像仓库中
$ git pull
# 拉取并合并项目其他人员的一个分支 
$ git pull origin branchname  
# 等同于 fetch + merge
$ git fetch origin branchName
$ git merge origin/branchName

# 如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做 git pull 合并差异,
# 然后再推送到远程主机。这时,如果你一定要推送,可以使用 –-force 选项 
# (尽量避免使用)
$ git push --force origin | git push -f origin

branch

# 查看本地分支
$ git branch | git branch -l 
# 查看远程分支
$ git branch -r 
# 查看所有分支(本地分支+远程分支)
$ git branch -a 
# 查看所有分支并带上最新的提交信息
$ git branch -av 
# 查看本地分支对应的远程分支
$ git branch -vv 

# 新建分支
# 在别的分支下新建一个分支,新分支会复制当前分支的内容
# 注意:如果当前分支有修改,但是没有提交到仓库,此时修改的内容是不会被复制到新分支的
$ git branch branchname 
# 切换分支(切换分支时,本地工作区,仓库都会相应切换到对应分支的内容)
$ git checkout branchname 
# 创建一个 aaa 分支,并切换到该分支 (新建分支和切换分支的简写)
$ git checkout -b aaa 
# 可以看做是基于 master 分支创建一个 aaa 分支,并切换到该分支
$ git checkout -b aaa master

# 新建一条空分支(详情请看问题列表)
$ git checkout --orphan emptyBranchName
$ git rm -rf . 

# 删除本地分支,会阻止删除包含未合并更改的分支
$ git brnach -d branchname 
# 强制删除一个本地分支,即使包含未合并更改的分支
$ git branch -D branchname  
# 删除远程分支
# 推送一个空分支到远程分支,其实就相当于删除远程分支
$ git push origin  :远程分支名
# 或者
$ git push origin --delete 远程分支名 

# 修改当前分支名
$ git branch -m branchname 

слияние Три распространенных метода слияния

# 默认 fast-forward ,HEAD 指针直接指向被合并的分支
$ git merge 

# 禁止快进式合并
$ git merge --no-ff 

$ git merge --squash 

  • fast-forward: Добавит история совершения объединенной ветви в историю фиксации нынешнего филиала (Вы должны понимать, что когда происходит быстрое слияние, происходит не каждое слияние.);
  • --no-ff:создаст новую фиксацию, чтобы история коммитов текущей ветки не была такой запутанной;
  • --squash:Новые коммиты генерироваться не будут, содержимое, отправленное несколько раз объединенной ветвью, будет храниться непосредственно в рабочей области и области подготовки, и разработчик отправит его вручную, так что текущая ветвь будет иметь только одну дополнительную запись фиксации в конце и не будет быть смешанным с историей коммитов объединенной ветки.

rebase

Ляо Сюэфэн.com/wiki/896043…

git-triplegate.com/book/this/v2/…

у-у-у. Краткое описание.com/afraid/4 Ах 8 Волосы 4 Афан 4 Ох...

nuggets.capable/post/684490…

stash

  • Возможность сохранения всех незафиксированных изменений в стеке для последующего восстановления текущего содержимого рабочей области
  • Если файл не отправленПромежуточная область (используйте git add . для отслеживания новых файлов), использование этой команды предложитNo local changes to save, невозможно сохранить изменения в стеке

используемые сцены:Когда вам нужно исправить срочную ошибку, вы обычно создаете новую ветвь ошибки, чтобы исправить ее, объединить и удалить. Однако, если вы в данный момент разрабатываете функцию и не можете выполнить ее в короткие сроки, вы не можете напрямую отправить ее на склад, в это время вы можете сначала поместить содержимое текущей рабочей областиgit stash, а затем перейти к исправлению ошибки, после исправления, затемgit stash pop, чтобы восстановить предыдущий рабочий контент.

# 将所有未提交的修改(提交到暂存区)保存至堆栈中
$ git stash 
# 给本次存储加个备注,以防时间久了忘了
$ git stash save "存储"
# 存储未追踪的文件
$ git stash -u

# 查看存储记录
$ git stash list

在 Windows 上和 PowerShell 中,需要加双引号
# 恢复后,stash 记录并不删除
$ git stash apply "stash@{index}"
# 恢复的同时把 stash 记录也删了
$ git stash pop "stash@{index}"
# 删除 stash 记录
$ git stash drop "stash@{index}"
# 删除所有存储的进度
$ git stash clear
# 查看当前记录中修改了哪些文件
$ git stash show "stash@{index}"
# 查看当前记录中修改了哪些文件的内容
$ git stash show -p "stash@{index}" 

diff

# 查看工作区和暂存区单个文件的对比
$ git diff filename 
# 查看工作区和暂存区所有文件的对比
$ git diff 
# 查看工作区和暂存区所有文件的对比,并显示出所有有差异的文件列表
$ git diff --stat   
# 注意:
# 1.你修改了某个文件,但是没有提交到暂存区,这时候会有对比的内容
# 一旦提交到暂存区,就不会有对比的内容(因为暂存区已经更新)
# 2.如果你新建了一个文件,但是没有提交到暂存区,这时候 diff 是没有结果的	

# 查看暂存区与上次提交到本地仓库的快照(即最新提交到本地仓库的快照)的对比
$ git diff --cached/--staged
# 查看工作区与上次提交到本地仓库的快照(即最新提交到本地仓库的快照)的对比
$ git diff branchname
# 查看工作区与 HEAD 指向(默认当前分支最新的提交)的对比
$ git diff HEAD   

# 查看两个本地分支中某一个文件的对比
$ git diff branchname..branchname filename 
# 查看两个本地分支所有的对比
$ git diff branchname..branchname 
# 查看远程分支和本地分支的对比
$ git diff origin/branchname..branchname 
# 查看远程分支和远程分支的对比
$ git diff origin/branchname..origin/branchname 

# 查看两个 commit 的对比
$ git diff commit1..commit2  

remote

# 查看所有远程主机
$ git remote
# 查看关联的远程仓库的详细信息
$ git remote -v 
# 删除远程仓库的 “关联”
$ git remote rm projectname 
# 设置远程仓库的 “关联”
$ git remote set-url origin <newurl>

tag

Обычно используется в релизной версии

Ляо Сюэфэн.com/wiki/896043…

# 默认在 HEAD 上创建一个标签 
$ git tag v1.0
# 指定一个 commit id 创建一个标签 
$ git tag v0.9 f52c633
# 创建带有说明的标签,用 -a 指定标签名,-m 指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 

# 查看所有标签
# 注意:标签不是按时间顺序列出,而是按字母排序的。
$ git tag

# 查看单个标签具体信息
$ git show <tagname>

# 推送一个本地标签
$ git push origin <tagname>
# 推送全部未推送过的本地标签
$ git push origin --tags

# 删除本地标签
# 因为创建的标签都只存储在本地,不会自动推送到远程。
# 所以,打错的标签可以在本地安全删除。
$ git tag -d v0.1
# 删除一个远程标签(先删除本地 tag ,然后再删除远程 tag)
$ git push origin :refs/tags/<tagname>

Удалить файлы

# 删除暂存区和工作区的文件
$ git rm filename  
# 只删除暂存区的文件,不会删除工作区的文件
$ git rm --cached filename 

Если вы загружаете файл в удаленный репозиторий перед настройкой файла .gitignore и хотите удалить файл в удаленном репозитории в это время, бесполезно настраивать файл .gitignore в это время, поскольку файл отслеживается. , но я не хочу удалять файл локально, а затем повторно отправлять его на удаленный склад. В настоящее время я могу использоватьgit rm --cached filenameКоманда отменяет отслеживание файла, так что при следующей отправке git не отправит файл снова, поэтому файл в удаленном хранилище также будет удален.

Переключение версий, сброс и отмена

  • checkout может отменить файлы в рабочей области, reset может отменить файлы в рабочей области / промежуточной области.
  • сброс и проверка могут работать с фиксациями или файлами, а возврат может работать только с фиксациями

Детали оформления заказа

# 恢复暂存区的指定文件到工作区
$ git checkout <filename>
# 恢复暂存区的所有文件到工作区
$ git checkout .

# 回滚到最近的一次提交
# 如果修改某些文件后,没有提交到暂存区,此时的回滚是回滚到上一次提交
# 如果是已经将修改的文件提交到仓库了,这时再用这个命令回滚无效
# 因为回滚到的是之前自己修改后提交的版本
$ git checkout HEAD 
$ git checkout HEAD -- filename
# 回滚到最近一次提交的上一个版本
$ git checkout HEAD^ 
# 回滚到最近一次提交的上2个版本
$ git checkout HEAD^^ 

# 切换分支,在这里也可以看做是回到项目「当前」状态的方式
$ git checkout <当前你正在使用的分支>
# 切换到某个指定的 commit 版本
$ git checkout <commit_id>
# 切换指定 tag 
$ git checkout <tag>
  • На обычных стадиях развитияHEADОбычно указывает на master или другую локальную ветку, но когда вы используетеgit checkout <commit id>При переключении на указанный коммитHEADОн больше не указывает на ветку — он указывает прямо на коммит, а HEAD будет в отсоединенном состоянии (свободном состоянии).
  • После перехода на коммит вы можете просматривать файлы, компилировать проект, запускать тесты и даже редактировать файлы, не беспокоясь о том, что это повлияет на текущее состояние проекта, все, что вы делаете, не будет сохраняться в репозиторий основного стека. Если вы хотите вернуться к основной ветке для продолжения разработки, используйтеgit checkout branchNameВозврат к исходному состоянию проекта (В это время вам будет предложено создать новую ветку, чтобы сохранить изменения прямо сейчас.).
  • Даже если вы переключитесь на коммит определенной версии, а после внесения в него изменений случайно коммитите в staging area, пока вы переключитесь обратно на ветку, вы все равно вернетесь к исходному состоянию проекта. (Примечание: ваши изменения, если они зафиксированы, будут сохранены в этой версии. После переключения веток вам будет предложено создать новую ветку, чтобы сохранить только что измененный контент. Если вы только что исправили ошибку, вы можете создать новую временную ветку в это время, а затем объединить ее с вашей собственной основной веткой локальной разработки, удалить временную ветку после слияния).
  • Как правило, я использую checkout, чтобы откатить версию, проверить исторический код и проверить, где ошибка.

image.png image.png image.png

Подробный сброс

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]: сбросить текущую ветку (reset) к указанному<commit>илиHEAD(по умолчанию, если не указано явно<commit>, по умолчаниюHEAD, последний коммит), и в соответствии с[mode]Можно обновить индекс и рабочий каталог.modeЗначение может бытьhard,soft,mixed,merged,keep.

# 从暂存区撤销特定文件,但不改变工作区。它会取消这个文件的暂存,而不覆盖任何更改
$ git reset <fileName>
# 重置暂存区最近的一次提交,但工作区的文件不变
$ git reset 
# 等价于 
$ git reset HEAD (默认)
# 重置暂存区与工作区,回退到最近一次提交的版本内容
$ git reset --hard 
# 重置暂存区与工作区,回退到最近一次提交的上一个版本
$ git reset --hard HEAD^ 

# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区,但工作区不变
$ git reset <commit>
# 等价于 
$ git reset --mixed  <commit>

# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),但保持暂存区和工作区不变
$ git reset --soft  <commit>
# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区、工作区
$ git reset --hard  <commit>
  • git resetЕсть много применений. Его можно использовать для удаления моментальных снимков фиксации, хотя обычно он используется для отмены изменений в промежуточных и рабочих областях. В любом случае его следует использовать только для локальных модификаций — вы никогда не должны сбрасывать моментальный снимок, которым поделились с другими разработчиками.
  • При откате на версию со сбросом, в следующий раз при git commit, перед следующей эта версия будет удалена как спам.
  • Когда мы откатимся к старой версии, а затем воспользуемся git log для просмотра записи фиксации, мы обнаружим, что предыдущая запись новой версии исчезла. Что, если на следующий день вы захотите вернуться к новой версии? Что делать, если не удается найти commit_id новой версии?

мы можем использоватьgit reflogПросмотрите команду history, чтобы увидеть commit_id предыдущей новой версии, а затемgit reset --hard commit_idВы можете вернуться к предыдущей новой версии кода

  • Хотя вы можете использовать git reflog для просмотра локальной истории, а затем вернуться к предыдущей новой версии кода, вы не можете получить свои команды истории на других компьютерах, поэтому этот метод небезопасен. В случае, если ваш компьютер внезапно сломается, в настоящее время нет возможности вернуться к будущей версии.

Подробное объяснение возврата

# 生成一个撤销最近的一次提交的新提交
$ git revert HEAD 
# 生成一个撤销最近一次提交的上一次提交的新提交
$ git revert HEAD^ 
# 生成一个撤销最近一次提交的上两次提交的新提交
$ git revert HEAD^^ 
# 生成一个撤销最近一次提交的上n次提交的新提交
$ git revert HEAD~num 

# 生成一个撤销指定提交版本的新提交
$ git revert <commit_id>
# 生成一个撤销指定提交版本的新提交,执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息
$ git revert <commit_id> --no-edit

git revertкоманда для использованияОтменить зафиксированный снимок (не то же самое, что сброс до определенной версии). Вместо того, чтобы удалять фиксацию из истории проекта, он добавляет новую фиксацию с отмененными изменениями в конец записи фиксации, что предотвращает потерю Git истории проекта.

revert следует использовать, когда вы хотите удалить фиксацию из истории проекта.. Например, если вы отслеживаете ошибку и обнаруживаете, что она была вызвана фиксацией, отмена будет полезна.

Revert разработан как безопасный способ отмены общедоступных коммитов, а reset предназначен для сброса локальных изменений.

Поскольку цель этих двух команд различна, их реализация различна: сброс полностью удаляет кучу изменений, а отмена сохраняет исходные изменения, используя новую фиксацию для реализации отмены.никогда не используйтеgit resetОткат коммитов, которые были отправлены в общедоступный репозиторий, применяется только к откату локальных изменений (никогда не фиксируется в общедоступном репозитории). Если вам нужно исправить публичный коммит, лучше использовать git revert.

После публикации коммита вы должны исходить из того, что от него будут зависеть другие разработчики. Удаление коммита, над которым продолжают работать другие члены команды, может вызвать серьезные проблемы при совместной работе. Когда они попытаются синхронизироваться с вашим репозиторием, они обнаружат, что часть истории проекта внезапно исчезла. После того, как вы добавили новые коммиты после сброса, Git будет думать, что ваша локальная история разветвилась из origin/master, и синхронизирует ваши репозитории с коммитами слияния, которые смущают ваших коллег.

cherry-pick

Применяет указанный коммит к текущей ветке(Можно использовать для отмены случайно отмененного (возврата/сброса) коммита)

$ git cherry-pick <commit_id>
$ git cherry-pick <commit_id> <commit_id>
$ git cherry-pick <commit_id>^..<commit_id>

git bisect

  • Быстро найти коммиты с ошибками
  • Его принцип очень прост, то есть история отправки кода постоянно сужается и позиционируется по методу дихотомии. Так называемая «дихотомия» состоит в том, чтобы разделить историю кода на две части, определить, находится ли проблема в первой или во второй половине, и продолжать выполнять этот процесс до тех пор, пока область не сузится до определенного представления кода.
# "终点"是最近的提交,"起点"是更久以前的提交
$ git bisect start [终点] [起点]
$ git bisect start HEAD commit_id

# 标识本次提交没有问题
$ git bisect good
# 标识本次提交(第76)有问题
$ git bisect bad

# 退出查错,回到最近一次的代码提交
$ git bisect reset

git подмодуль подмодуль

Есть ситуация, с которой мы часто сталкиваемся: рабочий проект должен включать и использовать другой проект. Это может быть сторонняя библиотека или разработанная вами независимо для использования в нескольких родительских проектах. Теперь возникает проблема: вы хотите рассматривать их как два отдельных проекта и в то же время хотите использовать другой в одном проекте. Если вы скопируете код из другого проекта в свой собственный, любые пользовательские изменения, которые вы вносите, затруднят слияние исходных изменений.Git решает эту проблему с помощью подмодулей, позволяя вам сделать один репозиторий Git подкаталогом другого репозитория Git. Это позволяет вам клонировать другой репозиторий в свой собственный проект, сохраняя при этом отдельные коммиты.

# 在主项目中添加子项目,URL 为子模块的路径,path 为该子模块存储的目录路径
git submodule add [URL] [Path]

# 克隆含有子项目的主项目
git clone [URL]
# 当你在克隆这样的项目时,默认会包含该子项目的目录,但该目录中还没有任何文件
# 初始化本地配置文件
git submodule init
# 从当前项目中抓取所有数据并检出父项目中列出的合适的提交
git submodule update
# 等价于 git submodule init && git submodule update
git submodule update --init

# 自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块
git clone --recurse-submodules [URL]

Два способа создать новый проект Git

1. Создайте новый проект Git локально, а затем свяжите удаленный репозиторий.

# 初始化一个Git仓库
$ git init 
# 关联远程仓库
$ git remote add <name> <git-repo-url>  
# 例如
$ git remote add origin https://github.com/xxxxxx

2.клонировать удаленный репозиторий

# 新建好远程仓库,然后 clone 到本地
$ git clone <git-repo-url>

# 将远程仓库下载到(当前 git bash 启动位置下面的)指定文件中,如果没有会自动生成
$ git clone <git-repo-url> <project-name>

Спецификация управления ветками Git

blog.CSDN.net/l Хитоми ноль/…

nuggets.capable/post/684490…

  • В реальной разработке по одной ветке на человека (Личное мнение: Если это не большой проект и в нем задействовано много разработчиков, то можно использовать фиче-ветку, иначе в общем проекте достаточно одного разработчика и одной ветки). Кроме того, должны быть ветки разработки, ветки тестирования и ветки релиза.
    • develop:отделение развития, ветка, в которой разработчикам нужно каждый день получать/коммитить последний код;
    • test:тестовая ветвь, после того как разработчик завершил разработку и прошел самотестирование, он будет выпущен в ветку тестовой среды;
    • release:предрелизная ветка, после прохождения теста тестовой среды опубликовать код тестовой ветки в ветке staging окружения (Это зависит от того, поддерживает ли ветка компании предрелизную среду, если нет, то вы не можете использовать эту ветку.);
    • master:онлайн-отделение, после того как предварительный тест среды будет пройден, операция/тест выпустит этот код ответвления в онлайн-среду;
  • Грубый процесс:
    • Каждый день разработчикам нужно тянуть/коммитить последний код дляразвивать филиал;
    • Разработчики завершают разработку, начинаютИнтеграционное тестирование, и отправить его натестовая ветвьИ опубликовать в тестовой среде, передать тестовому персоналу;
    • После прохождения тестовой среды она выпускаетсявыпускная ветвь, провести предварительный тест среды;
    • После прохождения предварительной версии среды опубликуйте восновная ветвьна и маркированы (тег);
    • Если в онлайн-ветке есть ошибка, в это время соответствующие разработчики должны опираться на предварительную ветку (Если промежуточной среды нет, используйте ветку master), создать новыйветвь ошибокИспользуется для временного решения багов, а после обработки подать заявку на слияние в пререлизную ветку. Преимущество этого заключается в том, что это не влияет на разрабатываемые функции.

Роль предрелизной среды:Предрелизная среда — это последний тест перед официальным релизом. Потому что в некоторых случаях, даже если пре-релиз пройден, нет гарантии, что официальная производственная среда может быть на 100% свободна от проблем; конфигурация и база данных пре-релизной среды такие же, как онлайн; -база данных релизной среды некоторых компаний подключена онлайн Среда, предварительная среда некоторых компаний представляет собой отдельную базу данных; если нет предварительной среды, если есть проблема с разработкой и объединенным кодом, проблема будет напрямую выпущен в Интернете, что увеличивает стоимость обслуживания.

Гит хуки

  • Git в основном стал программным обеспечением для управления версиями по умолчанию при разработке проектов.В проектах, использующих Git, мы можем настроить Git Hooks для проекта, чтобы помочь нам выполнить некоторую проверку кода и другую работу на различных этапах отправки кода.
  • Хуки хранятся в подкаталоге hooks каталога Git. То есть каталог .git/hook в большинстве проектов
  • крюкДелится на две категории: клиентская и серверная.
    • Хуки на стороне клиента в основном вызываются такими операциями, как коммиты и слияния.
    • А хуки на стороне сервера используются для сетевых операций, таких как получение отправленных сообщений.Здесь мы в основном представляем хуки на стороне клиента.

4.1 pre-commit

  • pre-commitЭто сделать что-то до того, как код будет отправлен, например, упаковку кода, обнаружение кода, называемое ловушкой (hook).
  • Выполнение функции (обратный вызов) перед фиксацией. После успешного выполнения этой функции продолжайте фиксацию, но блокируйте фиксацию после сбоя.
  • В разделе .git->hooks-> есть файл pre-commit.sample*, который является образцом функции (скрипта) по умолчанию.

4.2 Установка предварительной фиксации

npm install pre-commit --save-dev

4.3 Сценарий конфигурации

если не в.git->hooksсоздается в каталогеpre-commitфайл, вы должны создать его вручнуюnode ./node_modules/pre-commit/install.js

"scripts": {
    "build": "tsc",
    "eslint": "eslint src --ext .ts",
    "eslint:fix": "eslint src --ext .ts --fix"
  },
 //在提交代码之前,先执行 scripts 中的 eslint 命令 
  "pre-commit": [
    "eslint"
  ]

4.4 Пропустить предварительную фиксацию и продолжить отправку кода

# 跳过验证
$ git commit --no-verify
$ git commit -n

Еще крючки:git-triplegate.com/book/this/v2/…

Общая проблема

1. После вытягивания чужой удаленной ветки и слияния, git получит доступ к pull-записи.Если вы случайно удалили чужой загруженный файл, в это время бесполезно вытягивать чужую ветку, она покажет уже-up

В это время вы можете откатить код и вытащить его снова.

2. У меня уже был такой опыт: внешний, внутренний и клиентский коды хранятся в репозитории git, а новый каталог проекта создается в корневом каталоге. Затем вы можете использовать git для отправки кода непосредственно в свой собственный каталог проекта и настроить файл .gitignore в своем собственном каталоге проекта вместо настройки файла .gitignore в корневом каталоге, чтобы они не влияли друг на друга.

3. фатальный: отказ от слияния несвязанных историй

После git 2.9.2 невозможно объединить ветки без одной и той же ноды (ветки никогда не вытягивались и не сливались друг с другом с момента создания репозитория). Если вам нужно объединить ветки двух разных узлов, выполните следующие действия:

$ git pull origin branchName --allow-unrelated-histories
$ git merge branchName --allow-unrelated-histories

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

4. Возникла проблема при слиянии веток, и вы хотите отменить состояние слияния

error: merge is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

Когда возникает конфликт между удаленной и локальной ветвями, git сохраняет состояние слияния.Если вы не разрешите все конфликты, то git сохранит это состояние навсегда, и вы больше не сможете отправлять код. Коммиты могут продолжаться только после предварительного разделения состояния. Перед выполнением команды лучше сделать резервную копию, так как локальные изменения могут быть перезаписаны удаленной веткой.

# 解除合并状态
$ git merge --abort 

5. Случайно загрузил несколько файлов в удаленный репозиторий git/хотел удалить файлы в удаленном репозитории

# 删除暂存区和工作区的文件
$ git rm filename  
# 只删除暂存区的文件,不会删除工作区的文件
$ git rm --cached filename 

Если вы загружаете файл в удаленный репозиторий перед настройкой файла .gitignore и хотите удалить файл в удаленном репозитории в это время, бесполезно настраивать файл .gitignore в это время, поскольку файл отслеживается. , но я не хочу удалять файл локально, а затем повторно отправлять его на удаленный склад. В настоящее время я могу использоватьgit rm --cached filenameКоманда отменяет отслеживание файла, так что при следующей отправке git не отправит файл снова, поэтому файл в удаленном хранилище также будет удален.

6. Загрузите вновь созданный проект локально во вновь созданный удаленный склад.

Никаких ассоциаций я раньше не делал, то есть не клонировал удаленный проект на локальный для запуска проекта, а создал локально новый проект, а потом хочу загрузить его на удаленный склад.

# 将本地仓库和远程仓库关联起来
$ git remote add origin 远程仓库地址
# 将本地的 master 分支推送到 origin 主机,同时指定 origin 为默认主机
$ git push -u origin master
# 上面的命名执行后,下次再从本地库上传内容的时候只需下面这样就可以了
$ git push

7. Указатель HEAD может указывать либо на ветку (по умолчанию указывает на текущую ветку), либо на снимок, когда он указывает на снимок, состояние указателя называется отключенным.

8. Принцип создания и объединения веток

Ляо Сюэфэн.com/wiki/896043…

9. Введите имя пользователя и пароль для каждого git push

  • шаг 1: Генерация открытого ключа
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"  
# Generating public/private rsa key pair...
# 三次回车即可生成 ssh key
  • шаг 2: просмотрите сгенерированный открытый ключ
cat ~/.ssh/id_rsa.pub
  • Шаг 3: Скопируйте сгенерированный открытый ключ и добавьте его на сервер git.

image.png

Проверьте, может ли ssh успешно подключиться

$ ssh -T git@github.com
  • Шаг 4: Используйте протокол ssh для клонирования удаленного хранилища или, если вы уже клонировали локальное хранилище с протоколом https, перезагрузите удаленное хранилище.

image.png

Используйте ssh-протокол

$ git remote set-url origin git@xxx.com:xxx/xxx.git
  • Шаг 5: Создайте файл для хранения имени пользователя и пароля

Обычно это C:\users\Administrator, или это может быть созданный вами системный каталог с именем пользователя, а имя файла .git-credentials. Поскольку прямое создание файла, начинающегося с «.», в Windows запрещено, для создания файла используется командная строка.

$ touch .git-credentials
$ echo "http://{username}:{password}@github.com" >> ~/.git-credentials 
$ git config --global credential.helper store

10. Git не позволяет фиксировать пустые папки

Вы можете добавить файл .gitkeep в текущий каталог

11. Иногда копируются файлы, используйтеgit add .Отслеживание файлов невозможно, вы можете использоватьgit add -A, то есть перед каждым представлениемgit statusпричина

12.Настройте несколько учетных записей git на одном компьютере

GitHub.com/jawIL/notes…

13. Кажется, в этом репозитории запущен другой процесс git, например.

image.png

Причина в том, что во время использования Git зависал, а некоторые заблокированные ресурсы не освобождались.

решение:Перейдите к файлу .git в папке проекта (показать скрытые папки илиrm .git/index.lock) Удалить файлы index.lock.

14. git commit -am "xxx" иногда дает сбой и не может отправить все изменения

git commit -am "xxx"будет толькоtrackedДобавьте файл в промежуточную область и зафиксируйте, а также добавьте файл в управление git с помощью команды git add, новый файлtracked. (После создания нового файла idea предложит вам добавить его в управление git. После выбора «запомнить» idea сохранит вновь созданный файл по умолчанию.trackedизменять)

15, роль git merge --no-ff

  • Отключите ускоренное слияние, которое создаст новую фиксацию.

image.png

Из объединенного кода результат тот же, разница в том, что--no-ffзаставит git сгенерировать новый объект фиксации. Зачем это делать? Обычно мы используем master в качестве основной ветки, в которой хранится относительно стабильный код, и частота отправки очень низкая, а функция используется для разработки функций, будет много фрагментарных представлений, а ускоренное слияние отправит отправку функций. История смешанная. в мастер, возиться с историей коммитов мастера. Итак, если вас вообще не волнует история коммитов, и вам все равно, чистый ли мастер, то--no-ffНе очень полезно.

сегмент fault.com/please/101000000…

16. Разница между git merge и git rebase

nuggets.capable/post/684490…

blog.CSDN.net/Лю Сяохэн…

сегмент fault.com/ah/119000001…

сегмент fault.com/ah/119000001…

17. git log не может нормально отображать китайский язык

# 试试
$ git -c core.pager=more log
# 如果可以显示中文的话,把 pager 设置为 more
$ git config --global core.pager more

Ууху. Call.com/question/57…

woohoo.play pi.org/2019031901. …

18. Дополнительную информацию можно добавить, когда git merge -m "xxx"

  • По умолчанию используется имя ветки слияния.

image.png

19. git pull вытянет код всех удаленных веток на локальный зеркальный склад

Когда вы хотите объединить чужую ветку:

  • Если у вас уже есть чужая ветка в вашем локальном репозитории (прямое переключение на чужую ветку приведет к созданию чужой ветки локально), вы можете использовать команду merge branchname;
  • Если в вашем локальном репозитории нет чужой ветки, то для слияния вам нужно использовать merge origin/branchname

image.png

20. git branch -r/-a/-l проверяет все ветки на локальном зеркальном складе.Если локальный зеркальный склад не тянет код удаленного склада, значит кто-то другой отправил новую ветку на удаленный склад.I не вижу эту недавно нажатую ветку

21. git stash хранит неотслеживаемые файлы

  • Если мы создаем новый файл, но он не работаетgit add .файл трассировки, затемgit stashне может быть сохранен
$ git stash -u

22. Как пиарить проект на github

сегмент fault.com/ah/119000002…

23. git push не может отправить код

Возможные ошибки:

  • remote: Permission to xxxxx.git denied to xxx. fatal: unable to access 'github.com/ xxxxx.git/': The requested URL returned error: 403

  • remote: You do not have permission to push to the repository via HTTPS

    fatal: Authentication failed for 'gitee.com/xxx.git/'

# 查看当前项目的 git 配置
$ cat .git/config
  • URL-адрес хранилища, чтобы увидеть, используются ли локальные настройки проекта .git / config и использовать тот же адрес ссылки github.git pushСуществует два способа протокола данных:sshа такжеhttps. Если это несовместимо, вам нужно переключитьurlадрес.

image.png

24. Git вводит неправильное имя пользователя и пароль, и последующие операции git продолжают сообщать об ошибках.

remote: Coding 提示: Authentication failed.
remote: 认证失败,请确认您输入了正确的账号密码。
fatal: Authentication failed for 'https://e.coding.net/xxx.git/'

Найдите Credential Manager на панели управления, выберите «Учетные данные Windows», найдите учетные данные git, нажмите «Изменить» и введите правильное имя пользователя и пароль для используемого вами github.

image.png

25, LINT-постановка не удалась

image.png

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

26. Просмотрите каталог установки git

  • Мак:Введите в командной строкеwhich git, он покажет место установки git
  • Окна:Откройте cmd и введитеwhere gitон покажет путь установки Git

27.Открывайте, изменяйте и сохраняйте файлы с помощью vim в Git

28.windows10 не может редактировать vimrc

29.Windows под Git Bash Vim Открыть файл китайский искаженный

30. Как изменить сообщение старого коммита/как объединить несколько коммитов в один коммит/как объединить несколько интервальных коммитов в один коммит/

git rebase -i

31. Если два человека изменяют файл, один должен переименовать файл, а другой изменить содержимое файла, возникнет ли конфликт? git достаточно умен, чтобы автоматически объединять эти изменения

Если два человека переименуют один и тот же файл, возникнет конфликт, git не обработает его автоматически, и разработчик должен решить конфликт самостоятельно.

32. git revert failed: ошибка: фиксация ошибочного слияния - это слияние, но опция -m не указана, ошибка: опция `mainline' ожидает число больше нуля

сегмент fault.com/ah/119000001…

ву ву

git revert -m 1 

33.git создает пустую ветку

Для создания ветки в Git должен быть родительский узел, то есть на существующей ветке должна быть создана новая ветка. отделение в это время. Но иногда необходимо создать пустую ветку.

$ git checkout --orphan emptyBranchName

Эта команда генерируетemptybranch, который содержит все файлы родительской ветки. Но новая ветка не указывает ни на какой предыдущий коммит, то есть у нее нет истории, и если вы фиксируете текущий контент, то этот коммит является первым коммитом в этой ветке.

Если вы хотите пустую ветку, вам нужно удалить весь текущий контент, используйте команду git

$ git rm -rf . // 注意:最后的‘.’不能少。

34. Как очистить все коммиты ветки

Сначала удалите ветку, а затем создайте пустую ветку (имя ветки - это имя удаленной ветки)~~

35.Как быстро найти коммиты с ошибками

Рекомендуемое чтение

Вы действительно понимаете жизненный цикл React?

Подробные хуки React [почти 1W слов] + бой проекта

Подробный React SSR [почти 1W слов] + 2 актуальных проекта

Cookie, Session, Token, JWT, которые невозможно отличить по глупости

TS Часто задаваемые вопросы (более 60, постоянно обновляются)

Ссылаться на

Git Book

Pro Git (китайская версия)

git-recipes

Как изящно использовать Git

Как использовать разработку подмодулей Git в больших проектах

Вызов API Github (v3)

woohoo.brief.com/afraid/ah 0 из 7-х 0482…

developer.GitHub.com/V3/guides/…