参考教程:廖雪峰Git教程
基本操作
创建基本库
git init // 把这个目录变成Git可以管理的仓库
添加并提交到当前分支
git add 文件名 // 添加到仓库;如果不写文件名写.的话则为增加所有改变的文件
git commit -m "注释文字" // 提交到仓库,且只会提交add到仓库的变化
// commit就像一个快照:一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失
add之后版本库内部:
commit之后版本库内部
查看当前状态
git status // 主要可以查看改动的文件有没有add,有没有commit
查看文件内容
cat 文件名
查看修改内容
git diff 文件名 // 查看文件在被添加(add)仓库之前做了哪些改动,是工作区(work dict)和暂存区(stage)的比较
git diff --cached // 是暂存区(stage)和分支(master)的比较
删除文件
git rm 文件名
git commit -m "remove" //确认删除
// 删除之后可用git checkout -- 文件名 恢复删除文件
版本管理
查看版本提交日志
git log // 只能看到在目前版本次之前的历史版本,看不到目前版本之后的版本
git reflog // 看到所有版本的提交日志
// 退出操作直接按q即可,或者 esc -> : -> q
版本回退
git reset --hard HEAD^ //回退到上一版本,HEAD表示当前版本,然后根据^数量判断向上回退多少个版本
git reset --hard HEAD~100 //回退到100个版本之前,当数量比较多时,用~100表示100个^
git reset --hard 短版本号/长版本号前几位 // 可以通过查看版本提交日志找到版本号
git reset HEAD 文件名 // 把暂存区的修改回退到工作区,即取消add操作;上面三种都可视为取消commit操作(只要没有push到远程库)
撤销修改
git checkout -- 文件名 // .表示所有文件,让这个文件回到最近一次git commit或git add时的状态
分支管理
多人协作模式:
- 试图正常push自己的修改
- 推送失败,说明远程分支比你的本地分支更新,需要先抓取分支
- 合并有冲突,则解决冲突并提交
- 再次正常push自己的修改
创建和切换分支
git checkout -b dev // 创建并切换到dev分支
// 注意创建分支的意思是在一个新的分支上有着和master/创建之前时的当前分支一样的代码
git branch dev // 创建dev分支
git checkout dev // 切换到dev分支
查看分支
git branch // 查看有哪些分支,当前分支前面有*标志
合并分支
git merge dev // 合并dev分支到当前分支
git merge --no-ff -m "xxxxxx" dev // 禁用Fast forward模式
禁用Fast forward模式下的合并逻辑如下图所示:
删除分支
git branch -d dev // 删除dev分支
解决冲突
冲突主要指的是发起合并的分支和被合并的分支都有增加并提交相应的内容,且两者大概率情况下是无法一致的,就会引发冲突。
发生冲突之后,Git会用<<<<<<,=======,>>>>>>>这样的符号在发生冲突的文件中标记出实际冲突的内容。
根据标记内容对需要对双方内容进行综合考虑(一般是发起合并的分支)并提交的文件进行处理然后再正常add和commit即可
贴士:干活都在分支上,只有发布在master分支上
临时分支
git stash // 把现在保存但是没有add commit的内容暂时封存起来
git checkout -b ano // 创建分支,没有未add,commit的修改
git stash list // 可以看到保存的工作内容
git stash apply stash@{0} // 恢复之前保存内容
git stash drop // 删除已经恢复的保存内容
git stash pop // 恢复的同时把stash内容也删了
推送分支
git push origin 分支名 // 如果是第一次推送需要 git push -u origin 分支名
// origin是远程库的默认名,可更改成其他的
抓取分支
git pull // 或者用下面的2步操作来代替
git fetch origin master
git merge origin/master
远程与本地的同步
// 远程有分支而本地没有
git pull // 或者用另一种抓取方法
git checkout -b 拉取的分支名 origin/拉取的分支名
// 本地有而远程没有
git push origin 分支名 // push到远程会自动创建
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。