转载请注明出处:http://blog.csdn.net/crapulencezzz/article/details/53490185
关于Git的博客网上已经有很多,本篇也只是带你认识最基本,开发必备的一些Git命令。如果感兴趣可以去Git官网瞅瞅,当然本篇博客的指令参考自下面的博客:
- 廖雪峰:Git教程
- 阮一峰:Git远程操作详解
- 程序员头条:如何在Git中撤销一切
这里面尤其是廖老师的博客是最为详细的,推荐学习。本人也是通过这篇博客认识的Git。另外两篇是一些场景才能用到的命令,属于比较高级的功能了。
Git和SVN的区别:
- svn是集中式版本控制系统,必须有一个中央服务器存放版本库,也就是必须联网才能使用。而git是分布式版本控制系统,每个人的电脑里都有完整的版本库,中央服务器只负责交换大家的更改。
- git和其他版本控制系统如svn的一个不同之处是有暂存区的概念。git如果不先add到暂存区,就无法commit到版本库。
几个概念:
- 工作区(Working Directory)就是你在电脑里能看到的目录,比如你们项目里包含.git隐藏文件的文件夹其实就是一个工作区。
- 版本库(Repository)其实就是隐藏的.git文件。
版本控制的局限:
- 所有的版本控制系统,都只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。但是文本是有编码的,如果没有历史遗留问题,强烈建议使用UTF-8进行编码。
用法:
- ssh-keygen 生成密钥文件
- cat ~/.ssh/id_rsa.pub 显示公钥内容,需要把它复制给管理员,用来开放权限
上面两个虽然不是Git命令,但是新建项目添加成员时必备的指令。
- git config –global user.name “YOUR_NAME” 配置账号(去掉 –global 可以单独配置一个仓库的账号)
- git config –global user.email “YOUR_EMAIL” 配置邮箱(去掉 –global 可以单独配置一个仓库的邮箱)
- git init 在当前目录创建代码仓库,会生成一个隐藏的.git文件
- git add xxx 把要上传的文件添加到暂存区,可反复多次使用,添加多个文件
- git commit -m “xxx” 提交暂存区代码到本地仓库的当前分支,必须添加注释
- git status可以让我们掌握工作区当前的状态,比如哪些文件改动过了
- git diff 查看具体修改的内容
- git log 显示从最近到最远的提交日志,以便确定要回退到哪个版本,按q退出
- git log –pretty=oneline 同上,只是做了简化显示
- git reset –hard HEAD^ 回退到上一个版本
- git reset –hard 指定版本的commit id指定回到某个版本
- git reflog 记录每一次跟版本有关的命令,以便确定要回到未来的哪个版本
- git checkout – 可以丢弃当前工作区的修改,总之就是回到最近一次git commit或git add时的状态
- git checkout . 丢弃当前工作区的所有修改,注意用之前一定要使用git status查看一下工作区的状态(注意这里有个“.”的!)
- git reset HEAD 可以把暂存区的修改回退到工作区
- git rm 从版本库删除文件
- git remote add origin git@server_name:path/repo_name.git 关联远程仓库
git remote add origin git@github.com:dysaniazzz/learngit.git 关联远程的git仓库,注意dysaniazzz是你自己的GitHub账户名,learngit是你自己的仓库名
- git push -u origin master 将当前分支内容提交到远程master分支(第一次提交,远程仓库是空的,所以我们加上了-u参数)
- git push origin master 将当前分支的内容提交到远程的master分支(后续提交)
1、当第一次使用git clone或者git push命令连接GitHub时,会得到一个警告,这时候输入yes回车即可,其实是把GitHub的key添加到本机的一个信任列表里。以后再提交就不会出现警告了。
2、如果是从零开始出发,那么最好的方式是先创建远程库,然后从远程库克隆。
- git branch 查看本地所有分支以及当前处在哪一分支
- git branch -a 查看所有分支(本地+远程)
- git branch 创建分支
- git checkout 切换分支
- git checkout -b 创建并切换分支,相当于git branch 和git checkout
- git merge 合并branch_name分支到当前分支
- git branch -d 删除branch_name分支
- git brach -D 强行销毁branch_name分支,比如该分支内容尚未合并到主分支就要将其删除时可以使用,慎用!
- git log –graph –pretty=oneline –abbrev-commit 类似图形化的显示每次提交及分支情况
- git stash 将工作现场储藏起来,等以后恢复现场后继续工作(比如线上报了一个bug,需要紧急处理,这时候需要新建一个bug分支,然后切过去修改,但是手头的工作只进行到一半还无法提交,就可以使用这个命令)
- git stash pop 恢复工作现场后并将stash内容删除
- git stash list 查看版本库里所有的stash
- git remote 查看远程分支的信息
- git remote -v 查看远程分支的信息,更详细,比如显示push和fetch的地址和权限
- git push origin 将branch_name分支的内容推送到远程分支
注意:并不是一定要把本地分支往远程推送!
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送到远程,视需求和心情而定!
- git tag 给当前分支的最新一次commit打上tag(可以根据需要切换branch和commit)
- git tag 查看所有标签(不是按时间排序,而是按字母排序)
- git tag 给某一次commit打上tag
- git show 查看标签信息,即其对应那一次commit的内容
- git tag -a -m 给某一次commit创建带有说明的标签,-a指定标签名,-m指定说明文字
- git tag -d 删除对应的标签
- git push origin 推送某个标签到远程
- git push origin –tags 一次性推送全部尚未推送到远程的本地标签
- git push origin :refs/tags/ 删除推送到远程的标签(需要先删除本地标签,执行git tag -d )
每发布一个版本时,可以把最后一次commit设一个容易记住且有意义的tag,比如v2.3,让它跟commit绑定到一起,这样版本回退到某一个版本时可以使用tag很容易查到commit。
- git clone 克隆某个项目到本地硬盘(如果是别人的项目,需要先fork到自己的仓库,然后克隆自己仓库的地址才可以正常提交,否则没有权限,无法修改)
- git config –global color.ui true 让Git命令显示出的命令带有颜色
- git chek-ignore -v 如果一个文件无法add,可以用这个命令查看是否在.gitignore中配置了
- git config –global alias. 给一个命令配置别名,比如git config –global alias.st status
来一个更加丧心病狂的: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"
场景:
1、撤销未提交的修改:
- 只适用于还没有进行add命令的文件:比如我们修改了MainActivity里的一些代码,但是还没有提交,这时候就可以使用git checkout命令来撤销修改
git checkout src/com/example/providertest/MainActivity.java
- 对于已添加的文件我们应该先对其取消添加,然后才可以撤回提交,取消添加使用git reset命令:
git reset HEAD src/com/example/providertest/MainActivity.java
这时候运行git status发现文件变成未添加状态,再运行git checkout就可以撤销修改了。
2、对于一个版本库如何从HTTPS迁移到SSH:
D:\Space\ASSpace\DysaniazzZ>git remote -v
origin https://github.com/DysaniazzZ/HelloAndroid.git (fetch)
origin https://github.com/DysaniazzZ/HelloAndroid.git (push)
D:\Space\ASSpace\DysaniazzZ>git remote set-url origin git@github.com:DysaniazzZ/HelloAndroid.git
D:\Space\ASSpace\DysaniazzZ>git remote -v
origin git@github.com:DysaniazzZ/HelloAndroid.git (fetch)
origin git@github.com:DysaniazzZ/HelloAndroid.git (push)
3、一台电脑配置两个账户,比如一个工作一个自己的GitHub,教程:http://notes.seirhsiao.com/2016/01/24/2014-09-30-github-multiple-account-and-multiple-repository/
4、Host Key Verification Failed的解决办法(不能连接到远程的GitHub仓库),教程:http://stackoverflow.com/a/29380765/6482350。也可以执行下面的命令:
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
5、Git分支与合并:假设有两个分支,m1分支和m2分支(本地和远程都有)。我们在m1分支写代码,由于要修复一个bug,我们开辟了一个m2分支,修改测试完毕后需要合并到m1分支上。我们需要先在m2分支上提交到m2的本地和远程,然后切换到m1分支上,先更新代码,然后merge m2分支到m1分支。最后push到远程的m1分支(千万别忘了还要push到远程,在AS的VCS–>Git–>Push中)
6、Git Stash:适用于当一个分支正在写一个功能,但是还没有弄完,这时候需要去另外一个分支处理 bug,而你又不想提交,因为当前分支的功能还没有实现完。这时候就可以使用 git stash 命令来临时储藏代码,当在另外分支改完 bug 切回来后,就可以使用 git stash pop 取出储藏的内容。
教程:https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%EF%BC%88Stashing%EF%BC%89
7、撤销更改:
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file_name。
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file_name,就回到了场景1,第二步按场景1操作。
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可以回退版本,不过前提是没有推送到远程库。