克隆远程库到本地:
1 2 3 4 5 6 7 | // 默认本地仓库名字与远程库一样 git clone https://github.com/jquery/jquery.git // 指定本地库名字为test git clone https://github.com/jquery/jquery.git test // git clone的仓库地址支持多种协议,通常使用最多的是http(s)和ssh协议,比如从GitHub上克隆仓库。 |
---|
该命令用于管理远程库,当clone远程库到本地时,远程库将被自动命名为origin
。
git remote
可以查询当前仓库下的所有远程库:
1 2 | $ git remote origin |
---|
git remote -v
可以查询当前仓库下的所有远程库对应的地址,一个远程库对应fetch和push两种操作,所以有两个地址。
1 2 3 | $ git remote -v origin git@github.com:jquery/jquery.git (fetch) origin git@github.com:jquery/jquery.git (push) |
---|
git clone -o
可以指定远程库的别名:
1 2 3 | $ git clone -o jQuery https://github.com/jquery/jquery.git $ git remote jQuery |
---|
其他操作:
1 2 3 4 5 6 7 8 9 10 11 | // 查看远程库的详细信息 git remote show <远程库别名> // 添加新的远程库 git remote add <远程库别名> <网址> // 删除远程库 git remote rm <远程库别名> // 重命名远程库的别名 git remote rename <原远程库别名> <新远程库别名> |
---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 创建本地分支 git branch <分支名> // 删除本地分支 git branch -d <分支名> git branch --delete <分支名> // 设置关联远程分支,新建的本地分支需要关联远程分支,被关联的远程分支要存在否则会报错 git branch --set-upstream-to=<远程库别名>/<远程分支名> <本地分支名> // 查看当前分支 git branch // 查看远程分支 $ git branch -r origin/master // 查看所有分支 // * master表明当前分支是master,对应的远程分支是origin/master $ git branch -a * master remotes/origin/master |
---|
用于检出分支,从当前分支切换到另一个分支。切换分支时,要注意已暂存的文件或者提交。
1 2 3 4 5 6 7 8 | // 切换到另一个已存在的分支 git checkout <分支名> // 基于当前分支创建并切换到新的分支 git checkout -b <新的分支名> // 基于远程分支创建并切换到新的分支 git checkout -b <新的分支名> <远程库别名>/<远程分支名> |
---|
该命令用于将远程库的更新拉取到本地库:
1 2 3 4 5 | // 获取远程库所有分支的更新到本地库 git fetch <远程库别名> // 获取指定分支的更新到本地库 git fetch <远程库别名> <分支名> |
---|
如果远程库的某个分支被删掉了,git fetch默认不会把这个删除操作同步到本地库,依然会看到被删掉的远程分支,这时候可以通过加上-p
或--prune
参数来将被删掉的远程分支更新到本地:
1 2 | git fetch --prune origin git fetch -p origin |
---|
该命令用于取回远程分支的更新,并将其合并到本地分支。
1 2 3 4 5 6 7 8 9 | // 取回并合并到指定的本地分支 git pull <远程库别名> <远程分支名>:<本地分支名> // 如果是合并到当前分支可以不需要指明本地分支名 // git pull相当于git fetch + git merge git pull <远程库别名> <远程分支名> // 指定rebase方式合并 git pull --rebase <远程库别名> <远程分支名>:<本地分支名> |
---|
git有两种合并方式:merge和rebase,这两个合并方式存在一定的区别,不能误用。
git add [参数] <路径>
用于将工作区的文件添加到暂存区,可以多次使用git add
命令将文件添加到暂存区中。暂存区中的文件可以通过git commit
一次性提交到本地仓库。
1 2 3 4 5 6 7 8 9 10 | // 将当前路径下修改的文件以及新增的文件添加到暂存区,不包括被删除的文件 git add . // 将当前路径下修改的文件和被删除的文件添加到暂存区,不包括新增的文件 // 相当于git add --update git add -u . // 将当前路径下的所有文件添加到暂存区,相当于上面两个命令的集合 // 相当于git add --all git add -A . |
---|
用于推送本地分支的更新到远程分支,用法与git pull类似。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 推送本地分支到远程分支,注意这里的两个分支名顺序和pull是相反的 git push <远程库别名> <本地分支名>:<远程分支名> // 远程分支名可以省略,会自动推送到有关联关系的远程分支(通常都是和本地分支同名的),如果该远程分支不存在则会新建远程分支 git push <远程库别名> <本地分支名> // 本地分支名可以省略,此时表示推送空分支到远程分支 // 即删除远程分支 // demo: git push origin :master git push <远程库别名> :<远程分支名> // 删除远程分支 // demo: git push origin --delete master git push <远程库别名> --delete <远程分支名> // 推送本地所有分支到远程库 // demo: git push --all origin git push --all <远程库别名> |
---|
在push时,如果远程库的分支版本更新,则会push当前分支失败,需要先git pull合并到当前分支(可能需要解决冲突),然后再重新push。或者可以使用--force
参数,强制覆盖掉远程分支,但是一般不建议这样做。
此外,git push不会推送tag,除非添加--tags
参数。
该命令用于将仓库代码回退到指定的版本,通常会带上--hard
参数。本地git仓库分为三个区域:工作区,暂存区和本地库。回退版本的命令有3个参数,与这三个区域有关。
--hard
回退版本后,本地库原本工作区和暂存区的文件将被清空,彻底变回指定版本的状态。
--soft
回退版本后,仅仅移动了本地库的指针,工作区和暂存区文件保持不变。
--mixed
回退版本后,本地库原本暂存区的文件将被清空。
可以通过实际情况来决定使用哪个参数,但在实际开发中,为了避免自己的工作成果被误删,最好先确保自己的改动已经提交到了本地库或者远程库。
对于误操作回退版本导致文件丢失的情况,可以参考这篇文章:关于git reset –hard命令!!!,未提交代码丢失找回
首先切换到需要回退的分支:git checkout <分支名>
。
然后用git reset
命令来回退到指定的版本,通常会带上--hard
参数:
1 2 3 4 5 6 7 8 9 | // 回退到上一个版本 git reset --hard HEAD^ // 回退到上上个版本 git reset --hard HEAD^^ // 每多回退一个版本,就多一个^ // 为了避免^太多,可以用~n来简化,n表示回退几次提交,默认是一次 git reset --hard HEAD~2 |
---|
此外,也可以用commit id来回退到指定的版本。仓库的每次提交都会为其生成一个唯一的id(40位哈希值),可以通过git log
来查看每个提交对应的commit id。
在回退版本时,可以用这个commit id来指定回退到对应的提交,不需要指定完整的commit id,只需要前7位字符(short commit id)即可。
1 2 3 | // 比如仓库有一个提交:commit 26e1d228c71e69f0cb63fa73db8cc1ae3c6d8e87 // 现在回退到这一个提交时的版本 git reset --hard 26e1d22 |
---|
如果不放心这个手动截取前七位字符的short commit id,可以用以下命令来得到:
1 2 | git rev-parse --short 26e1d228c71e69f0cb63fa73db8cc1ae3c6d8e87 26e1d22 |
---|
Git的tag用于给某个分支的某个提交打上标签,可以理解为一个别名,类似于浏览器收藏某个网页作为书签。
通常tag用于标记某个阶段性的某次提交作为重要节点,比如release了某个版本等。因为commit-id本身很长,不利于记忆,将这个commit打上tag,如v1.0.0
等,以后就可以直接搜索这个tag来快速切换到对应的代码。
1 2 3 4 5 6 | // 列出所有标签 git tag // 使用-l或--list查询指定的标签 // 查询条件区分大小写,可以使用通配符,如* git tag -l "v1.0.*" |
---|
创建标签如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 创建标签:分为轻量标签(lightweight)和附注标签(annotated) // 轻量标签只是对某个commit的引用 // 附注标签是存在在Git数据库中的一个完整对象,包括了打标签者、打标签时间、标签的附注信息等额外的信息。 // 可以通过git show <标签名>来看到这两种标签的信息 // 创建附注标签 git tag -a <标签名> -m "<备注信息>" // git tag -a v1.4 -m "my version 1.4" // 创建轻量标签,不需要指定任何参数 git tag <标签名> // git tag v1.4 // 上面都是对当前分支最新的commit创建标签,也可以对过去的某个commit打tag git tag -a <标签名> <commit-id> // git tag -a v1.4 26e1d22 |
---|
其他操作如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // git push默认不会把tag推送到远程库(但是pull默认会获取tag),需要显示推送标签,操作和推送分支一样 // 推送指定的标签到远程库 git push <远程库别名> <本地标签名> // git push origin v1.4 // 使用--tags参数来一次性推送所有不在远程库的标签 git push <远程库别名> --tags // git push origin --tags // 删除标签需要-d参数 git tag -d <标签名> // git tag -d v1.4 // 删除远程库标签有两种方式 // 方式一:将空标签推送到指定的远程库标签 git push <远程库别名> :refs/tags/<标签名> // git push origin :refs/tags/v1.4 // 方式二:使用--delete,需要Git版本大于v1.7.0才能使用 git push <远程库别名> --delete <标签名> // git push origin --delete v1.4 // 检出标签 // tag是快照读,直接检出到指定的tag会使仓库处于detached HEAD状态,此时不能更改代码 // 如果需要回到某个tag并修改代码,需要创建对应的分支。当在该分支上提交后,可能需要一个新的tag来标注最新的提交 git checkout -b <新建分支名> <标签名> // git checkout -b version1.4 v1.4 |
---|