大纲
Git拉取远程仓库配置(SSH)
查看git配置
git config --list
初始化用户名、邮箱,如果你没有初始化过,那么直接:
git config --global user.name "输入你的用户名"
git config --global user.email "输入你的邮箱" # 作用于用户每次提交时的配置
如果配置过,如有需要可以修改配置:
git config --global --replace-all user.name "输入你的用户名"
git config --global --replace-all user.email "输入你的邮箱"
生成SSH秘钥
ssh-keygen -t rsa -C "注释" # 生成秘钥 -C 用于添加备注,如不需要可忽略
三次回车看到以下信息即代表成功
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:+LDAoRXAIS4fmR+9X/yrzX+hJ0dh41fsG3fo+RE4kAY company computer
The key's randomart image is:
+---[RSA 2048]----+
|..oo. E |
|...o o . . |
|..+ + . + . |
|.. * o o .. . .+o|
| o + + S o oo++|
| . = . . o=*|
| . o ..ooB|
| o +o+o|
| ..+.=o.|
+----[SHA256]-----+
查看秘钥
cat ~/.ssh/id_rsa.pub # 打印公钥
添加公钥到远程仓库中(GitHub/GitLab/Gitee)
检验是否添加成功(首次使用需要确认并添加主机到本机SSH可信列表)以Gitee为例
ssh -T git@gitee.com
The authenticity of host 'gitee.com (116.211.167.14)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,116.211.167.14' (ECDSA) to the list of known hosts.
Bad packet length 2164556631.
ssh_dispatch_run_fatal: Connection to 116.211.167.14 port 22: message authentication code incorrect
$ ssh -T git@gitee.com
Hi tod! You've successfully authenticated, but GITEE.COM does not provide shell access.
拉取代码
git clone -b <branch_name> <url> # -b 指定分支,如省略则拉取默认分支
Git本地项目配置
初始化,会在当前目录自动创建 .git 文件夹,该文件是Git中最重要的文件夹,因为Git相关文件以及版本都将保存在该文件夹中
git init # 初始化
git status # 查看git状态
将指定文件添加到版本库的暂存状态
git add . # 添加当前目录下所有文件到暂存区
如果有出现警告:LF will be replaced by CRLF 则执行以下语句
git config --global core.autocrlf true # https://www.jianshu.com/p/450cd21b36a4
将暂存区的文件提交到版本库
git commit -m '项目初始化' # 提交到版本库,并填写版本说明。
获取远程仓库上的更新内容(需要先关联远程仓库)
git pull
将本地版本库的内容推送至远程仓库
git push
Git本地项目与远程项目关联
查看远程仓库
git remote
删除远程仓库
git remote rm origin
连接到远程仓库
git remote add origin <url>
将本地master分支内容以及版本信息推送到远程仓库
git push -u origin master # -u 后续可以直接通过git push推送 -f 强制用本地历史将远程覆盖(不推荐使用)
如果报错,代表远程有文件不在本地代码目录中
error: failed to push some refs to 'git@gitee.com:xxx.git'
执行以下命令合并代码再进行push
git pull --rebase origin master
另一种解决方式
输入以下命令会进入编辑界面,按i
进入插入模式,填写合并说明,按ESC
退出插入模式并输入:wq
退出编辑
git merge origin/master --allow-unrelated-histories
git的四大工作区域
工作区(项目文件夹)
版本库(.git文件夹)
暂存区(.git中的index文件)
远程仓库
git add / commit
git add
命令是将文件从工作区提交到暂存区,git commit
是将文件从暂存区提交到版本库
添加当前目录下的所有文件到暂存区
git add .
添加指定的目录或文件到暂存区
git add <dir/file>
提交暂存区的所有文件至版本库
git commit -m <message>
提交暂存区的指定文件至版本库
git commit [file] -m <message>
使用新的commit
合并上一次的commit
,可用于某次提交不完整时减少commit
的记录
git commit --amend -m <message>
git fetch / pull
拉取远程仓库所有分支的更新到本地分支
git pull
将远程指定分支合并到本地当前分支
git pull origin <branch_name>
将远程指定分支合并到本地指定分支
git pull origin <remote_branch>:<your_branch>
$ git fetch origin master:temp # 从远程仓库master获取最新 在本地建立temp临时分支
$ git diff temp # 将当前分支和temp做对比
$ git merge temp # 合并
git push
将本地分支commit的内容全部推送到远程仓库
git push origin <branch_name>
删除远程分支
git push origin -d <branch_name>
git status
Untracked files:还未加入版本控制的文件
Changes to be committed:文件已在暂存区(add),但是还没添加到版本库(commit)
Changes not staged for commit:文件已修改,但是这些修改还没更新至暂存区(commit不会提交这块的内容)
对于Untracked files
使用git add
加入到版本控制
git add .
也可使用git rm --cached
还原至未加入的状态
git rm --cached <file>
对于Changes not staged for commit
使用git add
将已修改的文件更新到暂存区
git add .
也可使用git checkout
撤销修改(工作区回退)
git checkout . # 撤销所有修改
git checkout -- <file> # 针对具体文件
对于Changes to be committed
使用git commit
提交至版本库
git commit -m <message>
也可使用git reset
退出暂存区
git reset HEAD -- <file>
git log
查看历史commit
记录,如果记录过多,则按Page Up、Page Down、↓、↑来控制显示,按q退出历史记录列表
git log
git diff
修改 | git add | git commit | ||
---|---|---|---|---|
git diff | 有 | 无 | 无 | 比较的是工作区和暂存区的差别 |
git diff --cached | 无 | 有 | 无 | 比较的是暂存区和版本库的差别 |
git diff HEAD | 有 | 有 | 无 | 可以查看工作区和版本库的差别 |
查看指定文件的提交记录
git log -p <file>
自定义日志格式并取别名
git config --global alias.lg "log --no-merges --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(yellow)%h%Creset %Cgreen(%cd) | %C(auto)%d%C(white) %s %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg # 使用命令别名来输出自定义格式的日志
git reset
git reset --hard 版本号 #回滚到指定版本
--hard 参数会将暂存区,工作区全部用指定提交版本的目录树替换掉(**会覆盖本地文件!**)
回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
--soft 参数只将版本库的覆盖,不进行暂存区和工作区的覆盖(**会回退commit操作**)
回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
--mixed 或不使用参数,覆盖暂存区和版本库,但不覆盖工作区(**会回退add、commit操作**)
回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响)
git reflog # 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
按功能划分:
撤销对工作区的修改
以最新的存储节点做参照,撤销对工作区的修改
git checkout -- <file> # 针对具体文件
git checkout . # 针对所有文件
撤销
git add
操作
撤销最近一次git add
向暂存区提交的修改,只改变暂存区,不改变工作区
git reset HEAD -- <file>
撤销
git commit
操作
撤销上一次的commit
,并将暂存区的文件从新提交(修改上次的commit)
git commit --amend -m <message>
撤销上一次的commit
,通过 hard/soft/mixed
来控制是否对暂存区和工作区产生影响
git reset --hard HEAD^
撤销具体的commit
git reset --hard <commit_id>
撤销
push
操作1.使用
git reset
直接删除指定范围的commit2.使用
git revert
不会删除commit,而是用新的commit来回滚
git reset
HEAD向后移,而git revert
HEAD向前进
git reset --hard <commit_id> # 本地撤销commit
git push origin HEAD --force # 强制将当前代码推送到远程仓库
git revert -n <commit_id> # 这里的commit_id指的是要回滚的commit
git commit -m <meaasge>
git push
git branch
查看所有本地分支
git branch # -r 查看所有远程分支 -a 查看所有远程分支合本地分支
创建分支
git branch <branch_name>
切换分支
git checkout <branch_name>
创建并切换到新建的分支,以下两种方法都可以
git branch -m <branch_name>
git checkout -b <branch_name>
删除分支
git branch -D <branch_name>
将指定分支合并到当前分支
git merge <branch_name>
本地新建一个分支后,必须要做远程分支关联,否则
git pull/push`会提示你添加关联
git branch --set-upstream-to=origin/<remote_branch> <your_branch> # remote_branch 远程分支名称 your_branch本地分支名称
也可以在创建本地分支的时候直接指定远程分支
git branch <your_branch> <remote_branch>
如果远程分支不存在,则需要先创建,然后通过git pull
更新远程分支,再尝试进行关联
error: the requested upstream branch 'origin/dev' does not exist
可以通过git branch -vv
查看关联关系
git branch --vv
git merge
合并指定分支到当前分支
git merge <branch_name>
当合并中出现冲突又不想解决可以终止本次合并,回到merge前的状态
git merge --abort # abort 终止合并 continue 继续合并
git stash
将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
git stash save <meaasge> # meaasge 备注信息
查看“某个地方”存储的所有记录
git stash list
删除指定编号的记录
git stash drop stash@{num} # stash@{num} stash从0开始排序,越后添加的数值越小,num填对应的数值
清空“某个地方”
git stash clear
将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
git stash pop
将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
git stash apply stash@{num}
查看最新保存的stash和当前目录的差异
git stash show # -p 查看详细的不同
查看指定的stash和当前目录的差异
git stash show stash@{num}
从最新的stash创建分支
git stash branch <branch_name>
从指定的stash创建分支
git stash branch <branch_name> stash@{num}
git tag
tag列表
git tag
新建一个tag在当前commit
git tab <tag_name>
新建一个tag在指定的commit
git tag <tag_name> <commit_id>
删除本地tag
git tag -d <tag_name>
推送tag到远程
git push origin <tag_name>
git rebase
衍合,可以得到更优雅的提交树
通过
git merge
合并会存在分支,而通过git rebase
合并则是一条直线的
git rebase <branch_name>