本文不适合初学者,仅仅提供命令目录简单解释或者当做操作手册使用,没有关于背景或者详细命令解释。



学习git总是断断续续的,而且基本都是现学现用,用过一段时间就忘记了一些常用命令,好记性不如烂笔头,我觉得还是得记录下来,以便于之后忘记了可以迅速的了解并且上手。


关于git的背景介绍之类的,就不多做介绍如果有需要了解请访问链接:

廖雪峰的git教程

下面正式开始

git pull 拉取代码

git push推送代码

  1. git init命令把这个目录变成Git可以管理的仓库,比如我们开始开发一个新的项目并且作为git的仓库,那么在这个目录下面就可以实行这个命令
  2. git add告诉Git,把文件添加到仓库
  3. git commit告诉Git,把文件提交到仓库,需要跟-m "解释",完整使用
    git commit -m "提交了哪些,用作干嘛的之类的"
    注:提交一个文件首先add,然后commit
  4. git status 是用来查询当前版本状态,比如有哪些add,哪些文件修改了之类的信息。
  5. git diff顾名思义就是查看difference,git diff 文件名.后缀
  6. git log 查看版本提交历史,这个可以用于回退历史使用。如下面
$ git log  

commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL

commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed

commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file

commit后面跟着一大串数字就是commit提交该次的id号码

可以显示的更加清晰请在后面跟上 --pretty=oneline 如图:

$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
  1. git reset --hard 回退版本,HEAD是当前版本,回退上一个是HEAD​,上上个是HEAD​^,以此类推,回退100个就是HEAD~100,当然也可以跟版本号码,git reset --hard 3628164 只需要前几位可以匹配到就可以了。
    --git reflog 如果你实在找不到版本,可以使用这个命令来找所有你输入的命令。
  2. git checkout --文件.后缀 ,指的是文件在工作区的修改全部撤销
  3. git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区,当我们用HEAD时,表示最新的版本。
  4. rm test.txt 删除文件test.txt,下面如果你确实要在版本库里面删掉就执行
    git rm test.txt,然后git commit -m "remove test.txt"。提交,如果删错了可以从版本库里面提取git checkout -- test.txt

创建SSH Key

由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要设置ssh key来建立两者之间的联系

ssh-keygen -t rsa -C "账号"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

  1. 建立与远程仓库的链接
    git remote add origin git@github.com:michaelliao/learngit.git
    添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
    下一步,就可以把本地库的所有内容推送到远程库上
    git push -u origin master
    把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

  1. git clone 地址 在本地克隆一个远程仓库

13.git checkout -b dev 创建分支dev,git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支:

$ git branch
* dev
master

当我们为完成dev的开发任务之后,我们开始进行合并到master分支中:

$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
  1. git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
    注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
    当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。
    合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).

关于分支这块的小结:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

  1. 合并分支遇到冲突,遇到冲突时候本地的冲突文件就会有乱码的地方,把乱码冲突的部分给处理好,重新add,commit即可
    解决之后可以使用git log来查看分支合并的情况。
    git log --graph --pretty=oneline --abbrev-commit

16.用git log --graph命令可以看到分支合并图。

17.通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

下面我们实战一下--no-ff方式的git merge

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

关于bug分支


  1. git stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。比如需要新开分支修改bug的时候,但是当前的分支还没有完成提交,这个时候就可以使用git stash暂存然后做修改bug的事情。
    那么当我们完成其他分支工作这时需要回到之前分支时候该怎么处理呢? 当我们切回分支时候,发现工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
git stash list
stash@{0}: WIP on dev: 6224937 add merge

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

$ git stash apply stash@{0}

关于Feature分支


软件开发中,总有无穷无尽的新的功能要不断添加进来。

添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

  1. git branch -d feature-vulcan 强制删除
    当我们新功能分支开发完毕准备合并,但是突然因为需求问题不想要了,要删除,发现使用-d是会报错无法删除的,这个时候就可以使用强制删除命令来删除分支。

其他的命令


  1. 要查看远程库的信息,用git remote,或者,用git remote -v显示更详细的信息

21.推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

​$ git push origin master​

如果要推送其他分支,比如dev,就改成:

​$ git push origin dev​