Git
Git
常用工作示例
专用名词解释:
- Workspace: 工作区
- Index / Stage: 暂存区
- Repository: 本地仓库
- Remote: 远程仓库(例如
Github
、Gitlab
、码云
)
基本配置
# 安装完Git后第一件要做的事,设置用户信息(global可换成local在单独项目生效):
git config --global user.name "Your Name" # 设置用户名
git config --global user.email "[email protected]" #设置邮箱
git config --global user.name # 查看用户名是否配置成功
git config --global user.email # 查看邮箱是否配置
# example
git config --global user.name "SunSeekerX"
git config --global user.email "[email protected]"
# 其他查看配置相关
git config --global --list # 查看全局设置相关参数列表
git config --local --list # 查看本地设置相关参数列表
git config --system --list # 查看系统配置参数列表
git config --list # 查看所有Git的配置(全局+本地+系统)
git config --global color.ui true # 显示git相关颜色
# 创建一个`ssh key`,直接回车,文件存在,不用的直接删除目录,有用的就直接复制`ssh key`
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# 把密钥放在剪贴板
clip < ~/.ssh/id_rsa.pub
# mac
cat ~/.ssh/id_rsa.pub | pbcopy
# 添加所有目录为安全目录
git config --global --add safe.directory "*"
常用命令
# 把本地的目录变成 git 本地仓库(执行一次即可)
git init
# 将你本地仓库与远程仓库关联起来(可以关联多个地址)
git remote add [远程地址别名] [远程仓库地址]
# 查看本地仓库文件状态
git status
# 添加整个工作区所有发生改变的文件到暂存区
git add -A
# 将暂存区文件放到本地仓库,`-m`后面接注释写上本次更改的地方
git commit -m 'Commit message'
# 合并远程仓库的更新(push 之前必须先合并)
git pull [远程地址别名] [远程仓库分支]
# 将本地当前分支的 commit 推送到远程指定分支,(`-u`指定该远程地址为默认,后面就可以不加任何参数使用 git push 了)
git push -u [远程地址别名] [远程仓库分支]
全局 http 和 https 代理
提交Github
和Gitlab
的代码在某些时候非常慢,这个时候就可以配置代理加速代码提交和拉取。
只有http
和https
方式可以代理,ssh
使用方式无法使用。
设置代理 http.proxy 后面接你的本地代理地址和端口
# clash
git config --global http.proxy http://localhost:7890
git config --global https.proxy https://localhost:7890
# 恢复
git config --global --unset http.proxy
git config --global --unset https.proxy
# 如果发现取消代理的命令不生效,可以用以下命令查看全局配置信息
git config --global -l
# 编辑全局配置,会启动编辑器,你可以手动去除代理信息
git config --global -e
问题解决
# 重装系统出现 fatal: detected dubious ownership in repository
# 添加全部目录
git config --global --add safe.directory "*"
kex_exchange_identification: read: Software caused connection abort
使用 clash 出现
https://github.com/vernesong/OpenClash/issues/2074 https://github.com/vernesong/OpenClash/issues/1960
把模式改为 Redir 模式
覆写设置 > 规则设置添加下面的规则
- DST-PORT,22,DIRECT
全文
script:
rules:
...
##- DST-PORT,80,DIRECT #匹配数据目标端口(直连)
##- SRC-PORT,7777,DIRECT #匹配数据源端口(直连)
- DST-PORT,22,DIRECT
##排序在上的规则优先生效,如添加(去除规则前的#号):
##IP段:192.168.1.2-192.168.1.200 直连
##- SRC-IP-CIDR,192.168.1.2/31,DIRECT
##- SRC-IP-CIDR,192.168.1.4/30,DIRECT
##- SRC-IP-CIDR,192.168.1.8/29,DIRECT
##- SRC-IP-CIDR,192.168.1.16/28,DIRECT
##- SRC-IP-CIDR,192.168.1.32/27,DIRECT
##- SRC-IP-CIDR,192.168.1.64/26,DIRECT
##- SRC-IP-CIDR,192.168.1.128/26,DIRECT
##- SRC-IP-CIDR,192.168.1.192/29,DIRECT
##- SRC-IP-CIDR,192.168.1.200/32,DIRECT
...
或者改为
Host github.com
Hostname ssh.github.com
Port 443
User git
IdentityFile .....
mac 安装 git 验证中心
解决 mac git 无法使用账号密码登录
brew tap microsoft/git
brew install --cask git-credential-manager-core
多个 git 账号
生成不同的 ssh key
# 创建一个`ssh key`,直接回车,文件存在,不用的直接删除目录,有用的就直接复制`ssh key` ssh-keygen -t rsa -b 4096 -C "[email protected]" # 把密钥放在剪贴板 clip < ~/.ssh/id_rsa.pub # mac cat ~/.ssh/id_rsa.pub | pbcopy
配置 ssh 文件
注意这里配置的是私钥,gihub 添加的是公钥
C:\Users\your-username\.ssh\config
ProxyCommand connect -S 127.0.0.1:7890 -a none %h %p
这一段是 ssh 代理,不用可以不添加ProxyCommand connect -S 127.0.0.1:7890 -a none %h %p # default 默认 git 账户 Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa # [email protected] Host two.github.com HostName github.com User [email protected] IdentityFile ~/.ssh/[email protected]
如果 git 地址是
git clone [email protected]:xxxxxx/yyyyyyyyy.git
换成用
git clone git@alias:xxxxxx/yyyyyyyyy.git
就可以 clone 代码了
到 github 添加 ssh 公钥
常用操作
将文件添加到仓库
# 将工作区的某个文件添加到暂存区
git add 文件名
# 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件
git add -u
# 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件
git add -A
# 将当前工作区的所有文件都加入暂存区
git add .
# 进入交互界面模式,按需添加文件到缓存区
git add -i
将暂存区文件提交到本地仓库
# 将暂存区内容提交到本地仓库
git commit -m ${提交说明}
# 跳过缓存区操作,直接把工作区内容提交到本地仓库
git commit -a -m ${提交说明}
查看仓库当前状态
git status
比较文件异同
# 工作区与暂存区的差异
git diff
#工作区与某分支的差异,远程分支这样写:remotes/origin/分支名
git diff 分支名
# 工作区与HEAD指针指向的内容差异
git diff HEAD
# 工作区某文件当前版本与历史版本的差异
git diff 提交id 文件路径
# 工作区文件与上次提交的差异(1.6 版本前用 --cached)
git diff --stage
# 查看从某个版本后都改动内容
git diff 版本TAG
# 比较从分支A和分支B的差异(也支持比较两个TAG)
git diff 分支A 分支B
# 比较两分支在分开后各自的改动
git diff 分支A...分支B
# 另外:如果只想统计哪些文件被改动,多少行被改动,可以添加 --stat 参数
查看历史记录
# 查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)
git log
# 查看最近多少次的提交记录
git log -p -次数
# 简略显示每次提交的内容更改
git log --stat
# 仅显示已修改的文件清单
git log --name-only
# 显示新增,修改,删除的文件清单
git log --name-status
# 让提交记录以精简的一行输出
git log --oneline
# 图形展示分支的合并历史
git log –graph –all --online
# 查询作者的提交记录(和grep同时使用要加一个--all--match参数)
git log --author=作者
# 列出提交信息中包含过滤信息的提交记录
git log --grep=过滤信息
# 和--grep类似,S和查询内容间没有空格
git log -S查询内容
# 查看某文件的修改记录,找背锅专用
git log fileName
代码回滚
# 恢复成上次提交的版本
git reset HEAD^
# 恢复成上上次提交的版本,就是多个^,以此类推或用~次数
git reset HEAD^^
git reflog
git reset --hard 版本号
--soft:只是改变HEAD指针指向,缓存区和工作区不变;
--mixed:修改HEAD指针指向,暂存区内容丢失,工作区不变;
--hard:修改HEAD指针指向,暂存区内容丢失,工作区恢复以前状态;
删除工作区文件
git rm ${文件名}
本地仓库文件替换工作区的文件:撤销更改
# 文件路径填“.”可以撤销当前工作区所有更改
git checkout -- ${文件路径}
本地分支推送到远程分支
# 可以新建远程分支
git push -u ${远程仓库别名} ${本地分支名}:${远程分支名}
推送本地所有分支到远程仓库
git push --all origin
git push origin --tags refs/remotes/origin/*:refs/heads/*
git push newremote --tags refs/remotes/origin/*:refs/heads/*
# 如果你的第二个远程仓库是通过 git remote set-url --add origin [your url] 这种方式添加的
git push origin --tags refs/remotes/origin/*:refs/heads/*
# 如果你添加了第二个远程提交信息
# git remote add origin2 [your url]
git push origin2 --tags refs/remotes/origin/*:refs/heads/*
推送 origin 所有的远程分支 到 origin2
确保你已经添加了
origin2
这个远程仓库。如果没有添加,你可以使用下面的命令进行添加:git remote add origin2 <url-to-origin2>
获取所有
origin
的远程分支:git fetch origin
创建并检出所有远程分支。此步骤可能需要一些自动化。在 Bash shell 中,你可以使用以下命令:
for branch in `git branch -r | grep -v HEAD`;do git branch --track ${branch#origin/} $branch done
现在你可以把所有分支推送到
origin2
:git push --all origin2
以上命令将推送所有本地分支到
origin2
远程仓库。注意:如果
origin2
中的某些分支已经存在,并且你想要强制覆盖它们,你可以使用--force
或-f
选项进行强制推送:git push --all -f origin2
本地仓库推送到多个远程仓库
# 查看帮助
git remote set-url origin --help
git remote set-url --add <name> <newurl>
git remote set-url --delete <name> <url>
从远程仓库克隆项目到本地
git clone ${项目地址}
创建分支
# -b表示创建并切换分支
git checkout -b ${新建分支名}
# 上面一条命令相当于下面的二条:
# 创建分支
git branch ${新建分支名}
# 切换分支
git checkout ${本地分支名}
查看分支
git branch
合并分支
# 用于合并指定分支到当前分支
git merge ${本地分支名}
# 加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
git merge --no-ff -m "merge with no-ff" ${本地分支名}
删除本地分支
# 删除本地分支,如果本地分支未完全合并是无法删除的,需要将-d改为-D表示强制删除
git branch -d ${本地分支名}
删除远程分支
git push origin --delete <branchName>
同步远程已删除的分支
# 删除远程分支
git push origin --delete ${远程分支名}
# 查看本地分支和追踪情况
git remote show origin
# 清理远程已删除本地还存在的分支
git remote prune origin
# 删除本地多余分支
git branch -D ${本地分支名}
查看分支合并图
git log --graph --pretty=oneline --abbrev-commit
查看远程库信息
git remote
# -v 显示更详细的信息
撤消某次提交
# 撤销最近的一个提交
git revert HEAD
# 撤销某次commit
git revert ${版本号}
撤销本次所有更改
# 撤销本次所有更改,会撤销本次所有的更改。不包括已经commit的
git checkout -- .
拉取远程分支到本地仓库
# 会在本地新建分支,并自动切换到该分支
git checkout -b ${本地分支} ${远程地址别名}/${远程分支 }
# 会在本地新建分支,但不会自动切换,还需checkout
git fetch origin ${远程分支}:${本地分支}
# 建立本地分支与远程分支的链接
git branch --set-upstream ${本地分支} ${远程分支
# 例如,下面代码执行会拉取远程1.1.0分支然后在本地创建名为1.1.0的分支,冒号右边的是本地分支名,可以自定义
git fetch origin 1.1.0:1.1.0
tag
标签命令 - tag
# 打标签命令,默认为HEAD
git tag ${标签}
# 显示所有标签
git tag
# 给某个commit版本添加标签
git tag ${标签} ${版本号}
# 显示某个标签的详细信息
git show ${标签}
# 删除一个本地标签
git tag -d <tagname>
# 删除一个远程标签
git push origin :refs/tags/<tagname>
同步远程仓库更新
git fetch ${远程地址别名} ${远程分支名}
# 例如
git fetch origin master
# 从远程获取最新的到本地,首先从远程的origin的master主分支下载最新的版本到origin/master分支上,然后比较本地的master分支和origin/master分支的差别,最后进行合并。
# git fetch 比 git pull更加安全
终止合并
# 终止合并,如果合并冲突过多,想要终止合并
git merge --abort
怎么更换 git 远程仓库地址
方法一 : 通过命令直接修改远程仓库地址
# 查看所有远程仓库
git remote -v
# 你新的远程仓库地址
git remote set-url origin ${新的地址}
方法二: 先删除在添加你的远程仓库
# 删除远程仓库关联
git remote rm ${远程地址别名}
# 你的新远程仓库地址
git remote add origin ${新的地址}
拉取指定分支代码
git clone -b ${远程分支名} ${远程仓库地址}
参考链接
- 如何进阶成公司 Git 小能手(常见问题总结) By koala
- 常用 Git 命令清单 By 阮一峰