Когда я впервые получил высшее образование, я использовал SVN в течение очень короткого времени, и с тех пор я использую Git для контроля версий кода. Около 4 лет я сделал некоторые записи и опыт в процессе использования Git. Поделитесь этим с вами здесь , возможно, вы сможете почерпнуть из него кое-что полезное.
Будь то github, gitlab или другие платформы для размещения кода, управление кодом осуществляется с помощью git. Можно сказать, что git является обязательным навыком для программиста, и он очень полезен для работы и собеседований.
- Git общие команды
- Некоторые приемы изящного использования Git
- общие команды oh-my-zsh
Git общие команды
- git клонируйте репозиторий удаленной ветки:
git clone -b 分支名称 远程地址
Когда git клонирует проект удаленного репозитория без указания ветки, будет клонировано только содержимое ветки по умолчанию.
- Просмотр имени пользователя и электронной почты git
git config user.name
git config user.email
- Связанные с филиалом
git branch(查看当前分支)
git branch -a(查看所有分支)
git checkout 分支名(切换到对应分支) 会自动将代码更新为分支代码
git branch 分支名(创建一个分支)
git branch -d 分支名(删除一个分支)
git branch -D 分支名(强制删除一个未合并的分支)
git checkout -b 分支名 [基于的分支名或commit值](切换分支并直接切换过去)
- Посмотреть историю Git
history
- Поиск истории git по ключевому слову
history | grep push
- Посмотреть историю коммитов
git log
git log --summary
- Настройки учетной записи Git
git config --global user.name "foo"
git config --global user.email foo@gmail.com"
git config user.name "foo"
git config user.email "foo@gmail.com"
- Просмотр git-аккаунта
git config --global --list
git config --local --list
- Только просмотр конфигурации определенного элемента
git config --local user.name
- отменить это изменение
git reset HEAD foo.js
git checkout -- foo.js
- Посмотреть измененный код
git diff
git diff HEAD
git diff --staged
- После отправки я обнаружил, что несколько файлов были потеряны и не отправлены
发现丢了修改记录,重新添加
git add "*.html"
重新提交,最终只有一个提交
git commit --amend
- Файлы кеша с определенным суффиксом
git add "*.js"
- Очистить файлы в кэше
git reset octofamily/octodog.txt
- Полностью удалить файлы с определенным суффиксом
git rm "*.txt"
- объединить ветку с мастером
git merge 分支名
- добавьте ., чтобы разблокировать некоторые файлы перед
git checkout -- <filename>
- Скрыть код в грязном каталоге (применимо к другим участникам, которые изменили тот же код ветки, но не хотят фиксировать)
git stash
- Бесплатный грязный код каталога
git stash pop
- Освободить указанный грязный код каталога
git stash pop stash@{0}
- Удалить удаленные ветки (эта ветка не должна быть веткой по умолчанию)
git push origin --delete branchname
- Был зафиксирован, вынужден откатиться на старую версию
git log//找到commit hash值
git reset --hard hash值
- Просмотр каталога тайника
git stash list
- удалить тайник
git stash drop stash@{0}
- Установить адрес удаленного склада
git remote set-url origin git@foo.bar.com:baz/helloworld.git
- Новая ветвь была создана локально, а orgin — нет, перед отправкой кода
git push --set-upstream origin preproduction
- Укажите тег для удаленного
git push origin <tag_name>
- Нажмите все теги на удаленный
git push --tags
- Просмотр текущих тегов
git tag --list
- Простое удаление индекса не приводит к удалению файла .idea в рабочем дереве.
git rm --cached -r .idea
// --cached удаляет только индекс, -r (рекурсивный) рекурсивно удаляет все файлы в каталоге .idea
- Git активно отслеживает файлы, контролирует файлы и готовится к отправке.
git add <file(s)>/.
- файлы git unstage, файлы выпуска, выборочное управление
git reset HEAD <file(s)>/.
- Как файлы промежуточной области перезаписывают файлы рабочего каталога
git reset HEAD <file(s)>/. && git checkout -- <file(s)>/.
- Отправьте все файлы, которыми управлял git и которые были изменены красным цветом.
git add -u
- Сбросить все файлы в рабочей области и промежуточной области до их исходного состояния.
git reset --hard
- Сравните разницу между текущей веткой и фиксацией
git diff HEAD [commit hash fragment]
- удалить ветку
git branch -D [branch name]
- После синхронизации с удаленным сервером объедините несколько коммитов в один
git rebase -i HEAD~2/hash
pick && squash
:wq!
- Посмотреть адрес происхождения представителя проекта
git remote -v
- уволиться по ошибке
git rebase --abort
- Не синхронизировано с удаленным, повторите отправку
reset soft
- выпуск gitflow выпускает новую версию
git flow release start v0.5.0
npm version minor
git flow release finish -n
git push
git checkout master
git push
- Исправление gitflow для исправления ошибки на мастере
git flow hotfix start foo
npm version patch // 注意:一定要在修复bug代码之前新增版本号
git add .
git commit -m "version change message"
git flow hotfix finish -n
git push
git checkout master
git push
- Сравните логи 2-х веток
git log develop..master
- Объединить мастер-код в функцию
git checkout feature
git merge master
git merge master feature
- Что делать, если git rebase конфликтует
resolve conficts
git add .
git rebase --continue
- Как сжать несколько коммитов в один?
Предположим, функция слияния с мастером.
git checkout master
git merge --squash feature
git commit -m "这是一次squash commit"
git push
- Просмотр родительской ветки текущей ветки
git reflog show <childBranch>
32c3956 (HEAD -> currentBranch, origin/fatherBranch, fatherBranch, list) childBranch@{0}: branch: Created from fatherBranch
childBranch — ваша новая ветка. FatherBranch — его родительская ветвь, которая является исходной ветвью.
- Отменить фиксацию ошибки удаленной ветки
...reset
git push --force
На самом деле используйте коммиты из локальной ветки вместо удаленной ветки.
- Как по ошибке восстановить локальную ветку ведущего удаленного?
git reflog // 找出最新的commit sha1值,HEAD@{1}比HEAD@{2}新
git branch branchName <sha1>
Найдите коммит через git reflog, а затем выберите его.
- Удалите теги, добавленные патчем версии npm/minor/major по ошибке
git tag | grep v1.1.38
git tag -d v1.1.38
git push origin :refs/tags/v1.1.38
- Разница между git fetch и git pull
git fetch 更新origin/*下的所有分支,在发布git flow feature前很有用,用于更新remote分支。
git pull 主要用来更新多人合作的当前分支,多用于更新local分支。
// https://www.git-tower.com/learn/git/faq/difference-between-git-fetch-git-pull
- Удаленная ветка удалена, а локальную git fetch нельзя обновить до последней ветки.
git fetch --prune
--prune什么意思?
Before fetching, remove any remote-tracking references that no longer exist on the remote.
- Своевременно проверяйте состояние всех локальных филиалов
git remote show origin
- Что делать, если эта ветка больше не существует на удаленном компьютере и git fetch --prune не может обновить статус?
git push origin --delete feature/fix-chat-unread-msg-async
- Удалить одну отсоединенную удаленную ветку
git remote prune <name>
- Отменить слияние (слияние)
git merge --abort
- Откатить фиксацию
git revert Head/[commit hash]
Некоторые приемы изящного использования Git
- gitbash под окнами поддерживает китайский ввод:
1)鼠标左键点击左上角git的logo
2)找到options并且切换到text目录,将Character set设置为UTF-8
- сгенерировать ssh-ключ
ssh-keygen -t rsa -C "gaokai20100801@qq.com"
- ssh-ключ просмотра окон
/c/Users/frank/.ssh/id_rsa.pub
- mac/linux просмотр ssh-ключ
cd ~/.ssh
ls
cat id_rsa.pub
- git flow
Daniel Cool MM и .GitHub.IO/git-flow-eat…
- Я удалил тайник по ошибке, что мне делать?
git fsck --unreachable |
grep commit | cut -d\ -f3 |
xargs git log --merges --no-walk --grep=WIP
Найдите соответствующее хэш-значение коммита
git stash apply 1f55da93d26cd51f15f9e93351dae6b75e25e36f
- Модификация .idea всегда будет напоминать, .gitignore не вступает в силу
.idea/
git rm -r --cached .idea
- Что такое origin в Git?
origin — это переменная, представляющая адрес репозитория git. можно использоватьgit remote -v
Просмотрите адрес, представленный источником.
- Что означают системные, глобальные и локальные параметры Git?
--system可以输出很多git的系统设置,其中最有用的是alias,例如git s代表了git status,系统所有登录用户有用。
--global输出了git的全局设置,主要包括全局的user.name和user.email,优先级低于单个仓库中设置的user.name和user.email,当前用户所有仓库有用。
--local输出了git的项目设置,主要包括remote.origin.url以及gitflow的很多配置,只对某个仓库有用。
- Разница между рабочим пространством Git и промежуточной областью?
add commit
工作目录---->暂存区---->版本历史
暂存区:git已经获得了对文件的管理权限,暂存区文件有状态:new file,deleted,modified等等。
版本历史:git log查看每一次commit记录。
意外收获:
若是想非常细粒度的控制commit记录,可以使用git add 指定文件,分开多次commit,每一次commit提交一个细粒度功能的变更文件集合,多次走文件目录 暂存区 版本历史这个流程。
- Как Git переименовывает файлы?
git mv README.md readme.md
- Что означает рабочее дерево и индекс Git?
index指的是git索引,可以理解成git有文件的一个复制,仅删除index则仅删除存在于git中的文件。
working tree则是指操作系统的工作树,也就是操作系统的磁盘上存储的文件。
举两个常用的例子:
1. 仅删除git index中的文件,.idea等IDE隐藏的工作树文件是不能删除的:**--cached**
git rm --cached -r .idea // **--cached仅仅删除index**,-r(recursive)递归删除.idea目录下的所有文件
2. 删除index和working tree上的文件,恩断义绝
git rm 删除index上和working tree上的文件,
仅仅删除working tree不删除index的情况,不存在。
- ничего не коммитить и рабочее дерево почистить?
暂存区没有可以提交到版本历史的内容。
工作区也是干净的。
- Как с первого взгляда отличить рабочую зону от промежуточной?
- Your branch is ahead of 'origin/master' by 1 commitИстория версий
- Changes to be committedкеш хранения
- Untracked filesРабочее пространство
// 版本历史
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
// 暂存区
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: readme.md -> README.md
new file: helloman
// 工作区
Untracked files:
(use "git add <file>..." to include in what will be committed)
hi
- Как более элегантно просматривать логи?
git log --oneline 简洁的commit记录
git log -n2 --oneline 最近的2次简洁的commit记录
git log --all 所有分支的历史版本信息
git log --graph 图形化查看版本演进历史
git log --oneline --all -n4 --graph 组合查看日志
- Как быстро найти командную документацию git?
git help --web log
вид в браузереgit log
Применение
- А как насчет графического интерфейса, который поставляется с git?
gitk
Нет необходимости устанавливать сторонние плагины, и он доступен в чистой командной строке без стороннего программного обеспечения.
- Отличаются ли автор и коммиттер в git?
Автор является генератором кода, для защиты авторских прав.
- Таинственный каталог .git
HEAD 工作分支refs/heads/foo
config repo的配置信息
refs heads,分支;tags,标签或者里程碑
refs/heads/master 存放了什么,最新的一个commit
refs/tags/js01 存放了什么,最新的一个tag,包含一个object
objects 文件夹,2个字符的和松散的pack文件夹,存放的是tree,tree下有blob文件
Вы можете изменить HEAD, конфигурацию и другую информацию непосредственно через vim, что аналогично команде.
- Как узнать тип файла git?
git cat-file -t/-p [hash fragment]
// -t тип, -p содержимое
Пока содержимое любого файла одинаково, в глазах git это единственный большой двоичный объект.
commit
tree // 位于objects目录下
blob // 位于objects目录的二级目录下,具体的文件
- Разница между деревом, коммитом, блобом?
commit:一个commit肯定会对应一棵树,包含了根tree,author,committer,parent等等一个commit对象的信息。
tree:取出一个commit,存放了一个快照,这个快照,对应了当前项目的所有的文件夹及其文件的快照,是特定时间的整个仓库的一个状态;树里可以有blob,也可以有树,因为树是文件夹;根树是最大的树。
blob: 与文件名是否相同无关,只要内容相同,就是唯一的blob。
- Что содержит коммит?
git cat-file -p [commit hash fragment]
Содержит дерево, родителя, автора и коммитера.
tree f06f7f36af17cb9098031c66d22a7910c0fa1bac
parent 92a55c8a5b1d38d224232ad84b9b728ae77189cb
parent eda632a1f2a3ea049c5f5268f6b2f064b71898ce
author FrankKai <gaokai20100801@gmail.com> 1548139120 +0800
committer FrankKai <gaokai20100801@gmail.com> 1548139120 +0800
Merge branch 'feature/chatBreakChange' into prerelease
# Conflicts:
# src/api/chat.js
- Что содержит дерево?
git cat-file -p [tree hash fragment]
Содержит дерево, блоб.
100644 blob 015aaf344153ed7822069b2a98898b7d7a215b0d .babelrc
100644 blob 9d08a1a828a3bd2d60de3952744df29f9add27fa .editorconfig
100644 blob 080140b833db5b758b1eb869a269f4bbb068a19e .eslintignore
100644 blob 8f777c376c0314e480f9bbba273d4902810bcb11 .eslintrc.js
100644 blob 895e844218637929546ed2295ae90f991ceb5d38 .gitignore
100644 blob db7b635d23657349dbe4c33cc353ef4efd8ca960 .npmrc
100644 blob 797e871f4b8c0a3071e8b6ab2cc40b804cd2971c .postcssrc.js
100644 blob d3983c1d6a5525aae58b823448723434ca83ceed .prettierrc
100644 blob 93cc7473ab066204f3329221111a945e2dc83576 BUS.md
100644 blob defc3d9914d1af08e6670b96995261bfe1fb61a6 CHANGELOG.md
100644 blob bfd46fd4008cbe7103181fc5cd64392a74426e96 MQTT.md
100644 blob abdb55935d833dd4f4b79475aa7d63ffcb0cc9cd README.md
040000 tree f1f80f844bb80389826198a15ec0f224a53525f8 build
100644 blob 2aefa3130f4ff753b5c3e538db53b9b186f12540 index.html
100644 blob 967b8f243420a9a8a07b8f429f0a7ba874a834ad package-lock.json
100644 blob 35d9fa46f569395b25a87daef4820de42d071831 package.json
040000 tree f6bdc675a8f9af805867b5a19c263e5bbfe4c26c src
040000 tree 09e231414b91779326447a0c8d5b3421aa2308c2 static
040000 tree ad94369cfdd2038a552e44fc0abbd1738113b5e6 test
100644 blob 0b96f21c27a3759cecde02fba1e050d86a8e9a54 yarn.lock
- Что содержит блоб?
git cat-file -p [tree hash fragment]
就是一个具体的文件。
- Что такое отсоединенная ГОЛОВА?
分离头指针。
`git checkout [commit hash fragment]`,切换到分离头指针状态,不与任何branch或tag关联,git会认为这是不重要的,当成垃圾清理掉。
缺点:切换分支后,需要用`git branch [branch name] [commit hash fragment]`新建一个分支,否则会丢失原消息。
优点:可以基于某一次commit切出分支,然后新建一个commit,快速会退到想要的版本。
- На что может указывать HEAD?
它位于.git/HEAD。
可以指向分支或者commit,**但其实分支归根结底还是指向了commit**。
git log 查看HEAD指针指向的分支名:`(HEAD->foo, bar, master)`
可以快速diff,`git diff HEAD [commit hash fragment]`。
父亲的父亲diff:`git diff HEAD HEAD~2`,`git diff HEAD HEAD^^`。
- Как изменить сообщение о последнем коммите?
git commit --amend
Примечание. Такие изменения нельзя вносить в интеграционную ветку команды, только локально.
- Как изменить сообщение старого коммита?
git rebase -i [父 commit hash fragment]
reward
添加修改后的commit message
注意:不能在团队的集成分支上,做这样的变更,仅适用于本地。
- Что еще может сделать git stash pop stash@{n}?
当前分支的本地代码未提交的情况下,pull了领先的远程分支代码,此时远程代码会覆盖本地代码。
git比较聪明,它不会完全将本地的代码扔掉,即使没有人为的生成一次commit记录,也会自动为我们在stash下生成一次记录,以免造成重大的代码丢失。
- Как стандартизировать выпуск версии в режиме gitflow?
Обновление номера версии | соответствующий gitflow |
---|---|
bug -> patch | hotfix |
feature->minor | release |
Рефакторинг системы->основной | release |
Однако в случае схватки итерация происходит очень быстро.Если все фичи обновить до минора, то минорного числа будет очень много.Как поступить в этой ситуации?
Когда обновляется только второстепенный, в информацию о коммите добавьте следующую информацию:
Типы | Отправить информацию |
---|---|
bug patch | [bug patch] |
feature patch | [feature patch |
- Создайте новый проект и загрузите в git
git init
git ac
git remote add origin remote repository URL
-
Что такое параметр git --decorate?
- Есть короткие, полные, автоматические, без значений, --decorate=short
- Распечатайте имя ссылки коммита.
- Если коротко, префикс имени ссылки refs/head, refs/tags/ и refs/remotes не будет напечатан.
- При заполнении будет напечатан полный префикс
- При авто, если вывод является терминалом, он будет напечатан как короткий; нетерминал будет отображать все
- Когда NO, HEAD и TAG и т. д. будут скрывать информацию.
- По умолчанию Короткий
-
Что такое черри пик?
- Очистить все локальные кеши git
git rm -r --cache .
- error Command "husky-run" not found
rm -rf .git/hooks/
- Полный процесс перебазирования
1. git checkout feature
2. git rebase master
3. resolve conflicts
4. git add .
5. git rebase --continue
- Разница между git revert и git reset
git revert 生成一个新的commit的方式回滚到上一个或者指定commit版本的代码,原理是Head继续前进。有存在被回滚掉的commit分支代码合并过来时,代码正常被合并
git reset 删除某个commit之后的代码,原理是Head向后退。有存在被回滚掉的commit分支代码合并过来时,被reset掉的代码仍然会合并上来
общие команды oh-my-zsh
Все письменные аббревиатура
Сокращенное название | написать все |
---|---|
gst | git status |
gaa | git add . |
gcmsg "" | git commit -m "" |
gp | git push |
glog | git log --oneline --decorate --graph |
gl | git pull |
gf | git fetch |
gfa | git fetch --all --prune |
Используйте маленькие хитрости
- Как изменить параметры команды по умолчанию.Например,декорирование glog по умолчанию короткое.Я хочу указать,чтобы декорировать glog было нет.Что мне делать?
glog --decorate=no
Будем рады общению с вами и совместному прогрессу:
- Публичный аккаунт WeChat: Dada Front-end/excellent_developers
- Блог на гитхабе:личный блог 233, пока ты еще молод
- Столбец SegmentFault:Будь хорошим фронтенд-инженером, пока ты еще молод
Стремитесь стать отличным front-end инженером!