目录
Git-Book
Git思维导图
0 常见命令
1 git branch
2 git tag
3 git checkout
4 git add . 和 git add *
4.1 git rm 删除指定文件/文件夹
4.2 .gitignore
5 reset
6 git pull 和 git push
7 fix you conflicts
8 update
9 git空间限制
10 使用 git-lfs
11 ping github.com
12 网页打不开github
13 vim
14 安装 git-lfs
ssh-keygen -t rsa -C "[email protected]"
可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
0 常见命令
cd 目录
git init
git config --global user.name "username"
git config --global user.email "useremail"
git config core.ignorecase false
git remote rm origin
git remote add alias https://github.com/yourgithubname/mastername.git // 会覆盖
git pull origin master
git add filename.text
git add dirname/*
git commit -m "add filename.text"
git push -u orgin master //以master身份提交到远程仓库 -u命令的作用相当于帮你记住当前分支,下次不用写了,直接写git push都可以
//删除文件夹下的所有 .svn 文件
find . -name ".svn" | xargs rm -Rf
//删除文件夹下的所有 .git 文件
find . -name ".git" | xargs rm -Rf
git clone 地址 文件夹名(不写则默认为远程仓库名)
git clone https://github.com/yourgithubname/mastername.git
git clone https://github.com/yourgithubname/mastername.git ForkDir
git status 当前文件状态
git diff 修改内容
git log 修改日志
git log -- dir/* or dir/ or dir 该目录日志
git log -- file 该文件日志
git log --pretty=oneline 日志只显示主要内容,一行显示
cat 查看文件
git reflog 获取历史版本号
1 git branch
创建、合并和删除分支非常快,鼓励你使用分支来完成某个短期任务,合并后再删掉,比起直接在master上工作过程更安全。
查看当前分支
git branch
创建本地分支localBranch,然后切换到该分支
git branch localBranch
git checkout localBranch
git checkout 加 -b 参数表示创建并切换,相当于以上两条命令
git checkout -b localBranch
添加文件 "Readme.txt", 提交到本地localBranch分支
git add Readme.txt
git commit -m "branch localBranch test"
分支的工作完成,切换回master分支:
git checkout master
把localBranch分支的工作内容merge合并到master分支上。
git merge命令用于合并指定分支到当前分支。合并后,再查看Readme.txt的内容,和dev分支的最新提交是完全一致的)。
此时合并即fast-forward(快进模式),合并速度快。并非每次代码合并都能实现fast-forward。
git merge dev
使用no-fast-forward模式将dev2合并到master分支上
git merge --no-ff -m dev2
合并完成后删除dev分支
git branch -d dev
二 远程分支
删除远程分支
git push origin --delete Chapater6
拉取远程分支并创建本地分支
git checkout -b 本地分支名x origin/远程分支名x
查看所有分支
git push origin test
git branch -a
注:remote/origin/[name]表示的是远程分支
清除本地更改
清楚所有更改
git checkout . && git clean -xdf
清除某一个文件的更改
git checkout -- file
将dev分支推送到远程
git push origin dev
Everything up-to-date
将本地分支dev关联到远程分支dev上
git branch --set-upstream-to=origin/dev
'dev' set up to track remote branch 'muscleape' from 'origin'
查看本地分支和远程分支的映射关系
git branch -vv
dev f938a3d8e9 [origin/dev: gone] 测试test
查看远程分支
git branch -r
origin/dev
查看本地各个分支目前最新的提交
git branch -v
dev f938a3d8e9 测试test
查看远程各个分支目前最新的提交
git branch -r -v
origin/dev f938a3d8e9 测试test
2 git tag
查看所有tag
git tag
查看指定版本的tag
git tag -l '1.0.*'
显示特定tag信息
git show 1.0.1
删除本地tag
git tag -d v1.0.2
删除远程的tag
git push origin --delete tag v1.0.1
新建tag,-m 注释
git tag v1.0.3
git tag -a v1.0.3 -m 'some description'
将本地特定或所有tag推送到远程
git push origin v1.0.3
git push --tags
创建一个基于指定tag的分支,开发后,切换到master merge合并
git checkout -b newBranch v1.0.4
3 git checkout
假如以某条历史commit为基准来release,但没有对该commit添加tag。此时有如下2中方式:
1)版本回退到特定commit,然后release。不推荐,原因是会丢失开发工作;
2)git checkout
具体方法
1. git log,甄别特定commit,拷贝commit id 如 31d4ba9b17d23c21dd2bdc39a5c2c97659fc41f0
2. git checkout 即 git checkout 31d4ba9b17d23c21dd2bdc39a5c2c97659fc41f0
3. git tag v1.0.4 参见[git tag 小节]
4. git push origin v1.0.4 将本地tag提交到远程仓库上
5. git status 查看所有变化的文件,终端会快速显示内容,正常
6. git checkout master 切回master主分支
7. git pull 更新到master最新代码
4 git add . 和 git add * 区别
- git add . 将本地所有untrack的文件都加入暂存区,并且会根据.gitignore做过滤
- git add * 会忽略.gitignore把任何文件都加入
4.1 git rm 删除指定文件/文件夹
在本地仓库删除指定文件
git rm 文件名名称
在本地仓库删除指定文件夹
git rm -r 文件夹/
提交修改
git commit -m '删除文件夹'
推送到远程仓库
git push origin 远程仓库连接
git rm命令
git rm -h
用法:git rm [<选项>] [--] <文件>...
-n, --dry-run 演习
-q, --quiet 不列出删除的文件
--cached 只从索引区删除
-f, --force 忽略文件更新状态检查
-r 允许递归删除
--ignore-unmatch 即使没有匹配,也以零状态退出
4.2 .gitignore
养成在项目开始就创建.gitignore文件的习惯
1、配置语法:
以斜杠/开头表示目录;
以星号*通配多个字符;
以问号?通配单个字符
以方括号[]包含单个字符的匹配列表;
以叹号!表示不忽略(跟踪)匹配到的文件或目录;
此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
2、示例说明
a、规则:fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
b、规则:/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;
c、规则:
/*
!.gitignore
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;
5 reset
不删除工作空间改动代码,撤销commit,并且撤销git add,回滚到目标状态
git reset --mixed HEAD^
git reset HEAD^
git reset 版本号
git reset --hard HEAD^ 回到上个版本 删除工作空间改动代码,撤销commit,撤销git add
git reset --hard HEAD^^ 回到上上个版本
git reset --hard HEAD~100 回到100个版本前
git reset --hard 版本号 回到某个特定的版本
git reset --soft HEAD^ 不删除工作空间改动代码,撤销commit,不撤销git add
git commit --amend 若commit注释写错了,只修改注释,此时会进入默认vim,修改注释后保存
6 pull or push 时的问题
在git提交或更新时时,Please commit your changes or stash them before you merge. 是一个常见的问题。(在你merge or change master 前,提交你的改变,或者存储改变。)
问题原因:上次commit后,代码发生了新的变化,如果merge或者change master 就可能导致代码丢失。
解决方案:保留本地的修改 的改法——通过git stash
git stash
git pull origin master
git push -f // 本地强制覆盖远程
git rebase master
git stash pop
git stash list
git stash clear
git stash list
7 说明fix you conflicts
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
8 update
git fetch --all # fetch所有分支上的内容,也可以选择只备份一部分内容
git reset --hard origin/master # 重置本地分支
git pull
9 git空间限制
error: RPC failed; curl 18 transfer closed with outstanding read data remain
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
git config --global http.postBuffer 1048576000
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999
10 使用 git-lfs
git lfs track '.a' // 添加追踪 .a或其他类型大文件
git lfs untrack '.a' // 取消追踪 .a或其他类型大文件
git lfs track // 查看追踪的类型文件
git add .gitattributes
git commint -m 'lfs add .gitattributes'
git push
git add youModifiedDir/* or *
git commit -m 'your modify des'
git push
11 ping github.com
在安装git-lfs时,遇到问题,发现ping github.com 失败,如下操作后可以ping通。
终端输入以下命令,二选一,进入本机hosts配置文件:
sudo vim /etc/hosts
sudo vim /private/etc/hosts
在hosts配置文件尾行换行添加如下两个IP映射:
36.7.68.22 github.com git
140.82.112.3 github.global.ssl.fastly.net
sudo killall -HUP mDNSResponder // 刷新本地DNS缓存
保存并退出
注意:36.7.68.22 是本机IP地址,140.82.112.3 是github的IP地址
ipaddress查询,默认显示本机的IP地址,输入域名可查询对应IP地址
github的IP查询,如下图
12 网页打不开github
网页打不开github.可能自己以前在/etc/hosts中添加了github的IP映射,包括上述ping github.com中的两个映射.此时进入上述文件,删除有关github的IP映射保存退出后,即可在网页打开github.
13 vim-windows
c 进入编辑模式
ESC
ZZ 退出
进入编辑模式:
小写i:在光标所在行位置停止不动开始写入内容
大写I:在光标所在行行首开始写入内容
小写a:在光标所在行当前字符后开始写入内容
大写A:在光标所在行行尾开始写入内容
小写o:在光标所在行下一行开始写入内容
大写O:在光标所在行上一行开始写入内容
退出编辑模式:
:w:保存文本
:q:退出编辑模式
:w!:强制保存,在root用户下即使文本只读也可以强制保存
:q!:强制退出,所有改动不生效
:wq:保存并退出
14安装 git-lfs
push 超过100M文件
: brew install git-lfs
==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
fatal: unable to access 'https://github.com/Homebrew/homebrew-core/': SSL certificate problem: self signed certificate
Error: Failure while executing; git clone https://github.com/Homebrew/homebrew-core /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
exited with 128.
Error: Failure while executing; /usr/local/bin/brew tap homebrew/core
exited with 1.
:
: git clone git://mirrors.ustc.edu.cn/homebrew-core.git/ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Enumerating objects: 5264, done.
remote: Counting objects: 100% (5264/5264), done.
remote: Compressing objects: 100% (5058/5058), done.
remote: Total 5264 (delta 44), reused 980 (delta 3)
Receiving objects: 100% (5264/5264), 4.30 MiB | 2.68 MiB/s, done.
Resolving deltas: 100% (44/44), done.
Updating files: 100% (5283/5283), done.
: cd "(brew --repo)/Library/Taps/homebrew/homebrew-core"
: git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
:
: brew update
Already up-to-date.
:
: brew install git-lfs
==> Downloading https://homebrew.bintray.com/bottles/git-lfs-2.11.0.catalina.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/35/351d2d6cb168249b9b7b0d55628574126b9787eab1441861dfd324b952057651?__gd
######################################################################## 100.0%
==> Pouring git-lfs-2.11.0.catalina.bottle.tar.gz
==> Caveats
Update your git config to finish installation:
Update global git config
$ git lfs install
Update system git config
$ git lfs install --system
==> Summary
/usr/local/Cellar/git-lfs/2.11.0: 65 files, 12.7MB
: git lfs
git-lfs/2.11.0 (GitHub; darwin amd64; go 1.14.2)
:
: git lfd install --system
git: 'lfd' is not a git command. See 'git --help'.
SSL certificate problem: self signed certificate
fatal: unable to access 'https://.../.git': SSL certificate problem: self signed certificate
git config --global http.sslVerify false
Git Large File Storage 上传帮助
https://stackoverflow.com/questions/48734119/git-lfs-is-not-a-git-command-unclear