git、git lfs常用操作
windows下用了几年的tortoisegit,linux下又用了几个月vscode的gui git,终于下定决心要学习命令行了导师建议:view用gui香一点(导师建议用tig,不过vscode也挺香的,之后有机会再学习tig),实际操作还是命令行保险以下命令部分参考师姐的blog整体流程初始化初始化仓库git init链接云端仓库git remote add origin https://x
windows下用了几年的tortoisegit,linux下又用了几个月vscode的gui git,终于下定决心要学习命令行了
导师建议:view用gui香一点(导师建议用tig,不过vscode也挺香的,之后有机会再学习tig),实际操作还是命令行保险
以下命令部分参考师姐的blog
推荐:三年 Git 使用心得 & 常见问题整理
git
初始化
查看name与email配置信息
git config user.name
git config user.email
git config --list
配置name与email(global为可选项)
git config --global user.name "名字"
git config --global user.email "邮箱"
初始化仓库
git init
链接云端仓库
git remote add origin https://xxxxxxxxxxxxxxxxx
删除远端
git remote rm origin
基本操作
整体流程:
working tree --(git add) --> index -- (git commit) --> local repo -- (git push) --> remote
添加所有修改到stage(index,暂存区):
git add .
暂存区里的内容提到到repro(本地版本库):
git commit -m "提交信息"
本地版本库推送到云端仓库(-u表示将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了):
git push -u origin master
新分支push到远端(本地分支名和远端分支名相同可省略冒号及远端分支名)
git push <远程主机名> <本地分支名>:<远端分支名>
从云端仓库拉取到本地跟踪的远程分支(orign/master):
git fetch
合并本地跟踪的远程分支(origin/master)和本地仓库(master):
git merge
从云端仓库拉取到本地仓库(master),自动合并:
git pull
从云端仓库拉取所有分支
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
查询当前分之的历史(q退出):
git log
查询所有操作历史(救命稻草hhh误删可以从这里恢复):
git reflog
比较差异
工作区与staged比较(staged为空就和上次commit比较)
git diff
本次commit和上次commit比较
git diff HEAD~
撤销
撤销工作区修改:
git checkout -- .
撤销暂存区修改(撤销到工作区):
git reset HEAD -- .
撤销上次提交
git reset --soft HEAD^
撤销commit并把差异保存在stage里(撤销reflog-commit-id之后的所有commit):
git reset --soft <reflog-commit-id>
版本回退(危险)详细参考
git reset <reflog-commit-id>
标签
参考
创建标签:
git tag -a tagName -m "备注"
查询所有标签:
git tag
删除标签
git tag -d tagName
推送tag
git push --tags
进阶
删除.gitignore忽略之前已经提交进版本库的文件:
git rm -r --cached <file-name>
某文件在.gitignore被忽略了():
git rm -r --cached <file-name>
创建分支:
git branch test
切换分支:
git checkout test
前两步可以合并成一步,创建并切换到分支(并且可以从之前的某个版本(reflog-commit-id)创建分支):
git checkout -b test <reflog-commit-id>
查看分支:
git branch
查看分支详细版:
git branch -vv
合并分支:
git checkout master # 切换到主分支
git merge test # 合并(要保证合并的两分支上有分支相同,不同就得emmm暂时还没遇到,遇到再说)
删除分支:
git branch -d <branch-name>
分支改名:
git branch -m <old-name> <new-name> # 对非当前分支改名
git branch -m <new-name> # 对当前分支改名
再进阶
拉取某个版本到当前分支的stage:
git checkout reflog-commit-id -- .
接着从stage恢复到work tree(和前面撤销一样):
git reset HEAD -- .
当我们不小心将一个大文件给commit了,然而实际这个文件并不需要,但是会在push到github时搞你心态:
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: 26a02d3e3817fa390a16e91fb551ca5c
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File MDK-ARM/JLinkLog.txt is 124.11 MB; this exceeds GitHub's file size limit of 100.00 MB
To github.com:onion-rain/infantry_SuperCapacity_New.git
这时候我们需要将大文件连根拔起,
> git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch MDK-ARM/JLinkLog.txt' --prune-empty --tag-name-filter cat -- --all # 文件
> git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch MDK-ARM' --prune-empty --tag-name-filter cat -- --all # 文件夹
Rewrite ed9849c7473334796896619d45c590f90cdcd1c2 (1/76) (1 seconds passed, remaining 75 predic
Rewrite 10b62ae33f45e1d1c96ee8100e9c62775e8e919d (1/76) (1 seconds passed, remaining 75 predic
...
Rewrite 6f3b9ddc2c67c86f1c9126ba1ca7dabda8e0352e (75/76) (105 seconds passed, remaining 1 pred
Rewrite ca23be5502c207f4a973ea969464034afb878030 (76/76) (106 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten
强制push
git push --force
git lfs
参考
当我们工程中有体积庞大的二进制文件时,可以使用git lfs管理大文件
安装
Linux
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
Mac
安装HomeBrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git-lfs
git lfs install
Windows
下载安装 windows installer
运行 windows installer
在命令行执行 git lfs install
上传
> git lfs track *.pth.tar
Tracking "*.pth.tar"
> git commit -m "xxx"
> git push
Connection to github.com closed by remote host. KB/s
Uploading LFS objects: 0% (0/2), 396 MB | 695 KB/s
下载
克隆现有的 Git LFS 仓库
安装 Git LFS 后,你可以像往常一样使用 git clone 命令来克隆 Git LFS 仓库。在克隆过程的结尾,Git 将检出默认分支(通常是 master),并且将自动为你下载完成检出过程所需的所有 Git LFS 文件。例如:
$ git clone git@bitbucket.org:tpettersen/Atlasteroids.gitCloning into 'Atlasteroids'...
remote: Counting objects: 156, done.
remote: Compressing objects: 100% (154/154), done.
remote: Total 156 (delta 87), reused 0 (delta 0)
Receiving objects: 100% (156/156), 54.04 KiB | 31.00 KiB/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Downloading Assets/Sprites/projectiles-spritesheet.png (21.14 KB)
Downloading Assets/Sprites/productlogos_cmyk-spritesheet.png (301.96 KB)
Downloading Assets/Sprites/shuttle2.png (1.62 KB)
Downloading Assets/Sprites/space1.png (1.11 MB)
Checking out files: 100% (81/81), done
仓库里有 4 个 PNG 文件被 Git LFS 跟踪。执行 git clone 命令时,在从仓库中检出指针文件的时候,Git LFS 文件被一个一个下载下来。
加快克隆速度
如果你正在克隆包含大量 LFS 文件的仓库,显式使用 git lfs clone 命令可提供更好的性能:
$ git lfs clone git@bitbucket.org:tpettersen/Atlasteroids.git
Cloning into 'Atlasteroids'...
remote: Counting objects: 156, done.
remote: Compressing objects: 100% (154/154), done.
remote: Total 156 (delta 87), reused 0 (delta 0)
Receiving objects: 100% (156/156), 54.04 KiB | 0 bytes/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Git LFS: (4 of 4 files) 1.14 MB / 1.15 MB
git lfs clone 命令不会一次下载一个 Git LFS 文件,而是等到检出(checkout)完成后再批量下载所有必需的 Git LFS 文件。这利用了并行下载的优势,并显著减少了产生的 HTTP 请求和进程的数量(这对于提高 Windows 的性能尤为重要)。
拉取并检出
就像克隆一样,你可以使用常规的 git pull 命令拉取 Git LFS 仓库。拉取完成后,所有需要的 Git LFS 文件都会作为自动检出过程的一部分而被下载。
$ git pull
Updating 4784e9d..7039f0a
Downloading Assets/Sprites/powerup.png (21.14 KB)
Fast-forward
Assets/Sprites/powerup.png | 3 +
Assets/Sprites/powerup.png.meta | 4133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 4136 insertions(+)
create mode 100644 Assets/Sprites/projectiles-spritesheet.png
create mode 100644 Assets/Sprites/projectiles-spritesheet.png.meta
不需要显式的命令即可获取 Git LFS 内容。然而,如果检出因为意外原因而失败,你可以通过使用 git lfs pull 命令来下载当前提交的所有丢失的 Git LFS 内容:
$ git lfs pull
Git LFS: (4 of 4 files) 1.14 MB / 1.15 MB
加快拉取速度
像 git lfs clone 命令一样,git lfs pull 命令批量下载 Git LFS 文件。如果你知道自上次拉取以来已经更改了大量文件,则不妨显式使用 git lfs pull 命令来批量下载 Git LFS 内容,而禁用在检出期间自动下载 Git LFS。这可以通过在调用 git pull 命令时使用-c 选项覆盖 Git 配置来完成:
$ git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull
由于输入的内容很多,你可能希望创建一个简单的Git 别名来为你执行批处理的 Git 和 Git LFS 拉取:
$ git config --global alias.plfs "\!git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull"
$ git plfs
当需要下载大量的 Git LFS 文件时,这将大大提高性能(同样,尤其是在 Windows 上)。
一些错误处理
fatal: unable to access 'https://github.com/onion-rain/xxx.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
# 重置本机git设置
$ git config --global credential.helper store
fatal: unable to access 'https://github.com/onion-rain/Amap_POI.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
# 取消代理
$ git config --global --unset http.proxy
$ git config --global --unset https.proxy
更多推荐
所有评论(0)