首先创建目录,进入到该目录下
# 初始化仓库
git init
# 查看仓库状态
git status
# 增加所有文件到 “临时缓冲区”
git add .
# 查看暂存区中已添加的文件列表
git ls-files
# 查看已添加到暂存区的更改
git diff --cached
git diff --staged
# 从缓存区移除特定文件,但不会影响工作区中的内容
git restore --staged <文件名>
git restore --staged .
git reset HEAD <文件名>
git reset HEAD .
# 提交 “临时缓冲区” 到正式仓库
git commit -m "提交内容信息"
# 查看已有的branch / 远程分支名
git branch
git branch -r
# 修改(主)分支名字 / 强制重命名分支名
git branch -m <旧分支名> <新分支名>
git branch -M <旧分支名> <新分支名>
# 仅创建分支,不切换 / 创建并切换到新分支
git branch <分支名>
git switch -c <分支名>
# 删除本地分支 / 如果分支未被合并,使用强制删除 / 删除远程分支
git branch -d <分支名>
git branch -D <分支名>
git push origin --delete <分支名>
# 切换分支
git switch <分支名>
Merge 的逻辑
# 合并分支,将<分支名>合并到当前分支
git merge <分支名>
# 如果我们当前在 master 分支,执行 git merge a
# 共同的祖先是C,对比 C -> D 的改动,和 C -> B 的改动,然后合并为一个新的 commit 在 master 分支 M
A---B (a)
/ \
---C---D-----M (master)
# Git 判断差异是逐行进行的,而不是逐文件
# 如果本地和远程对不同的行做了修改,Git 会自动合并
# 如果 C-> D 和 C-> B 的改动有冲突的地方,那么会中断合并
# 针对有冲突的文件,要进入更改后,在继续使用完成 merge 操作
git add <path/to/confictFileName>
// 之后使用 commit 提交更改
git commit -m "merge a to master"
# 创建标签
git tag v1.0.0
# 查看已有标签(按时间排序)
git tag
git tag --sort=-creatordate
# 切换到该标签下的代码状态
git checkout v1.0.0
# 删除标签
git tag -d v1.0.0
git push origin --delete v1.0.0
# 推送标签
git push origin v1.0.0
# 可视化查看提交历史, 可以看到所有分支、tag、commit 的关系图
git log --oneline --graph --all --decorate
# 查询某个文件每次提交的情况
git log -- path/to/file
# 获取了 commit-id 后对比该文件的两次提交的不同
git diff <old_commit> <new_commit> -- path/to/file
# 查看不同
git diff HEAD HEAD~1 -- path/to/file
git diff <branch1> <branch2> -- path/to/file
git diff <tag1> <tag2> -- path/to/file
# 从最近一次的提交中恢复
git restore path/to/file
git restore --source=<commit/tag/branch> path/to/file
查看当前换行设置
\r\n
) 作为换行符\n
),尤其是在 Linux 和 macOS 上git config --global core.autocrlf
设置 Git 自动处理换行符转换,在 Windows 上, git add
时将 CRLF 转为 LF(统一格式存入仓库);git checkout
时:将 LF 再转回 CRLF(符合 Windows 使用习惯
git config --global core.autocrlf true
保持仓库完全一致(适用于跨平台项目),添加时转为 LF(统一格式),检出时不改回 CRLF(仍为 LF)
git config --global core.autocrlf input
Linux 和 Mac 系统默认安装 SSH, Windows 系统虽然默认不安装 SSH 的,在安装 Git Bash 过曾也默认安装了 SSH,可以直接在 Power Shell 或者 Git Bash 中输入 ssh
查看本机是否安装 SSH
输入 ssh-keygen -t rsa
命令,表示我们指定 RSA 算法生成密钥,然后敲三次回车键,期间不需要输入密码,之后就就会生成两个文件,分别为 id_rsa
和 id_rsa.pub
,即密钥id_rsa和公钥id_rsa.pub. 对于这两个文件,其都为隐藏文件,默认生成在以下目录:
~/.ssh
~/.ssh
C:\Users\<username>\.ssh\
密钥和公钥生成之后,把公钥 id_rsa.pub
的内容添加到 GitHub,这样我们本地的密钥id_rsa和 GitHub 上的公钥id_rsa.pub才可以进行匹配,授权成功后,就可以向 GitHub 提交代码了:个人主页 -> 右上角头像 -> Settings -> SSH and GPG Keys -> New SSH Keys
之后在 Power Shell 或者 Git Bash 中输入ssh -T git@github.com进行测试
从本地新建仓库上传到github的流程,首先到github上的个人主页,右上角 "+" 号 -> New repository
本地首先初始化仓库
git init
# 执行完后,再 /.github/config 文件中,可以看到 [remote "origin"] 的内容
# 这里的 orgin 是默认的远程仓库名字,可以更换其它
git remote add origin git@github.com:<userName>/<projectName>.git
# 如果 GitHub 的仓库已经OK了,那可以直接clone下来 (会再当前目录下再生成一个<projectName>的文件夹)
git clone git@github.com:<userName>/<projectName>.git
# 查看远程仓库
git remote -v
# 删除远程仓库
git remote remove origin
# 修改远程仓库
git remote set-url origin git@github.com:user/new-repo.git
# 拉取 master 分支, 其实执行2步
git pull origin master
# 等效于 fetch/merge, 如果origin的master和当前的不一样,
# 需要手动修改冲突的文件后,执行 git add
git fetch origin master
git merge origin/master
# 拉取所有 tag
git fetch --tags
git fetch origin --tags
# 拉取某个 tag, 然后切换到这个tag
git fetch orgin tag <tagName>
git checkout fetch <tagName>
# 拉取所有 branch/tag
git fetch --all --tags