创建版本库repository
mkdir f:/gitlearn
cd f:/gitlearn
git init
更新(新增、修改、删除)文件到git仓库
1 git add <file> #如果有多个文件,重复敲多行代码
2 git commit -m "此次提交的说明" #提交
添加当前目录下的所有文件夹及文件 git add .(后面为“.”)
添加整个文件夹 git add directoryname/
删除的另一种写法:
1 如果非git删除(手动、rm file),使用git checkout -- file.txt即可恢复文件,因为版本库还存在文件
2 如果使用git rm file.txt,且未执行git commit(此时,文件还在暂存区),想要恢复文件,先执行 git reset HEAD file.txt,再执行git checkout -- file.txt,即可恢复文件
3 删除版本库的文件,使用git rm file.txt,再执行git commit
查看当前git仓库状态
git status #列出需要更新的文件
git diff readme.txt #并显示更改的内容
git log --pretty=oneline #查看日志
版本回退
git reset --hard HEAD^ #会退到上一个版本,^的个数表示上上...上个版本,可以写成HEAD~100,标识退回到前100个版本
git reset --hard commit_id #根据版本id,让当前工作空间回退到某一个指定的版本,id可以不用写全,git会自动检索,也有可能检索到多个版本,就不行了
总结:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
工作区与暂存区
撤销修改
错误使用git add后,直接 git reset,撤销所有添加文件
- 文件修改后,未使用git add命令,不在暂存区
git checkout -- readme.txt
可以将修改内容撤销,与版本库最新版本代码一致
- 文件修改后,执行了git add命令,已存在于暂存区
两步执行
git reset HEAD readme.txt #既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本
git checkout -- readme.txt #把readme.txt文件在工作区的修改全部撤销
远程仓库,秘钥生成配置
git本地仓库,可以是多台机器,把每台机器生成的公钥添加到github SHH keys中,这样本机就可以通过私钥访问github仓库
本机生成公钥和私钥的命令:
打开git bash,在用户主目录下执行 $ ssh-keygen -t rsa -C "youremail@example.com",一路回车键使用默认值,即可生成.shh目录,该目录下有两个文件id_rsa和id_rsa.pub,分别为私钥和公钥,将公钥添加到github SSH keys中即可
添加远程仓库
1 先在github上建立一个空库
2 使用命令git remote add origin git@github.com:chnqi/gitlearn.git;
总结:
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
方法二:第一种有时一直报错 ,用此种方式
1 在github上建立空库
2 git clone git@github.com:chnqi/gitCloneTest.git
3 进入下载的目录,执行git init
4 因为远程clone下来的,已经有了关联关系,可以不执行git remot add origin git@github.com:chnqi/gitCloneTest.git
5 git push -u origin master
从远程仓库克隆
git clone git@github.com:chnqi/gitCloneTest.git
git分支
速度远快于SVN,使用的是指针指向分支的方式
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>