目录
配置相关
git的配置文件:
- Windows:%HOMEPATH%.gitconfig
%HOMEPATH%和%USERPROFILE%是Windows平台的高频环境变量,读者应当了解。
查看配置文件内容:
# Windows平台
type %HOMEPATH%\.gitconfig
输出内容:
[http]
sslVerify = false
[user]
name = 'hao'
email = 'hao@xxx.com.cn'
[credential "https://example.com"]
username = me
[credential "https://example2.com"]
username = me
配置SSH key
推荐使用SSH的方式访问仓库内容,因为HTTPS需要用户名密码认证,密码变更的话,会导致无法访问。
先检查是否配置用户名及邮箱:
git config --global --list
# 如果没有配置,则进行配置
git config --global user.name "yourname"
git config --global user.email "your@email.com"
先检查下是否已生成rs密钥,是否已存在id_rsa和id_rsa.pub两个文件,如果已存在那么自行斟酌是否删掉:
cd ~/.ssh
ls
生成rsa密钥:
# 生成密钥
ssh-keygen -t rsa -C "your@email.com"
配置SSH:
打开github或gitlab的设置页面,在【增加密钥】页面填入id_rsa.pub里的内容即可。
配置HTTP代理
对于内网开发环境,当无法下载外网仓库资源时,配置Git代理以解决此问题:
# 代理可以是http://127.0.0.1:1080,或者不带协议127.0.0.1:1080,按实际情况
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy http://127.0.0.1:1080
# 取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
仓库帐号密码变更
对于github/gitlab的密码发生变更导致的pull/push失败,可以尝试通过下面的方法解决:
git config --system --unset credential.helper
然后重新输入账号密码即可
关于credential.helper的更多使用细节推荐查看Git官网的介绍
提交记录相关
commit
git commit -m
内容可以通过单引号来换行,比如:
$ git commit -m '
> 1.aaaaa
> 2.bbbb
> '
[master b25154b] 1.aaaaa 2.bbbb
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 ss.txt
git commit --amend
命令查看和修改上一次commit的信息,已push的不能改:
git commit --amend
checkout
- 切换分支或历史节点
checkout
用于切换分支这点大家都知道,而有的时候我们需要让本地代码回到某个commitId历史节点,其实也是用的这个命令。比如:我想看下很早之前的一个版本,某个方法在整个项目的调用情况(Find Usage),此时就可以进行如下操作:
# 查看历史commitId
git log --pretty=oneline
# 切换代码至那个节点(注意本地代码先commit或stash保存一下)
git checkout commitId
# 重新切换回当前分支(比如master)
git checkout master
- 放弃本地文件修改
# 放弃单个文件修改
git checkout file_name
# 放弃当前目录修改
git checkout .
show
追踪文件提交记录
# 查看文件的所有提交记录
git log --pretty=oneline filename
# xianshi me
git log -p filename
# 查看指定某次提交的详情
git show commitID filename
rebase
多个commit合并为一个commit
有时候编码中途需要合并他人的代码,不得已中间需要临时保存一下,造成很多不必要的中间commit,git支持将这些commit合并后统一提交,前提是这些commit还没有push。
# 查看提交记录
git log --pretty=oneline
# 假设最近的三次提交ID分别是:333,222,111,我们需要合并333,222这两次提交
# 指针移动到111
git rebase -i 111
rebase命令执行后会进入vim模式,列出了333,222这两次提交操作命令,默认是pick
,即重新执行commit,这当然不是我们希望的,我们是希望这些操作只有一次commit,那么只需要将除第一个pick
(最近的那次)命令之外的其他pick
命令都改为squash
(或s
)即可,然后输入:wq
以保存并退出,接下来会进入到commit message 的编辑界面,输入提交日志内容,再次:wq
以保存并退出即可。
注意事项:如果这个过程中有操作错误,可以使用
git rebase --abort
来撤销修改,回到没有开始操作合并之前的状态。
stash
临时保存代码
与上面的场景差不多,编码过程中想要切换到别的分支或commit节点等操作,此时需要临时保存代码,我们不想为此提交一个无意义的commit记录,git为我们提供了stash命令,其特点是:
- 可以临时保存修改,转而去做其他操作,完成其他操作后,可以切换回当前分支,并恢复stash的修改内容;
- stash之后本地代码会回滚到修改前本地最近的一次commit(不要慌,代码没丢);
- 支持多次stash,以stack数据结构保存;
- 创建stash
# 默认参数
git stash
# 自定义stash remark
git stash save "stash 1"
# 创建新的分支
git statsh branch "branch_name"
- 应用stash
# 应用所有stash
git stash pop
# 多个stash时指定某个stash
git stash pop stash@{序号}
- 查看/删除stash
# 列出所有stash
git stash list
# 删除所有stash
git stash clear
# 查看某个stash详情
git stash show stash@{序号}
# 删除某个stash
git drop stash@{序号}
reset
放弃最近的commit修改记录
git log --pretty=oneline
# 找到目标commitId,并强制指针退回到那个提交版本
git reset --hard commitId
cherry-pick
快速迁移commit修改
# 想要把B分支的commit(s)合并到分支A,先checkout到分支A,然后执行下面
git cherry-pick commitIdFromB
# cherry-pick默认会commit修改后的内容,如果不想合过来直接commit,则加上-n即可
git cherry-pick -n commitId
# cherry-pick默认复用原commitId的提交msg,如果想自己修改,则加上-e即可
git cherry-pick -e commitId
仓库相关
提交本地项目代码到远程仓库
我们本地已有代码,且远程仓库也创建好了,进行首次代码提交:
# 进入项目根目录
git init
# 先提交本地代码
git add .
git commit -m "First commit."
# 关联远程仓库(远程仓库先要创建好)
git remote add origin main "https://remote.repo.url.git"
# 拉取远程最新代码
git pull origin main --allow-unrelated-histories
# 上传代码到远程库
git push -u origin main
远程仓库
# 查看远程仓库名
git remote
# 查看远程仓库url
git remote get-url --all origin
远程仓库变更
分支相关
分支管理
- 查看分支
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支(如果远程仓库信息没有更新,可以手动git fetch origin更新一下)
git branch -a
# 查看本地分支与远程分支对应关系
git branch -vv
- 创建分支
# 创建分支
git branch branch_name
# 若不存在则创建并切换分支;若存在则仅切换分支
git checkout -b branch_name
# 拉取远程分支到本地,并切换到该分支
git checkout -b branch_name origin/branch_name
创建好本地分支push到远程:
git push -u origin <local_name>:<remote_name>
- 删除本地和远程分支
# 删除本地分支,如果被删分支有未提交的代码会删除失败
git branch -d <branch_name>
# 强制删除分支
git branch -D <branch_name>
# 删除远程分支
git push origin --delete <branch_name>
- 分支重命名
git branch -m oldName newName
分支切换
- 切换分支
git checkout branch_name
# 若不存在则创建并切换分支;若存在则仅切换分支
git checkout -b branch_name
# 创建与远程分支对应的本地分支,并切换到该本地分支
git checkout -b branch_name orign/branch_name
分支合并
在分支A上合并分支B的修改:
# 切换到分支A
git checkout A
# 合并B,如果想要保留分支B的合并记录,加上--no-ff,表示no fast-forward
git merge B
标签相关
- 查看标签
# 查看本地所有标签
git tag
- 新增标签
# 基于当前最新一次commit创建标签
git tag tag_name
# 基于当前最新一次commit创建标签,带备注
git tag -a tag_name -m "备注内容"
# 指定commitId创建标签
git tag tag_name commitId
# 推送本地标签到远程
git push origin tag_name
- 删除标签
# 删除本地标签
git tag -d tag_name
# 删除远程标签
git push origin :refs/tags/tag_name