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 rev-parse --abbrev-ref HEAD
仅查看当前分支
git branch --show-current
仅查看当前分支(git2.22+)
# 创建
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.
2
3
一般是创建秘钥的时候,误输了密码。如果不想每次都输入密码,创建时可以一路回车。解决(重新生成):
1.清除所有的 key-pair
ssh-add -D
rm -r ~/.ssh
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?
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
2
3
4
5
6
接下来正常提交代码就可以了,下次再改动,就不会提交到仓库了。
# 如何让系统记住密码(https 方式)
git config --global credential.helper store
在用户主目录下.gitconfig 文件生成下面的配置
[credential]
helper = store
2
以后就不用每次都输入账号密码了
# 如何删除系统密码
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
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"
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: 没有源码相关的改动
# 高级用法
# cherry-pick
像摘樱桃一样,提取某次提交,相当于合并该提交,而不是分支。
git cherry-pick <commitHash>
# 删除某一次提交
与 cherry-pick 是反向操作,但操作稍微复杂一点。假如该 dev 分支的提交为:a-b-c-d,我只想要 a-b-d,不要 c。
- 复制 a 提交的 commitHash
- git rebase -i commitHash
- 输入
i
进入编辑模式,如下
pick b1ada0d b
pick b1ada2d c
pick b1ada2d d
# Rebase 5df736b..b1ada0d onto 5df736b (2 commands)
#
# Commands:
2
3
4
5
6
7
- 将 c 所在行的
pick
改为drop
。 - 输入
shift+;
退出编辑模式。 - 输入
wq!
,保存并退出。(q!
是不保存退出)
完成。