初始化仓库
git --version
查看git版本git --help
查看帮助文档git init
初始化仓库ssh-keygen -t rsa -C "邮箱"
生成ssh密钥(密钥存放在用户主目录下的.ssh目录,其中id_rsa是私钥,id_rsa.pub是公钥,将公钥放在GitHub的ssh中)ssh -T git@github.com
测试连接git clone https://github.com/name/test.git
克隆远程库至本地git remote add origin https://github.com/name/test.git
关联远程库(https协议每次都要输入用户名和密码)git remote add origin git@github.com:name/test.git
关联远程库(ssh协议不用输入用户名和密码)git remote remove origin
取消关联git remote -v
查看远程版本库
config配置
git config --list
查看当前仓库的git配置git config --list --global
查看所有仓库的git公共配置git config name value
修改名为name的值为valuegit config --global alias.name name1
将名为name1的命令名别名为name(加–global代表全局)git config --global user.name 用户名
配置用户名git config --global user.email 邮箱地址
配置邮箱git config --global commit.template 模版地址
提交模版配置git config --global core.editor vim
默认编辑器配置
提交
git add filename filename2
将指定文件从工作区添加到暂存区git add .
将所有文件从工作区添加到暂存区git commit -m "提交信息"
将文件从暂存区提交至本地仓库git commit
将文件从暂存区提交至本地仓库(使用提交模版)git commit --amend
追加修改,不会新产生提交日志
文件差异
git status
查看当前文件修改状态git diff
查看工作区与暂存区差异git diff filename
查看某个文件工作区和暂存区差异git diff --cached
查看暂存区和本地仓库的差异git diff HEAD/HEAD^/HEAD^^...
查看工作区区和本地仓库的差异(上个版本是HEAD,上上各版本适HEAD^,再多就是HEAD~100)git show commitId
查看指定commitId的变更记录
日志查看
git log
查看所有提交日志git log --stat
查看所有提交日志,及其每次提交修改的文件git log --graph
查看所有提交日志,包含拉分支与合并操作git log --pretty=oneline
查看所有提交日志,每次提交信息显示一行,不限时提交时间和提交人git log --author=userName
查看某个人的提交日志git blame <file>
以列表形式查看指定文件的历史修改记录git shortlog
查看精简日志,以提交人分类,不显示提交日期和commitIdgit reflog
查看历史操作记录,包含reset、分支创建等等git reflog show --date=iso <branch name>
:查看分支创建时间
分支管理
git branch
查看当前所有本地分支(-r代表所有远程分支,-a代表所有远程和本地分支)git branch branchname
创建指定分支git branch -d branchname
删除指定分支git checkout branchname
切换到指定分支git checkout -b [本地分支名] [origin/远程分支名]
从指定远程分支创建本地分支,并切换到指定该分支,远程分支和本地分支建立关联git checkout -b branchname
从当前分支拉取指定分支,并切换到该分支git branch --set-upstream <本地分支名> <远程仓库名/远程分支名>
关联本地分支和远程分支git remote show origin
查看本地分支与远程分支映射
远程同步
git push -u origin master
推送至指定远程库的指定分支(-u是关联两个分支)git push -f origin master
强制push,不用解决冲突git push [远程主机名] [远程分支名]:[本地分支名]
推送制定本地分支到制定远程分支git fetch
将远程更新,全部取回本地,不会影响本地代码git pull [远程主机名] [远程分支名]:[本地分支名]
相当于fetch+merge,如果省略本地分支名,则表示pull到当前分支(非关联分支会产生merge记录)git pull --rebase [远程主机名] [远程分支名]:[本地分支名]
相当于fetch+rebase,并且不会产生merge记录,rebase操作具体参见【rebase目录】
merge
git merge branchname
把branchname分支合并到当前工作分支上git merge [远程主机名] [远程分支名]:[本地分支名]
merge指定远程分支到指定本地分支,如果省略本地分支名,则表示merge到当前分支git merge --no-ff branchname
普通合并,会在Log中记录合并历史git merge --abort
:抛弃合并过程并且尝试重建合并前的状态
回退
git checkout .
放弃所有文件本地修改git checkout --filename
放弃某个文件的本地修改git reset --soft HEAD~1
:回退本地仓库到暂存区,可以重新commitgit reset --mixed HEAD~1
:回退本地仓库到工作区,可以在工作区重新修改(默认参数)git reset --hard HEAD~1
:回退本地仓库,直接丢弃,所有区都不会有内容
暂存
git stash save "本次暂存的标识名字"
暂存当前修改git stash list
查看暂存记录git stash apply stash@{index}
恢复指定的暂存工作git stash pop stash@{index}
恢复指定的暂存工作,并删除暂存记录
patch
git diff > diff.patch
:生成工作区与当前分支的patchgit diff --cached > diff.patch
:生成暂存区与当前分支的patchgit apply diff.patch
:使用补丁
cherry-pick
git cherry-pick commit_id
:cherry-pick指定commit到当前分支git cherry-pick --abort
:抛弃cherry-pick过程
rebase
合并多个提交记录
//start是指更早的节点,前开后闭。如果不指定endpoint,则默认为HEAD。
git rebase -i [startpoint] [endpoint]
//合并前两个
git rebase -i HEAD~2
-i
是指交互式界面,具体操作如下:
- pick(p):保留该commit和注释信息
- reword(r):保留该commit,但需要修改该commit的注释,修改完成后会拼接多个commit的注释信息为一个
- edit(e):保留该commit, 但要修改该提交,不仅仅修改注释
- squash(s):将该commit和前一个commit合并,需要解决提交的注释信息冲突
- fixup(f):将该commit和前一个commit合并,不保留该提交的注释信息
- drop(d):丢弃该commit
合并分支为一条线
//相当于 merge branchName 分支到当前分支
git rebase branchName
其他注意
- github提交时需要修改gitconfig邮箱为登录邮箱