(1)初始化仓库
git init 初始化一个Git仓库
(2)添加文件
添加文件到Git仓库,分两步add 和 commit:
- 使用命令
git add filename
(可反复多次使用,添加多个文件) - 使用命令
git commit -m "此次提交的说明" 可以先多次add,一次统一提交
- 补充:在工作区文件夹内修改了文件,使用add提交到暂存区stage,使用commit将暂存区的内容提交到master分支
(3)查看状态
- git status 要随时掌握工作区的状态
- git diff 如果git status告诉你有文件被修改过,用git diff可以查看修改内容
(4)版本回退
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
- commit_id 可为:HEAD^(上一个版本),HEAD^^(上上个版本),HEAD~100(回退到上第100个版本)
- 穿梭前,可用
git log
可以查看提交历史,以便确定要回退到哪个版本,查看commit_id - 要重返未来,可用
git reflog
查看命令历史,以便确定要回到未来的哪个版本,查看commit_id
(5)撤销修改
git checkout -- filename
把某文件在工作区的修改全部撤销,让这个文件回到最近一次git commit
或git add时
的状态命令中的“--”
很重要,没有“--”,就变成了“切换到另一个分支”的命令。git reset HEAD filename
把未提交,仍暂存区的修改撤销掉(unstage),重新放回工作区,然后可用 1. 中步骤撤销。HEAD表示最新的版本。- 若已经提交了,可使用(4)中版本回退的功能来撤销操作。
(6) 删除文件
- 确实要从版本库中删除该文件,那就用命令
git rm filename
删掉,并且git commit提交
- 若为误删除,可使用
git checkout -- filename
命令还原,但是只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容(修改了重要内容后,)
(7) 分支与合并
(廖老师画的图)
- 查看分支:
git branch(带* 的为当前分支)
- 创建分支:
git branch <name>
- 切换分支:
git checkout <name>(上文提过,没有 -- 即为切换分支的命令)
- 创建+切换分支:
git checkout -b <name>(一步完成了上两步的操作)
- 合并某分支到当前分支:
git merge <name>(在落后的master分支里面操作,merge dev 分支,
把master指针
指向dev
的当前提交)
- 删除分支:
git branch -d <name>
(8)合并冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用带参数的 git log
命令可以看到分支合并图
git log --graph --pretty=oneline --abbrev-commit
(9)分支管理
(10)bug修复
修复bug时,我们会通过创建新的临时分支进行修复,然后合并,最后删除
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;- 干活都在
dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本; - 你和你的小伙伴们每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。 - 合并分支时,加上
--no-ff
参数就可以用普通模式合并( 再加上 -m "提交信息" ),合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
比如说在dev分支工作,当要修复master分支的bug时,手头工作没有完成时,先在dev把工作现场git stash
一下,然后去master创建临时分支来修复bug,修复后,再回到dev工作分支,用git stash list
命令可以查看保存的工作现场,回到工作现场有两种方法:
- 用
git stash apply
恢复,但是恢复后,stash内容并不删除,需要用git stash drop
来删除,你可以多次stash,恢复的时候,先用git stash list
查看,然后用命令恢复指定的stash, -
用$ git stash apply stash@{0}
git stash pop
,恢复的同时把stash内容也删除
(11)多人协作
-
首先,试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并;如果
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>
。 -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功。 -
查看远程库信息,使用
git remote -v (使用-v参数可以查看更详细的参数)
;本地新建的分支如果不推送到远程,对其他人就是不可见的;
(12)rebase 变基(?!)
据说有点难理解,看不进去了,明天再去看
(13)标签(更好记,版本号)
-
命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id,为之前提交的commit打上标签,使用命令git tag <tagname> <commit id>
(commit id 可以用如下命令查看)git log --pretty=oneline --abbrev-commit
-
命令
git tag -a <tagname> -m "标签信息说明.."
可以指定标签信息; -
命令
git tag
可以查看所有标签。
!注意!:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
对 tag 进行操作:
-
命令
git push origin <tagname>
可以推送一个本地标签; -
命令
git push origin --tags
可以推送全部未推送过的本地标签; -
命令
git tag -d <tagname>
可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
(14)github使用
在GitHub上,利用Git极其强大的克隆和分支功能,广大人民群众可以真正自由参与各种开源项目。
-
在GitHub上,可以任意Fork开源仓库;
-
自己拥有Fork后的仓库的读写权限;
-
可以推送pull request给官方仓库来贡献代码。
(15)自定义配置
配置Git的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
每个仓库的Git配置文件都放在.git/config
文件中:
1.颜色显示
2.忽略文件
3.别名定义
(16)git学习就酱结束啦~廖老师说:
国外网友制作的Git Cheat Sheet,建议打印出来备用:Git Cheat Sheet
Git的官方网站:http://git-scm.com,英文自我感觉不错的童鞋,可以经常去官网看看。
学习地址:廖雪峰老师博客 -- https://www.liaoxuefeng.com/