创建一个版本库
$ mkdir learngit
$ cd learngit
$ git init
创建一个文件
$ touch readme.txt
$ git add readme.txt
$ git commit -m "wrote a readme file"
查看版本库当前状态
$ git status
查看修改内容
$ git diff readme.txt
提交修改的文件
$ git add readme.txt
$ git commit -m "add distributed"
查看日志
$ git log
$ git log --pretty=oneline
回退版本(HEAD~)上个版本(HEAD~~)上上个版本(HEAD~100)上100个版本
$ git reset --hard HEAD~
记录每一个命令
$ git reflog
回退到版本(3628164)版本号可以通过核查上面的命令找到
$ git reset --hard 3628164
Git跟踪并管理的是修改,而非文件,add是将文件放置到暂存区,commit是将暂存区的文件提交,同一个文件中A修改成B然后add,再修改成C,再commit,这是分支上存储的是B,本地工作区存储的C.
撤销工作区的修改(--)很重要,如果没有就表示切换到另一个分支
$ git checkout -- readme.txt
以上的命令只是撤销到没有放置到暂存区的状态,也就是add或者commit后的状态,对于已经放置到暂存区(add)的文件使用以下命令撤销
$ git reset HEAD readme.txt
$ git checkout -- readme.txt
删除文件
$ git rm test.txt
$ git commit -m "remove test.txt"
添加远程库
$ git remote add origin https://github.com/sunaogit/learngit.git
$ git push -u origin master (第一次)
$ git push origin master
从远程克隆
$ git clone git@github.com:sunaogit/gitskills.git
Git支持多种协议,包括https(每次要输入口令),但通过ssh支持的原生git协议速度最快。
使用ssh参考
分支管理
创建分支(-b)表示创建并切换
$ git checkout -b dev
或
$ git branch dev
$ git checkout dev
查看分支
$ git branch
切换分支到分支(master)
$ git checkout master
合并分支(把dev的成果合并到master上,当前在master分支)
$ git merge dev
合并分支如果存在冲突
$ git status (查看冲突文件)
修改冲突文件后再次提交
$ git add readme.txt
$ git commit -m "conflict fixed"
查看分支合并情况(查看分支合并图)
$ git log --graph --pretty=oneline --abbrev-commit
删除分支
$ git branch -d dev
强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
$ git merge --no-ff -m "merge with no-ff" dev
再查看分支是可以看到分支的历史合并情况,如果不禁用,那么分支合并图上是没有显示的。
Bug分支
如果当前发现有bug需要立即修复,当前dev正在开发中,暂时不能提交,可以使用以下命令将工作区存储起来
$ git stash
$ git checkout master
$ git checkout -b issue-101
$ git checkout master
$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git branch -d issue-101
$ git checkout dev
$ git stash list
恢复工作区并删除stash,如果不删除使用apply代替pop
$ git stash pop
删除stash
$ git stash drop
多次回复stash,(stash@{ 0})使用list查看
$ git stash apply stash@{ 0}
删除未合并的分支,(-D)强制删除
$ git branch -D feature-vulcan
推送到远程仓库
$ git push origin master
origin使用一下命令查看
$ git remote
查看远程仓库详细信息
$ git remote -v
抓取远程分支(dev)
$ git checkout -b dev origin/dev
推送分支
$ git push origin dev
如果推送失败表示已经有人修改过分支,先将分支最新的提交抓取下来
$ git pull
如果抓取也失败,可能是本地(dev)和远程的分支(origin/dev)的链接没有指定
$ git branch --set-upstream dev origin/dev
然后再次抓取,如果存在冲突解决冲突后,在推送
$ git push origin dev
创建标签(标签是默认打在最新提交的commit上)
$ git tag v1.0
也可以打在指定的commitId(6224937)上,
$ git tag v0.9 6224937
查看commitId
$ git log --pretty=oneline --abbrev-commit
查看标签信息
$ git show v0.9
添加标签是带说明,(-a)指定标签名,(-m)指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 3628164
删除标签
$ git tag -d v0.1
推送标签到远程
$ git push origin v1.0
一次性推送未推送的所有标签
$ git push origin --tags
删除远程标签
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9
忽略特殊文件,创建
配置别名,以下配置后git st可以达到git status效果(--global)全局效果
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1'
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"配置文件(版本库)
$ cat .git/config
配置文件(全局)
$ cat ~/.gitconfig
删除别名直接在配置文件里删除对应的行即可
学习来自于