一 设置Git的user name和email:
$ git config --global user.name "xuhaiyan"
$ git config --global user.email "haiyan.xu.vip@gmail.com"
git config --list 查看配置信息
二 生成SSH密钥过程:
1.查看是否已经有了ssh密钥:cd ~/.ssh
如果没有密钥则不会有此文件夹,有则备份删除
2.生存密钥:
$ ssh-keygen -t rsa -C “email@email.com”
按3个回车,密码为空。
(email@email.com是github的账号,即上面的email)
生成的id_rsa和id_rsa.pub
id_ras.pub中的key需要复制下来,在git Server上填写(比如github上)
三 在要保存工程的位置
git init 建立 .git文件
四 addFile提交文件到stage,从stage中清除文件
git add -A 提交所有变化
git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
git add fileA fileB fileC 多个文件
git add dir 会提交整个目录包括子目录
git stage跟git add功能完全相同,区别是前者名字起的贴切。。
git reset fileA 是 git add的相反操作,清除掉stage中的fileA,(实际操作就是是从库区head恢复到statge,如果库区没有fileA这个文件,那么这个操作就是无效的 )
eg:
如果新建了fileA
add,然后git state 发现 fileA是 新增Add状态
使用git ls-files --stage 发现里面有fileA
git reset A 后 git state 中是未跟踪状态
git ls-files --stage中不包含fileA
git rm --cached fileA 据说除了删stage还会删库区的fileA,但工作区的fileA不会改变,这时fileA实际变成了未跟踪状态
git rm fileA 与上面类似,但是会吧工作区的fileA也删除
git checkout --fileA 从stage恢复到workspace
五 commit
git commit -m "log"
git commit -a -m "log"
git commit -a是把unstaged的文件变成staged(这里不包括新建(untracked)的文件),然后commit,
一般都不推荐使用git commit -a,还是推荐先git add再git commit。
六 版本回退
git reset --soft --mixed --hard 3参数用法
https://www.cnblogs.com/nafio/p/9925575.html
git reset --hard xxxx到任意位置
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000
七 push
设置origin关键字替代目标地址,关联远程库
git remote add origin git@github.com:yourusername/test.git
git push -u origin master 这句可以用来代替上面--set-upstream那句,第一次上传master是null的需要加-u,之后就不需要-u了
git remote -v 查看远程库信息,可以查看可抓取和推送的远程地址
git remote add origin git@github.com:yourusername/test.git 设置的关联就可以用上面命令查到
取消这个关联使用
git remote remove origin
八 clone
git clone ssh://example.com/~/www/project.git
clone时git自动把本地master和远程master分支对应
指定路径
git clone git@github.com:xxxxx/xxx.git d:/ngspace/xx/
指定用户名,密码
原始git地址 https://xxxx/test.git
指定用户名,密码后
git clone https://用户名:密码@xxxx/test.git
小技巧
在任意文件夹或任意位置(不需要先建立git init)直接 用上面指定路径的方法clone工程,可以避免多级同名目录的问题
比如在d:/ng/ 下执行git init 然后git clone git@github.com:xxxxx/xxx.git
会在d:/ng/下生成一个.git ,然后还会在d:/ng/ng/下生成一个.git
九 pull
git pull 从远端仓库提取数据并尝试合并到当前分支
已经clone完的工程使用pull
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin next:master
十 创建,查看,切换分支
原理
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000
创建分支
方法1 git checkout -b branch1 创建分支branch1并切换到这个分支
方法2 git branch branch1 创建分子branch1
git checkout branch1 切换分支
这里注意git checkout --fileName 是从缓存恢复到工作区
切换时要进入到下载的具体分支文件夹中操作
eg:文件夹结构a/b git init,git clone都在a中操作,然后下载下来b文件夹,切branch时要cd到b在checkout
创建远程分支
本地创建分支后
git push origin branchLocalName:branchRomateName
查看分支
git branch 查看本地分支(首先需要cd到具体工程目录中)
git branch -a 查看本地和远程所有分支
git branch -s 查看本地分支
git branch -r 查看远程分支
切换分支
git checkout branch1
合并分支
git merge branch1 把branch1合并到当前分支上(这里注意,想合并到哪个分子就要先切换到这个分支然后merge)
如果有冲突,解决完冲突后,需要再次add并commit
git merge --no-ff -m "xxxx" branch1
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
如果才用 ff 模式的,则直接把 master 的指针直接指向了 dev 分支的最新提交,这样两个分支的最新提交的 commit id 就是一样的。
如果采用 --no-ff 模式合并分支,由于不能直接把 master 指针直接指向 dev 分支的最新提交, master 分支只能进行一次提交操作,所以就会有内容一模一样,commit id 不同的问题。
简单地说就是 -no-ff 模式进行了一次新的 git commit 操作。
这也是为什么采用 -no-ff 模式要加入参数 -m 的原因
冲突
冲突后,回到冲突前
git merge --abort
删除分支
git branch -d fileA 合并分支后,被合并的分支一般就没用了,可以直接删除,对git来说只是清空指针的操作,成本低
git branch -D fileA 强行删除(未合并过的)分支
十一 其他命令
安装lfs,用于上传大文件,否则速度慢
https://blog.csdn.net/wifi74262580/article/details/85060187
对每个仓库 git lfs install
然后依次添加需要追踪的大文件类型
git lfs track "*.mp4"
然后记得把.gitattributes commit上去
git add .gitattributes
git commit -m "xxxxx"
--set-upstream用法关联本地远程分支,本地新建的分支如果与远程分支建立关联
就可以直接使用git push ,git pull 不需要多余参数
如果不使用这个参数做关联,push,pull就需要每次加参数
比如 git pull <remote> <branch>
一些情况
eg1:首次推送本地master到远端
git push --set-upstream git@github.com:OnafioO/xxxx.git master(注意最后这个master指的是本地)
也可以用下面替代,下面会自动建立到master的关联
git remote add origin git@github.com:yourusername/test.git
git push -u origin master(第一次加-u)
用完上面两种方法之一,下次再push,直接就git push,不需要加其他参数
如果git retmote add时设置的地址错了,可以用下面方法修改
git remote rm origin
git remote add origin git@github.com:Liutos/foobar.git
eg2:新建dev分支,拉取远端dev分支
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream-to=origin/dev dev
然后就可以直接使用git push,git pull来操作dev分支,不需要额外参数
取消分支关联
git branch --unset-upstream [<branchname>]
git stash 把工作区和暂存区临时存起来
git stash save 同上
git stash list 查看所有缓存
git stash apply 从最后一个缓存恢复到工作区,恢复后stash内容不删除
git stash apply@{0} 恢复序号为0的那个缓存,具体序号可以通过git stash list查看到
git stash pop 从最后一个缓存恢复到工作区,回复后stash内容删除
git stash drop 删除最后的stash
git stash clear 清理所有
git log 查看每次修改
git log --pretty=oneline 查看修改,把每次修改信息显示成一行
git log --graph 可以看到分支合并图
git log --graph --pretty=oneline --abbrev-commit
最后面-abbrev-commit作用:Git 可以为你的 SHA-1 值生成出简短且唯一的缩写。如果你传递
--abbrev-commit
给 git log
命令,输出结果里就会使用简短且唯一的值;它默认使用七个字符来表示,不过必要时为了避免 SHA-1 的歧义,会增加字符数
git reflog 用来记录每一次命令 ,这个可以配合git reset 使用,用来查下恢复版本
git tag tagname 默认把tag打在当前Head上 也可以git tag tagname f52c633 把tag打到某一个commit id上
git tag -a tagname -m "info" 当前tag加个注释
git tag 查看tag 或者 git show tagname查看某个具体tag
git tag -d v1.0 删本地tag
git push origin v1.0 推送到远端
git push origin --tags 一次性推送
git push origin :refs/tags/v0.9 删除远端tag
命令行下对比基本没鸟用,随手记录
git diff 显示当前工作区的文件和stage区文件的差异
git diff --staged 显示stage区和HEAD的文件的差异
git diff HEAD 显示工作区和上次递交文件的差异
git
ls
-files --stage 查看缓存区文件index内容
使用git ls-files指令可以查看指定状态的文件列表,格式如下:
#查看指定状态的文件 git ls-files [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])
git clean -df 移除所有未跟踪文件,-d标识包含目录,-f强制清除
十二 github上传
…or create a new repository on the command line
echo "# Test0" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:xxxx/Test0.git
git push -u origin master
…or push an existing repository from the command line
git remote add origin git@github.com:xxxx/Test0.git
git push -u origin master
子模块下载
git submodule init
git submodule update