1 Git
初始化
// 初始化设置用户名和邮箱
git configh --global user.name "username"
git configh --global user.email user@email.com
git configh --global credential.helper store
创建仓库
// 创建一个新的本地仓库
git init <project-name>
// 下载一个远程仓库
git clone <url>
// SSH配置
ssh-keygen -t rsa -b 4096
// id_rsa,私钥文件id_rsa.pub公钥文件,上传到github
复制id_rsa.pub的内容,github右上角个人头像→settings→SSH and GPG keys→New SSH key→key编辑框→Add SSH key
// 推送更新内容
git push <remote><branch>
// 拉取更新内容
git pull <remote>
git pull <远程仓库名><远程分支名>:<本地分支名>
// 添加远程仓库
git remote add <远程仓库名><远程仓库地址>
git push -u <远程仓库名><分支名>
// 查看远程仓库
git remote -V
// 拉取远程仓库内容
git pull <远程仓库名>
四个区域
工作区
暂存区
本地仓库
远程仓库
三种状态
已修改(modified),修改了文件,但没保存到暂存区
已暂存(staged),把修改后的文件放到暂存区
已提交(commited),把暂存区的文件提交到本地仓库
两个平台
// gitee,码云,国内平台
// gitlab,极狐,私有化部署
可以在自己的服务器部署一个gitlab代码托管服务
GUI
// sourcetree,gitkraken,gitlens
基本概念
main,默认主分支
origin,默认远程仓库
HEAD,指向当前分支的指针
HEAD~,上一个版本
HEAD~4,上四个版本
特殊文件
.git,git仓库的元数据和对象数据库
.gitignore,忽略文件,不需要提交到仓库的文件
匹配规则:从上到下逐行匹配,每一行表示一个忽略模式
git-scm.com/docs/gitignore
1.空行或者以#开头的行会被git忽略,一般空行用于可读性的分隔,#一般用作注释
2.使用标准的Blob模式匹配,例如
*通配任意字符
?匹配单个字符
[]表示匹配列表中的单个字符,比如[abc]表示a/b/c
3.**表示匹配任意的中间目录
4.中括号可以使用短中线连接,比如
[0-9]表示任一数字,[a-z]表示任一小写字母
5.!表示取反
如doc/**/*.pdf,表示忽略doc目录及其所有子目录下的.pdf文件
.gitattributes,指定文件的属性,比如换行符
.gitkeep,使空目录被提交到仓库
添加和提交
// 添加一个文件到仓库
git add <file>
// 添加所有文件到仓库
git add .
// 提交所有暂存区的文件到仓库
git commit -m "message"
// 提交所有已修改的文件到仓库
git commit -am "message"
分支
// 查看所有本地分支,当前分支前会有一个*,-r查看远程分支,-a查看所有分支
git branch
// 创建一个新的分支
git branch <branch-name>
// 切换到指定分支,并更新跟之前
git checkout <branch-name>
// 创建一个新的分支,并切换到该分支
git checkout -b <branch-name>
// 2.23版本后,切换分支用switch
git switch <分支名>
// 删除一个已经合并的分支
git branch -d <branch-name>
// 删除一个分支,不管是否合并
git branch -D <branch-name>
合并分支
// 合并分支a到分支b,-no-ff表示禁用Fast forward模式,合并后的历史有分支,能看出曾经做过合并,而-ff表示使用Fast forword模式,合并后的历史会变成一条直线
git merge --no-ff -m "message" <branch-name>
// 合并&squash所有提交到一个提交
git merge --squash <branch-name>
rebase不会产生新的提交,而是把当前分支的每一个提交"复制"到目标分支上,然后再把当前分支指向目标分支,而merge会产生一个新的提交,这个提交有两个分支的所有修改。
解决合并冲突
// 两个分支未修改同一个文件的同一处位置时,git自动合并
// 两个分支修改了同一个文件的同一处位置:产生冲突
解决办法:
1.手工修改冲突文件,合并冲突内容
2.添加暂存区,git add file
3.提交修改,git commit -m "message"
中止合并:当不想继续执行合并操作时可以使用下面的命令来终止合并过程:
git merge --abort
// push时远程仓库发生变化
// 将HEAD重置到当前分支的最新提交
git reset --hard
// 删除所有未跟踪的文件和目录
git clean -df
//
git pull
// gnu nano 退出,
ctrl+x
// 撤销合并并清理工作目录后,安全地重新拉取最新的代码
git pull
Rebase
// rebase,变基,可以把本地未push得分叉提交历史整理成直线,看起来更直观。但是多人协作时,不要对已经推送到远程的分支执行rebase操作
//
git log --oneline --graph --decorate --all
// alias 取别名
alias graph = "git log --oneline --graph --decorate --all"
// graph,等同于git log --oneline --graph --decorate --all
graph
git checkout <dev>
git rebase <main>
撤销
// 移动一个文件到新的位置
git mv <file> <new-file>
// 从工作区和暂存区中删除一个文件,然后暂存删除操作
git rm <file>
// 只从暂存区中删除一个文件,工作区中的文件没有变化
git rm -cached <file>
// 恢复一个文件到之前的版本
git checkout <file> <commit-id>
// 创建一个新的提交,用来撤销指定的提交,后者的所有变化都将被前者抵消,并且应用到当前分支
git revert <commit-id>
// 重置当前分支的HEAD为之前的某个提交,并且删除所有之后的提交。--hard表示重置工作区和暂存区,--soft表示重置暂存区,--mixed表示重置工作区
git reset --mixed <commit-id>
// 撤销暂存区的文件,重新放回工作区(git add的反向操作)
git restore --staged <file>
查看
// 列出还未提交的新的或者修改的文件
git status
// -s,short,简略模式
git status -s
// 查看提交历史,--oneline可省略
git log --oneline
// 查看未暂存的文件更新了哪些部分
git diff