梳理 git 知识,熟悉 git 安装,常见指令,操作等
参考廖雪峰的教程
廖雪峰 git 教程
安装
git 官网
命令
创建版本库
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 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
Mac:
pbcopy < ~/.ssh/id_rsa.pub
GNU/Linux (requires xclip):
xclip -sel clip < ~/.ssh/id_rsa.pub
3.踩坑记录
Enter passphrase for key '/Users/macbookpro/.ssh/id_rsa':
git@xxx.com: Permission denied (publickey).
fatal: Could not read from remote repository.
一般是创建秘钥的时候,误输了密码。如果不想每次都输入密码,创建时可以一路回车。解决(重新生成):
1.清除所有的 key-pair
ssh-add -D
rm -r ~/.ssh
删除在 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?
然而有时候,我们发现文件设置 gitigore 也不生效,那很有可能是这个文件或目录已经提交到仓库了,必须先删除该文件才行。
# 删除单个文件
git rm --cached logs/xx.log
# 删除目录
git rm --cached -r logs
# 如果提示某个文件无法忽略,可以添加-f参数强制忽略。
git rm -f --cached logs/xx.log
接下来正常提交代码就可以了,下次再改动,就不会提交到仓库了。
如何让系统记住密码(https 方式)
git config --global credential.helper store
在用户主目录下.gitconfig 文件生成下面的配置
[credential]
helper = store
以后就不用每次都输入账号密码了
如何删除系统密码
git config --system --unset credential.helper
配置别名
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
de = branch -d
注意: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 rm file
相当于rm file
,然后git add file
- 是否真的删除?
- 是,
git commit -m 'delete file'
- 否,
git reset HEAD file
+git checkout -- file
多人协作
- 在本地创建和远程分支一样的分支,使用
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。