Git常用操作
Clone项目
克隆
1 | git clone https://github.com/psvmc/RESideMenu_Swift.git ../RESideMenu_Swift |
克隆分支
1 | git clone -b 分支名 https://github.com/psvmc/RESideMenu_Swift.git ../RESideMenu_Swift |
克隆下来的项目git的配置信息也下载下来了,所以不用
git init
Git拉取
1 | git pull <远程主机名> <远程主机分支名>:<本地分支名> |
比如 取回origin主机的next分支,与本地的master分支合并,需要写成下面这样
1 | git pull origin next:master |
拉取远程指定分支
1 | git fetch origin 分支名称 |
git fetch 和 git pull 的差别
1 | # git fetch 相当于是从远程获取最新到本地,不会自动merge |
密码凭据
Git 提供了凭据助手(credential helper)来缓存或存储你的账号密码。
缓存凭据
临时保存,适合安全性要求高的环境
1 | git config --global credential.helper cache |
默认缓存 15 分钟。
可以指定时间(例如 10 小时 = 36000 秒):
1 | git config --global credential.helper 'cache --timeout=36000' |
注意:
这种方式将密码明文缓存在内存中,不写入磁盘。
存储凭据
永久保存,密码以明文形式保存在文件中
1 | git config --global credential.helper store |
首次输入账号密码后,Git 会将其保存在 ~/.git-credentials 文件中(格式为明文),后续操作不再提示。
远程覆盖本地
1 | git fetch --all |
虽然会让 Git 管理的文件 与远程完全一致,但它 不会删除本地新增的、未被 Git 跟踪的文件(即“未跟踪文件”或“untracked files”),比如你临时创建的 test.py、日志文件、编译产物等。
清理未跟踪文件
1 | # 1. 先查看哪些文件会被删除(安全预览) |
参数说明:
-f:强制删除(必须加,除非配置了clean.requireForce false)-d:同时删除未跟踪的目录-n:dry-run,只显示会删什么,不真删(用于预览)
组合成一行
1 | git fetch origin && git reset --hard origin/master && git clean -fd |
冲突解决
备份当前分支
1 | git branch master_backup |
还原
1 | git fetch origin && git reset --hard origin/master && git clean -fd |
Git提交
第一次提交
进入项目的根目录
1 | cd /xx/xx |
git初始化
1 | git init |
添加远程库
1 | git remote add origin https://github.com/psvmc/RESideMenu_Swift.git |
输入账号密码
添加修改的文件
1 | git add . |
提交已添加的文件
1 | git commit -m "注释信息" |
修改push到远程
1 | git push origin master |
提交
进入项目的根目录
1 | cd /xx/xx |
把远程的pull过来
1 | git pull origin master |
修改文件
添加修改的文件
1 | git add . |
提交已添加的文件
1 | git commit -m "注释信息" |
修改push到远程
1 | git push origin master |
比如 把本地的master分支推送到远程my_master
1 | git push origin master:my_master |
修改提交的备注
1 | git commit --amend |
本地覆盖远程
1 | git push origin master:master --force |
提交记录
查看某人的提交历史
1 | git log --author="psvmc" |
所有的提交历史
1 | git log --date=iso --pretty=format:’"%h","%an","%ad","%s"’ >> D:\git_log\schoolweb.csv |
某段时间历史
时间正序
1 | git log --after="2022-2-1" --before="2022-12-31" --date=short --reverse --pretty=format:"%h","%an","%ad","%s" >> D:\git_log\schoolweb.csv |
时间倒序
1 | git log --after="2022-2-1" --date=iso --pretty=format:"%h","%an","%ad","%s" >> D:\git_log\schoolweb.csv |
Git分支
添加本地分支
1 | git branch <新分支名字> |
切换本地分支
1 | git checkout <分支名> |
该语句和上一个语句可以和起来用一个语句表示:
1 | git checkout -b <分支名> |
推送远程分支
1 | git push origin <本地分支>:<远程分支> |
查看本地分支
1 | git branch |
查看远程分支
1 | git branch -a |
删除本地分支
1 | git branch -d <本地分支> |
删除远程分支
1 | git push origin :<远程端分支> |
Tag操作
Git 跟其它版本控制系统一样,可以打标签(tag),作用是标记一个点为一个版本号,打标签的操作发生在我们 commit 修改到本地仓库之后。
添加标签
1 | git add . |
上传标签
1 | git push origin master |
--tags 参数表示提交所有 tag 至服务器,普通的 git push origin master 操作 不会推送标签到服务器端
删除本地标签
1 | git tag -d 1.0 |
删除远程标签
1 | git push origin :refs/tags/1.0 |
其他操作
设置用户名与邮箱
设置
1 | git config --global user.name "psvmc" |
查看
1 | git config --get user.name |
取消SSL验证
修改git的配置文件,设置http.sslVerify为false,即可关闭TLS证书验证:
1 | git config --global http.sslverify false |
如果您仍然想要进行TLS证书验证,但是不想看到警告信息,可以使用以下命令来关闭Git的警告信息:
1 | git config --global advice.detachedHead false |
禁止提交文件
假设我们在配置.gitignore文件之前就提交了123.txt
那么即使我们以后.gitignore中添加上123.txt
该文件依旧会被提交,该怎样解决呢
先移除追踪
1 | git rm --cached 123.txt |
再提交
1 | git commit -m "移除追踪" |
改写历史
1 | git clone https://github.com/psvmc/psvmc.github.io.git |
例如 删除.idea文件夹
1 | git filter-branch --tree-filter 'rm -rf .idea/*' --tag-name-filter cat -- --all |
取消跟踪已版本控制的文件
不再追踪文件改动
1 | git update-index --assume-unchanged filePath |
恢复追踪文件改动
1 | git update-index —no-assume-unchanged filePath |
删除被管理的文件
1 | git rm —cached filePath |
删除被管理的文件夹
1 | git rm -rf —cached filePath |
版本回退
查看之前的版本
1 | git reflog |
复制完要回退的版本号后 按q键退出
回退到指定版本
1 | git reset --soft xxxx |
回退到上个版本
1 | git reset --soft HEAD~1 |
HEAD 就代表当前,所以上一个版本其实就是当前-1
前者表示只是改变了HEAD的指向,本地代码不会变化,我们使用git status依然可以看到,同时也可以git commit提交。
后者直接会改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码,所以使用是一定要小心,想清楚。
常见问题
问题1
fatal: bad object refs/remotes/origin/master
解决方法
1 | mv .git/refs/remotes/origin/master /tmp |
Git每次提交都要输入url
当代码不是clone下来,而是本地分享到git,以后每次push都需要输入url,
原因在于生成的config文件中不包含远程git的信息
解决方法:
- 打开项目下
.git文件夹,找到config文件,打开 - 替换内容为以下
1 | [core] |
修改url为你git仓库的url
无法Clone
当项目过大时会报一下的错误
1 | RPC failed; curl 18 transfer closed with outstanding read data remaining |
解决方法
1 | git config --global http.postBuffer 24288000 |
如果还不行呢
1 | git clone http://github.com/myproject --depth 1 |
如果上面的还不行 就可能是Nginx做代理缓存设置过小的缘故
把代理中的缓存关闭就行了(折腾了好久,才试出来的)
1 | location / { |
Github提交失败
先查看系统的代理
设置git代理
1 | git config --global http.proxy http://127.0.0.1:1080 |
取消代理
1 | # 取消代理 |
客户端推荐
Sourcetree
强烈推荐最好用的客户端 免费使用。