夜听城嚣 夜听城嚣
首页
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 前端基建与架构
  • 专题分享

    • Git入门与开发
    • 前端面试题汇总
    • HTML和CSS知识点
  • 项目实践
  • 抓包工具
  • 知识管理
  • 工程部署
  • 团队规范
bug知多少
  • 少年歌行
  • 青年随笔
  • 文海泛舟
  • 此事躬行

    • 项目各工种是如何协作的
    • TBA课程学习
收藏

dwfrost

前端界的小学生
首页
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 前端基建与架构
  • 专题分享

    • Git入门与开发
    • 前端面试题汇总
    • HTML和CSS知识点
  • 项目实践
  • 抓包工具
  • 知识管理
  • 工程部署
  • 团队规范
bug知多少
  • 少年歌行
  • 青年随笔
  • 文海泛舟
  • 此事躬行

    • 项目各工种是如何协作的
    • TBA课程学习
收藏
  • 读书笔记

  • 专题分享

    • Git入门与开发
      • 安装
        • 创建版本库
        • 版本管理
        • 关联远程仓库
        • 分支管理
        • 标签管理
        • 添加 SSH
      • 概念
        • 工作区
        • 暂存区
      • 配置
        • .gitignore
        • 如何让系统记住密码(https 方式)
        • 如何删除系统密码
        • 配置别名
        • 配置用户名和邮箱
        • 多人协作
        • 提交规范
      • 高级用法
        • cherry-pick
        • 删除某一次提交
    • 前端面试题汇总
    • HTML和CSS知识点
    • 前端路由原理及实践
    • 性能优化之虚拟列表
    • mysql教程
    • python项目实践
    • 图片懒加载原理
    • WallectConnect开发心得
    • 企微机器人
  • 项目实践

  • 框架应用

  • 前端一览
  • 专题分享
frost
2018-10-26

Git入门与开发

梳理 git 知识,熟悉 git 安装,常见指令,操作等

参考廖雪峰的教程

廖雪峰 git 教程 (opens new window)

# 安装

git 官网 (opens new window)

##命令

# 创建版本库

git init 创建仓库

git add file 添加到 git 中(放入暂存区)

git add . 一次性全部添加到暂存区

git commit -m 'commit description' 提交修改好的文件到本地

git log 打印提交日志

git log —oneline 打印提交日志的简写版

git diff --name-only HEAD~1 查看最近一次提交修改的文件

# 版本管理

git reset —hard HEAD^ 回滚到上一个版本(HEAD 代表当前版本,HEAD^代表上一个版本,HEAD^^代表上两个版本,依次类推)

git reflog 查看用户所有的提交记录

git reset —hard 1231234(提交id)回滚到 1231234 的提交版本

git checkout — file.txt 放弃工作区中对 file 文件的修改,不论暂存区是否有该文件的修改记录,即该命令不会放弃暂存区的修改,只放弃工作区的修改

git reset HEAD file.txt 放弃暂存区的内容(即放弃上一次 add 的内容),退回到工作区,此时的工作区并不是最新版本,而是在最新版本的基础上用户修改过的内容

# 关联远程仓库

git remote set-url origin xxx 直接切换远程仓库

已 github 为例,假设有两种情况:

1.本地已有 git 仓库或项目文件,想在 github 进行关联

  • 在 github 新建项目,不要勾选Initialize this repository with a README,默认创建即可

  • 关联 github,在本地仓库终端输入git remote add origin git@github.com:dwfrost/GitStudy.git

  • 推送内容到 github git push -u origin master

    2.本地是空文件,想从已有的 github 项目克隆

  • 打开 github 项目,复制 SSH

  • 在本地仓库终端输入git clone git@github.com:dwfrost/GitStudy.git

  • 如果是加入已有的项目,需要检出目标分支到本地,以便推送时本地分支和远程分支同名

git remote rm origin 删除已关联的远程仓库

git remote -v 查看关联的远程仓库

一个本地库可以同时关联 github 和码云:

git remote add github git@github.com:dwfrost/GitStudy.git

git remote add gitee git@gitee.com:dwfrost/GitStudy.git

然后分别推送

git push github dev

git push gitee dev

  • 踩坑记录 1:

遇到报错: fatal: refusing to merge unrelated histories

是因为两个仓库差异太大,git 认为不应该合并。

解决如下,添加一行参数--allow-unrelated-histories即可。

git pull origin master --allow-unrelated-histories

# 分支管理

git branch 查看当前所在的分支

git rev-parse --abbrev-ref HEAD 仅查看当前分支

git branch --show-current 仅查看当前分支(git2.22+)

仅查看当前分支 (opens new window)

# 创建

git branch dev 创建 dev 分支

# 切换

git checkout dev 切到 dev 分支

git checkout -b dev 创建并切换到 dev 分支

git checkout -b dev origin/dev 拉取远程 dev 分支并创建本地 dev 分支,建立映射关系

# 合并

git merge dev 将 dev 分支合并到当前分支

# 撤销有冲突的合并

git reset --merge 不论是否有冲突,都会撤销 merge 后的操作,但其他非 merge 的改动不会受影响

# 删除

git branch -d dev 删除 dev 分支(合并后才能删除,且当前分支不能为 dev)

git branch -D dev 没有合并时,强制删除 dev 分支

# 暂存

git stash 将修改内容(stash)移到贮藏区 git stash pop 还原并删除最新的暂存

git stash list 查看贮藏区的内容(stash)

恢复贮藏区有 2 种办法:

1.git stash apply恢复贮藏区,但贮藏区依旧保留修改内容(stash),如果想删除,使用git stash drop

2.git stash pop恢复贮藏区的同时删除修改内容(stash)

# 推送

git push origin dev 将 dev 分支推送到远程仓库(origin)的 dev 分支上

# 标签管理

git tag v1.0 新建标签

git tag 查看标签

git show v1.0 查看标签信息

git tag v0.9 7ff4f56 给某次提交打上标签

git tag -a v0.9 -m "version 0.9 released" 7ff4f56 -a后面是标签名,-m后面是标签说明

git tag -d v1.0删除标签

git push origin v1.0 推送标签到远程

git push origin --tags 一次性推送全部标签

git push origin :refs/tags/v1.0 删除远程标签(要先删本地)

# 添加 SSH

常见的远程仓库有 github,码云等,为了方便本地和远程提交代码,需要配置 SSH 加密,如下:

1.创建 SSH key。

1.1 创建前,看一下有没有 SSH。

cat ~/.ssh/id\_rsa.pub

如果返回一长串以 ssh-rsa 或 ssh-dsa 开头的字符串, 说明已存在本地公钥,你可以跳过以下 ssh-keygen 的步骤。

1.2 如果查询不到本地公钥,你可以按如下命令来生成 SSH 密钥 :

ssh-keygen -t rsa -C "<您的邮箱>"

一路回车,创建成功。

可以通过下面命令查看公钥。

cat ~/.ssh/id\_rsa.pub

2.添加公钥

id_rsa:密钥是用户保管的

id_rsa.pub:公钥是放在远程仓库,用于和密钥配对使用。

复制id_rsa.pub文件中的内容,打开 github/gitee 等代码托管网站,在账户管理选项中添加 SSH key。

使用系统剪切板复制公钥

Windows:

clip < ~/.ssh/id_rsa.pub
1

Mac:

pbcopy < ~/.ssh/id_rsa.pub
1

GNU/Linux (requires xclip):

xclip -sel clip < ~/.ssh/id_rsa.pub
1

3.踩坑记录

Enter passphrase for key '/Users/macbookpro/.ssh/id_rsa':
git@xxx.com: Permission denied (publickey).
fatal: Could not read from remote repository.
1
2
3

一般是创建秘钥的时候,误输了密码。如果不想每次都输入密码,创建时可以一路回车。解决(重新生成):

1.清除所有的 key-pair

ssh-add -D
rm -r ~/.ssh
1
2

删除在 github/gitee 等中的 public-key

2.重新生成秘钥,一路回车

3.测试:
在终端 ssh -T git@github.com

# 概念

# 工作区

工作区就是 git 能够管理到的工作区域,也就是该仓库下的所有文件,包括正在修改的和已经存在的文件。

# 暂存区

暂存区是 git 记录的修改状态,用户在工作区修改文件后,可以用git add file将文件修改放入暂存区。

注意,如果用户没有把修改操作放入暂存区,然后直接提交,那 git 是不会提交用户的操作的,git 只提交暂存区中的修改操作。

另外,如果暂存区存在文件,是不能直接pull的。如果工作区存在修改文件,可以pull代码。

如果有冲突,则要求解决冲突。这时候一定要解决,然后提交,千万不要直接抛弃,因为 git 会认为你要做抛弃的操作。

# 配置

# .gitignore

有些文件的变动或者信息是不需要提交的,比如node_modules、dist以及系统产生的垃圾文件等。示例如下:

.DS_Store
node_modules
/dist


# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

然而有时候,我们发现文件设置 gitigore 也不生效,那很有可能是这个文件或目录已经提交到仓库了,必须先删除该文件才行。

# 删除单个文件
git rm --cached logs/xx.log
# 删除目录
git rm --cached -r logs
# 如果提示某个文件无法忽略,可以添加-f参数强制忽略。
git rm -f --cached logs/xx.log
1
2
3
4
5
6

接下来正常提交代码就可以了,下次再改动,就不会提交到仓库了。

# 如何让系统记住密码(https 方式)

git config --global credential.helper store 在用户主目录下.gitconfig 文件生成下面的配置

[credential]
	helper = store
1
2

以后就不用每次都输入账号密码了

# 如何删除系统密码

git config --system --unset credential.helper
1

# 配置别名

git config --global alias.st status 全局配置,用st代替status

在配置别名的时候,如果指定 –system ,将会对所有的用户生效。
指定 –global 的时候,会对当前用户生效。 没有指定 –system 或者 –global 的时候,只在当前仓库生效。

去掉--global,那配置别名的文件存在于本仓库的.git/config中。

全局配置的文件在用户主目录下的隐藏文件.gitconfig中。

如果想删除别名,直接删除[alias]下对应的行即可。

本人别名如下:

[alias]
	st = status
	br = branch
	ck = checkout
	cm = commit -m
	new = checkout -b
	newbr = "!f() { git checkout -b $1 origin/$1; }; f"
	de = branch -d
	ac = !git add . && git commit -m
	work = log --author=\"Jack\" --oneline --since=\"today 00:00:00\" --no-merges
	amend = commit --amend -m
	mo = "!f() { git merge origin/$1; }; f"
1
2
3
4
5
6
7
8
9
10
11
12

注意:git config --global alias.new 'checkout -b'

# 配置用户名和邮箱

git config user.name <your name> 本工程用户名

git config user.email <your email> 本工程邮箱

git config --global user.name <your name> 全局用户名

git config --global user.email <your email> 全局邮箱

# 多人协作

  • 在本地创建和远程分支一样的分支,使用git checkout -b branch-name origin/branch-name;
  • git pull抓取远程的最新代码;
  • 从本地推送分支,使用git push origin branch-name;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

# 提交规范

每次代码的提交是有意义的,常见的提交标记如下:

  • feat:新特性,新功能
  • fix:修改 bug
  • doc:修改文档
  • prod/build: 构建
  • chore: 没有源码相关的改动

基于 angular 规范的 commit (opens new window)

# 高级用法

# cherry-pick

像摘樱桃一样,提取某次提交,相当于合并该提交,而不是分支。

git cherry-pick <commitHash>
1

阮一峰 cherry-pick 教程 (opens new window)

# 删除某一次提交

与 cherry-pick 是反向操作,但操作稍微复杂一点。假如该 dev 分支的提交为:a-b-c-d,我只想要 a-b-d,不要 c。

  1. 复制 a 提交的 commitHash
  2. git rebase -i commitHash
  3. 输入i进入编辑模式,如下
pick b1ada0d b
pick b1ada2d c
pick b1ada2d d

# Rebase 5df736b..b1ada0d onto 5df736b (2 commands)
#
# Commands:
1
2
3
4
5
6
7
  1. 将 c 所在行的pick改为drop。
  2. 输入shift+;退出编辑模式。
  3. 输入wq!,保存并退出。(q!是不保存退出)

完成。

上次更新: 2025/04/09, 17:10:00
前端基建与架构
前端面试题汇总

← 前端基建与架构 前端面试题汇总→

最近更新
01
提交代码时修改commit消息
04-09
02
如何快速定位bug
02-20
03
云端web项目开发踩坑
08-25
更多文章>
Theme by Vdoing | Copyright © 2021-2025 dwfrost | 粤ICP备2021118995号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×