git常用命令笔记

gitLinus为了管理linux内核代码而编写的一个超强的分布式版本控制系统,一般以命令行的方式使用。若你是代码工作者,使用git可以大大提高你的工作效率和机动性。

版本控制系统通俗点就是假设你的一个源码根目录现在被git控制了,那么你的所有源码版本(什么V1.00,V2.00,包括正在debug的版本,临时版本,发布版本)都在一个目录下面了,git可以轻松地切换版本比较版本之间的差异,以及将源码给git服务器托管(比如无人不知的github),又或者可以利用git代码合并功能进行多人协作。妈妈再也不用担心你为管理代码而烦恼了。

这里只是做一些常用命令的笔记,如果要系统性地学习git可以参考廖雪峰的git教程

准备工作

安装git

  • 如果使用windows,到git官网下载windows版本的git;
  • 如果使用linux,安装git没有问题。最好是安装最新版的git:https://github.com/git/git
    下载源码编译安装git。

配置用户

要先配置用户信息才能正常使用:

1
2
$ git config --global user.name '你的靓名'
$ git config --global user.email '你的邮箱'

配置别名

磨刀不误砍柴工,先不急着使用git,把一些难敲的命令配置一下别名,可以用别名代替复杂命令。

1
2
3
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.lg "log --graph --pretty=oneline --abbrev-commit"

基本使用

创建版本库

可以在非空目录下(比如源码根目录)创建git版本库:

以下命令都需要在源码根目录下执行。

1
$ git init

查看git状态

查看git状态,有哪些文件已经发生了修改,有哪些文件已经被加入暂存区(被加入暂存区的文件才能提交):

1
$ git st

将文件加入暂存区

已经发生修改的文件(包括新增的文件和删除的文件),可以将其加入暂存区。一般就直接把整个目录加入暂存区就行了。

1
$ git add .

提交版本

将修改加入暂存区后,可以将其提交,这样就产生了一个版本:

1
$ git commit -m '版本说明'

版本说明一定要认真写,不然以后就不知道哪个节点是哪个版本了,还是很乱。

查看版本历史

1
2
3
4
5
6
$ git lg
* 22330cc (HEAD -> my-hexo-theme, origin/my-hexo-theme, origin/HEAD) add archives
* c44db62 add some effects
* bdca153 fix href stype
* bebd9e3 sth. not important
* a2ab1ab sth. not important

HEAD指针指向当前工作区的版本,HEAD -> my-hexo-theme就表示当前工作区版本为my-hexo-theme,这个版本的分支名为my-hexo-theme,版本id为22330cc,后面的add archives就是当初提交时填写的版本说明

比较版本

可以通过命令轻松的比较两个版本之间的差异:

1
$ git diff 较老版本 较新版本

“较老/较新版本”可以填:

  • 分支名
  • 版本id
  • HEAD^,HEAD^^等等(几个^就是HEAD回退几个版本)
    也可以直接简写git diff也就是git diff HEAD 工作区,就是比较当前修改和最近提交的版本。

版本切换

1
$ git reset --hard 版本

同样,“版本”可以填:

  • 分支名
  • 版本id
  • HEAD^,HEAD^^等等

分支管理

  • git最强大的就是分支功能了。有了分支功能,我们可以在好几个分支上进行开发或调试(在master分支上进行版本发布,在dev分支上进行开发,若有临时需求可以在dev分支上创建其他分支),可以应付各样的需求。
  • 其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

查看分支

查看本地分支

1
$ git branch

查看远程分支(例如github):

1
$ git branch -r

创建+切换分支

创建分支:

1
$ git branch 分支名

创建分支后我们往往会想切换到那个分支,所有一般直接创建+切换分支

1
$ git co -b 分支名

切换分支,也就是把HEAD指针指向某个分支:

1
$ git co 分支名

合并分支

1
$ git merge 分支名

这里要注意一下,合并分支时目标分支要比当前分支新,也就是说我们先git co 老分支git merge 新分支。其实分支合并就是把老分支的指针指向新分支而已(大部分情况)。

删除分支

我们把临时分支合并到主分支后,往往想要删除临时分支:

1
$ git branch -d 分支名

stash功能

当你在版本A的基础上开发一个新的功能,还无法编译使用。这时发现版本A有一个bug,要在版本A的基础上debug,这时就可以使用stash功能把新功能的代码给临时保存起来(直接提交一个版本也可以,但是这样就会多出一个毫无意义的版本):

1
$ git stash

现在工作区已经没有对于版本A的修改了,创建一个debug临时分支

1
$ git co -b debug

debug分支上处理bug,处理完成后提交debug分支

1
$ git comment -m 'fuck the bug'

切回原来的分支,比如dev分支

1
$ git co dev

stash保存的现场恢复,继续开发新功能:

1
$ git stash pop

这样的话敲几个命令就能省去拷贝好几份代码的麻烦,完美。

使用github

配置SSH Key

cd到主目录下,创建ssh-key:

1
$ ssh-keygen -t rsa -C "youremail@example.com"

上面的youremail@example.com就是你自己的邮箱,然后一路回车,完成后应该可以在主目录下找到.ssh目录,里面有id_rsaid_rsa.pub两个文件。
然后到你的github账号设置里,有一个SSH Keys的配置,把id_rsa.pub里面的文本添加进去就可以了。

克隆仓库

克隆也就是下载版本库。比如你要克隆bootstrap项目的源码:

1
$ git clone https://github.com/twbs/bootstrap

比如你要克隆自己的项目:

1
$ git clone https://github.com/你的用户名/仓库名

或者

1
$ git clone git@github.com:你的用户名/仓库名

添加远程仓库

先用你的github账号创建一个空的仓库,并指定仓库名;
然后添加远程仓库:

1
$ git remote add origin git@github.com:你的用户名/仓库名

origin是远程仓库在本地的名字,一般就是取origin,约定俗成。

推送本地仓库到远程仓库

一次推送只能推送一个分支:

1
$ git push origin 分支名

然后到你的github账号看看文件是否已经更新了。

拉取远程仓库到本地

假设你和别人共同开发一份代码,当别人push之后那么远程仓库就比你本地的仓库要新了,这时就需要拉取远程仓库到本地:

1
$ git pull origin 分支名

其实pull就是fetch+merge,将远程分支下载到本地后合并;
你可以选择先fetch看看别人写的辣鸡代码再决定是否合并,不想合并就把fetch过来的分支删除。

tips

修改tabwidth

1
git config --global core.pager 'less -x1,5'

更新到最新版git

1
2
3
4
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
git --version
-------------本文结束感谢您的阅读-------------