git是目前很强大且应用最广泛的版本控制系统。本文对git中最常用的操作命令做了一些总结。
配置ssh
使用http方式访问远程仓库时,pull、push这些操作都需要输入用户名和密码,很繁琐,使用SSH 公钥来进行授权会很方便。
在git配置SSH步骤如下:
生成ssh key
在terminal中输入以下:
ssh-keygen -t rsa -C "email@address.com"
会提示你输入密码,这个密码用来设置访问key的密码,可以为空。
之后在~.ssh这个目录会生成id_rsa和is_rsa.pub两个文件;
添加公钥到你的帐户,以github为例:
首先打开is_rsa.pub,拷贝所有信息;拷贝的时候最好使用cat,然后cmd + c或者pbcopy命令。用文本编辑器打开可能会产生多余的字符,导致校验错误。
登陆github帐户,点击头像进入profile setting -> 点击 SSH and GPG Keys -> 点击 New SSH key ,填写title和key。
测试你的ssh key是否正常使用:
ssh -T name@github.com
配置git
初始化git目录
git init
在你需要初始化的目录下输入init命令,即可生成.git目录,目录中有HEAD, config, description三个文件和branches, hooks, info, objects, refs五个文件夹。一个仓库便初始化完成了。
克隆已有的仓库
git clone
当你在github或者gitlab等平台手动创建仓库后,系统会再服务器上自动初始化完成仓库。之后调用clone命令就可以将远程的仓库克隆一份在本地。我们常说git是分布式版本控制,其分布式体现在去中心化。虽然日常使用中都有一个中心仓库,但每一个克隆下来的仓库都是一个完整的镜像,而每个仓库的地位都是平等的。
设置远程仓库地址
git remote set-url origin git@github.com:someaccount/someproject.git
如果本地init的仓库需要推送到新的远程仓库,或者要改变当前仓库的远程url,使用上述命令。
查看当前的远程地址:
git remote -v
config设置
git config --system 配置全局属性
git config --global 配置当前用户属性
git config --local 配置当前版本库,缺省值
git config -l 查看所有属性
git config user.name <username>
git config user.email <email>
git config core.editor vim
git config core.color auto
初始化完成仓库以后,我们常用的就是设置下自己的名字和邮箱等。使用git config -l 查看所有的属性,也可以直接对某个属性设置值。
git的使用
分支操作
git branch 将本地的分支打印出来
git branch -r 打印远程所有分支
git branch -a 将本地和远程所有分支打印出来
git branch -D branchName 删除branchName分支
git checkout branchName 切换到branchName分支
git checkout -b branchName 在当前分支基础上新建一个branchName分支
最常见的操作就是切换分支了,上述命令可以方便地切换或者新建分支。
提交操作
git status 查看当前状态
git add . 把工作空间中所有修改(包括新建和删除)的文件添加到索引库中
git commit 把索引中所有的修改提交到本地
git commit --amend 以追加形式提交
git fetch 将远程仓库拉取到本地镜像中
git pull 将远程仓库拉取到本地镜像并且合并到本地分支中 git pull = git fetch + git merge
git pull --rebase 以rebase方式拉去仓库
git push origin branchName 将当前分支推送到远程仓库中
git的提交分为几个阶段:
- 加入索引:使用git add 命令将修改的文件加入到git的索引中,即受到版本控制了。
- 将索引内容添加到仓库中:使用git commit命令将索引中的内容添加到本地仓库,这条命令会产生一次提交记录,并且生成commit id。这条记录可以用来追踪历史的改动记录。
- 将本地仓库内容推送到远程:使用git push命令,将当前的分支上所有改动内容推送到远程仓库中。
合并操作
git merge branchName 将branchName分支合并到当前分支
git merge --squash branchName 将branchName中的所有commit合并为一个,并应用到当前分支
git cherry-pick commitId 将commitId对应的提交应用到当前分支
git rebase branchName:把你的当前分支里的每个提交(commit)回退,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把当前分支更新到branchName分支,最后把之前的补丁应用到当前分支上。
git可以方便地开新分支开发,完成后合并到主干分支。涉及到两个分支之间的合并操作主要有merge、cherry-pick、rebase三个操作。
回退操作
git reset commitId 如果想回到当前分支历史上任意一个commit,可以使用reset
git reset --hard commitId 与不加hard相比,不加hard虽然git上回退,但所有文件的修改都还保留;加hard连文件都会退掉。
git revert 撤销某次commit,但会将这次撤销也作为一次commit,即做一次反向修改。
reset和revert的区别是,reset是直接会退到历史版本,且删除此版本之后的所有修改;而revert是将某次commit做一个反向修改,并产生一个新的提交。