(一)git的各种命令
1.把当前目录变成Git可以管理的仓库
git init
ls -ah//可以看到隐藏的git目录
2.把文件添加到仓库
git add 文件名//表示add指定文件
git add file2.txt file3.txt //可以同时添加很多文件
git add .//表示add所有修改过的文件
3.把文件提交到仓库
git commit -m "wrote a readme file"//-m表示后面是修改的注释,具体修改了什么
4.可以查看仓库当前的状态
git status
5.查看修改的内容
git diff 文件名
6.显示所有的提交日志
git log
git log --pretty=oneline //可以看到比较少比较整齐的信息
7.版本回退
git reset --hard commit_id //commit_id表示版本提交的id
git reset --hard HEAD^//HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
git reflog //可以记录你的每一次命令
8.撤销修改(前提是你没有提交到远程库)
git checkout -- 文件名//可以丢弃该文件在工作区的修改,用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
git reset HEAD 文件名//可以把暂存区的修改撤销掉(unstage),重新放回工作区
//如果是已经commit那就做版本回退,参考楼上
9.删除文件
rm 文件名//工作区的文件被删除了
//第一种情况,这样之后版本库的文件也被删了
git rm 文件名
git commit -m "说明"
//第二种情况误删,用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
git checkout -- 文件名
10.远程库
git remote add origin git@github.com:GitHub账户名/github仓库名.git//把本地的仓库和远程库关联
git remote remove origin//删除关联的远程库
git push -u origin master//把本地库的所有内容推送到远程库上,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来
git push origin master//把本地master分支的最新修改推送至GitHub
git clone git库地址//从远程库克隆到本地,Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
git remote//查看远程库的信息
git remote -v//显示远程库更详细的信息,显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址
git checkout -b dev origin/dev //创建远程origin的dev分支到本地
git pull //当推送到远程库失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突时,git pull把最新的提交从origin/dev抓下来
git branch --set-upstream-to=origin/dev dev //当git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接再git pull
//rebase操作可以把本地未push的分叉提交历史整理成直线;rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git rebase
11.关于分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>//相当于$ git branch 分支名字 $ git checkout 分支名字这两条命令
合并某分支到当前分支:git merge <name>//Fast-forward模式
删除分支:git branch -d <name>
12. 冲突(当无法快速合并的时候会要求手动合并,比如分支和主分支改了同一个文件的相同内容时就无法快速合并)
//1.合并分支
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt//代表有冲突
Automatic merge failed; fix conflicts and then commit the result.
//2.通过git status查看冲突文件
git status
//3.查看冲突文件的内容
cat 冲突文件名
//Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
//4.手动修改之后add和commit
//5.用git log --graph 查看分支的合并情况(git log --graph --pretty=oneline --abbrev-commit会比较清晰明了)
//6.删除分支
git branch -d 分支名
13. 分支管理
//合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
git merge --no-ff -m "说明" 分支名字//普通模式合并
//当修复bug时可以创建bug分支,如果手头的事忙到一半这时候就需要先把工作现场保存一下
git stash//保存工作现场
git stash list//查看工作现场保存在哪
git stash apply//恢复工作现场
git stash drop//删除保存的工作现场
git stash pop//等于git stash apply+git stash drop
git stash apply stash@{0}//你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash
//开发一个新功能时,最好新建一个分支
git branch -D <name>//丢弃一个没有被合并过的分支
14.标签管理
git tag v1.0//切换到需要打标签的分支上
git tag//查看所有标签
git tag v0.9 commit id//找到commitid可以打历史标签
git show v0.9//查看标签信息
git tag -a v0.1 -m "version 0.1 released" 1094adb//创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -d v0.1//删除标签
git push origin v1.0//推送某个标签到远程
git push origin --tags//一次性推送全部尚未推送到远程的本地标签
git push origin :refs/tags/v0.9//要删除远程标签先从本地删除git tag -d v0.9,然后删除远程
15.配置别名
git config --global alias.st status//git st就代表了git status
cat .git/config //加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用,当前仓库的可以查看git配置文件,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可
(二)了解git
1.工作区和暂存区(工作区就是你的本地仓库,add之后修改的文件会被添加到暂存区,commit之后会提交到当前分支,也就是说每次修改,如果不add
到暂存区,那就不会加入到仓库(repo)
中)
2.分支
在Git里,master
分支是主分支。HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。
当我们创建新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上:
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活,每个人都在分支上干活,版本发布时,再把分支合并到master
上
3.关于远程库的推送
-
master
分支是主分支,因此要时刻与远程同步; -
dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; -
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
-
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
(三)在Terminal中直接显示git的分支(关于mac 终端配置oh my zsh)
cat /etc/shells //系统内置了几种shell
sudo apt-get install zsh//如果没有安装zsh则先安装
chsh -s /bin/zsh //切换为zsh shell
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)”//安装ohmyzsh
vim ~/.zshrc//配置ohmyzsh的主题,配置项 ZSH_THEME 即为 oh-my-zsh 的主题配置
自动补全插件
下载 incr 自动补全插件 http://mimosa-pudica.net/src/incr-0.2.zsh
将插件放在 oh-my-zsh 自定义插件目录中
ls ~/.oh-my-zsh/custom/plugins/incr //我在plugins下建了个文件夹incr,把incr-0.2.zsh这个放进去
vim ~/.zshrc//打开 oh-my-zsh 配置文件
//在 plugins 中添加 incr
plugins={
git
incr
}
source $ZSH/custom/plugins/incr/incr*.zsh
source ~/.zshrc//更新配置