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
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐