源代码管理工具git的常用命令简介
有几个概念:
- 所有的改动必须先做add,然后在commit;不管是新增文件,修改文件,还是删除文件。
- HEAD指向的就是当前Branch的提交。
所以如果当前分支是master,那么HEAD就是指向master的提交;如果当前分支是<branch>,那么HEAD就是指向<branch>的提交。
建立SSH连接
这不是必须的,但是可以省去通过SSH访问时每次输入密码的过程。
包括两步:
- 在客户端生成证书
$ ssh-keygen -t rsa -C "<yourname>@<yourcompany>.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/<username>/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/<username>/.ssh/id_rsa.
Your public key has been saved in /home/<username>/.ssh/id_rsa.pub.
...
- 把证书公钥上传到git服务器
把/home/<username>/.ssh/id_rsa.pub的内容注册到git服务器上就行,这样在以后git访问可以使用SSH协议就不用输入密码。
代码迁出
迁出master分支
$ git clone https://<remote>/<repository>.git
如果前面添加过SSH验证,可以使用如下命令行,可以免去每次输入密码的步骤。
$ git clone ssh://<remote>/<repository>.git迁出指定分支,-b <branch>
$ git clone -b <branch> ssh://<remote>/<repository>.git
分支管理
- 创建本地分支:git branch <branch>
- 切换本地分支:git checkout <branch>
上述创建本地分支和切换本地分支可以合并成一条命令:
git checkout -b <branch>
即,创建并切换到本地分支。 - 推送本地分支到远程仓库:git push -u origin <branch>
注意,本地创建的分支对其他用户是不可见的,必须推送到服务端。-u选项标志保持本地和远端的跟踪关系。 - 从远程仓库获取分支:git pull origin <branch>
- 删除本地分支:git branch -d <branch>
- 删除远程仓库分支:git push origin :<branch>
分支名前的冒号代表删除,实际上删除远程仓库分支的命令等价于: git push origin --delete <branch>
而由于push命令的标准格式是:git push <remote> <localbranch>:<remotebranch>,当localbranch为空时,我们可以理解成把一个本地的空分支push到远程仓库代替远程分支,这变相就是要删除一个远程分支。
- 查看本地分支:git branch
- 分支合并:git merge <branch>
把分支<branch>合并到当前分支
远程管理
前面看到有一个词origin,这个是什么意思呢,就是代表一个远端服务器;远程管理可以查看并管理(添加,删除,修改)所有的远端服务器。
$ git remote
origin
$ git remote -v
origin ssh://<remote>/<project>.git (fetch)
origin ssh://<remote>/<project>.git (push)
从这里可以看到origin指向的是远程哪一个服务器地址。
pull和fetch
$ git pull origin <branch>
很多童鞋都推荐使用下面的两个组合命令来代替pull命令。
$ git fetch
$ git merge origin/<branch>
fetch的功能是从远程仓库下载分支到本地分支,merge再从本地分支合并到当前工作目录;在合并之前我们可以使用diff命令查看下载来的分支,和本地工作目录之间的差异,从而选择如何进行合并:
$ git log -p <branch>..origin/<branch>
revert和reset
这两个命令都是用来做回撤,比如发现前面做的方法不对,需要丢弃。
个人觉得git是最难用的源代码版本管理工具,太过于专业,功能太强大,以至于使用起来过于复杂,作为工具易用性是最主要的,这点git做的不好;不过git的revert/reset回撤功能确实是做的相当完美的,给程序员们纠正历史错误提供了很大的方便。
revert只回撤一个具体的commit,把指定commit的所有代码修改以相反的格式转换回来,并把所有回撤的文件以修改的方式存在在本地工作目录,用户可以继续修改这些文件,然后再做commit。
$ git revert 87504be
[master 984d412] Revert "Add fullname support"
2 files changed, 2 insertions(+), 2 deletions (-)
那么87504be就会被回撤,他的所有文件改动会显示在当前工作区。
而reset会回撤到历史上的某一个commit,这个commit之后的所有commit都会回撤(这和revert不同),参数--hard和--soft决定是否直接丢弃回撤后的代码改动,还是把所有的代码改动存在本地工作目录,用户可以继续修改这个改动,再做commit。
git reset --hard 87e18d9
这样87e18d9之后的所有commit都被丢弃,本地工作目录存放的是87e18d9时的代码。