0.前言
廖雪峰老师的教学非常仔细认真,给个好评!
本文将指令汇总,方便快速查看使用。
同学们想学操作原理还请移步廖老师的教学网站,跟着做一遍就会了
0.1说明
- 下面的<>,敲指令的时候都不需要输入。
- HEAD表示最新版本
- 工作区 > add > 暂存区 > commit > 版本库
1.建立git版本库
mkdir xxx
创建文件夹
git init
把这个目录变成Git可以管理的仓库
2.提交
git add <file>
将file添加到暂存区
git commit -m <message>
将当前暂存区的所有修改内容,都提交到仓库,并添加备注“message”,可中文
git commit
提交,然后进入vim编辑器,按i 》输入message 》esc 》 输入:wq! 》回车,提交,作用同上面一行指令。
3.查看
git status
查看当前工作区文件状态
git diff <file>
查看file和HEAD版本的区别
git log
查看所有commit的历史记录(回退到前天,那昨天的记录就没了,想看昨天记录可用git reflog,详细可看廖雪峰的版本回退 )
git log --pretty=oneline
查看所有commit的历史记录——简洁版
git reflog
查看所有所有的操作记录,供你后悔使用。
4.回退
git reset --hard HEAD^
回退到上一个版本(在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。)
git reset --hard 1094a
1094a,是你查看git log历史记录里的版本号,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
git checkout -- <file>
把file在工作区的修改全部撤销,恢复到修改之前的样子。之前有add过,那就回到add时的状态,没add过就回到最初的起点(此时响起了Jay的歌),总之就是让这个文件回到最近一次git commit或git add时的状态。(感觉自己好啰嗦,就怕说不明白)
git reset HEAD <file>
把add file的动作撤销,重新放回工作区,改动内容依然保留着,你可用:
①checkout清空修改内容
②可用add再次添加到暂存区。
5.删除
rm <file>
删除file,然后add,然后commit。后悔的话就reset --hard <版本号>,或者checkout,删除和修改一样,可后悔可恢复。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
6.远程仓库github
创建github账号
添加ssh
参考 https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416
Create a new repository
创建一个远程仓库
git remote add origin git@github.com:axxx/bxxx.git
将本地库与远程库关联。
(origin-远程库名字 axxx-你的github账号 bxxx-上一步创建的repository的名字,创建完后页面上有这句话,复制出来在你本地工作区执行即可)
git push -u origin master
第一次推送到github
git push origin master
推送到github
7.克隆
git clone git@github.com:zhaokei/gitskills.git
从远程仓库克隆 git clone后面的地址看下图
8.分支
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
查看分支合并图:git log --graph --pretty=oneline --abbrev-commit
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。(我觉得就是还保留这个分支)
9.隐藏工作空间stash
应用场景:正在a文件中添加新功能b,明天开发完提交a文件。此时来了生产bug代号101,10分钟内立刻修改,需要改a文件,怎么办?不能把没开发完的代码也提交上去,怎么办:
方法1.(不推荐)笨方法:a文件复制粘贴,恢复到生产版本,然后修改bug,改完后提交a文件。然后再继续开发功能b。
方法2.(推荐)git的stash(隐藏)方法,给力!
假设当前正在dev分支下修改a文件
git stash
隐藏当前所在分支dev的工作区
git checkout master
git checkout -b issue-101
修改了a文件,处理了bug
git add a
git commit -m “fix bug 101”
git checkout master
git merge --no-ff -m “merged bug fix 101” issue-101
git checkout dev
git stash list
查看隐藏列表
git stash pop
恢复隐藏工作区,并删除此隐藏 =
git stash apply stash@{0}
恢复 +
git stash drop
删除
10.强行删除分支
git branch -D <name>
强行删除分支
分支修改了内容add + commit 后,使用 git branch -d <name>
删除分支会不好用,需要用大写D
11.多人协作
git remote
查看远程库信息
git remote -v
远程库更详细信息
git push origin <branch_name>
推送到远程仓库
git pull
更新到本地并合并
若
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
- 解决多人版本冲突的内容后,add > commit > push
- 后提交的人就需要合版本了。
12.rebase
没弄明白,就是整理分支log的。想研究的去看廖雪峰老师讲解。 https://www.liaoxuefeng.com/wiki/896043488029600/1216289527823648
13.标签
git tag <tagname> <commitid>
创建标签(无版本号时在HEAD上创建标签)
git tag
查看标签列表(按字母排序)
git show <tagname>
查看标签详情
git tag -a <tagname> -m "some remark" <commit-id>
创建带有说明的标签
git tag -d <tagname>
删除标签
git push origin <tagname>
推送标签到远程
git push origin --tags
一次性推送全部尚未推送到远程的本地标签
删除已推送到远程的标签:
1.本地删除 git tag -d <tagname>
2.删除远程标签 git push origin :refs/tags/<tagname>
14.给命令配置别名
git config --global alias.st status
status => st ,这以后git st
= git status
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
丧心病狂配置查看分支树
总之,是为了方便,简化命令。其他参考 https://www.liaoxuefeng.com/wiki/896043488029600/898732837407424