关于git的一些介绍以及大部分用法,可以参考官方文档,本文只记录一些常用操作和一些比较难的操作。
git fetch和git pull对比
先用一张图来理一下git fetch和git pull的概念:
git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
git fetch origin
查找 “origin” 是哪一个服务器,从中抓取本地没有的数据,
git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull
= git fetch
+ git merge
,这样可能会产生冲突,需要手动解决。
git fetch用法
git fetch 命令:
git fetch <远程主机名>
//这个命令将某个远程主机的更新全部取回本地,
并且更新本地数据库,移动 origin/所有分支 指针指向新的、更新后的位置。
git fetch (后面不加参数)
// 这个命令与上面的命令相似,远程主机用的默认远程主机
如果只想取回特定分支的更新,可以指定分支名:
git fetch <远程主机名> <分支名> //注意之间有空格
最常见的命令如取回origin 主机的master 分支:
git fetch origin master
取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:
git log -p FETCH_HEAD
git pull 用法
前面提到,git pull 的过程可以理解为:
git fetch origin master //从远程主机的master分支拉取最新内容
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中
即将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:
git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略:
git pull origin dev
git push
git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名>
,例如 git push origin master,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。
如果远程分支被省略,如下则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push origin master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
git push origin:master
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
git push origin
如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push
,可以使用git branch -r
,查看远程的分支名
git push
git push 的其他命令
git push -u origin master
如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push,不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式,如果想更改设置,可以使用git config命令。git config –global push.default matching OR git config –global push.default simple;可以使用git config -l 查看配置git push --all origin
当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项git push --force origin
git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。git push origin --tags
//git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令
常用分支操作
git 本地分支操作
git branch //查看本地所有分支
git branch -r //查看远程所有分支
git branch -a //查看本地和远程的所有分支
git branch <branchname> //新建分支
git branch -d <branchname> //删除本地分支
git branch -d -r <branchname> //删除远程分支,删除后还需推送到服务器
git push origin:<branchname> //删除后推送至服务器
git branch -m <oldbranch> <newbranch> //重命名本地分支
/**
*重命名远程分支:
*1、删除远程待修改分支
*2、push本地新分支到远程服务器
*/
//git中一些选项解释:
-d
--delete:删除
-D
--delete --force的快捷键
-f
--force:强制
-m
--move:移动或重命名
-M
--move --force的快捷键
-r
--remote:远程
-a
--all:所有
git check -b <新分支名称> //新建分支并切换到新建分支
git branch -vv // 查看本地处于远程库中哪个
git 操作远程分支
把新建的本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名):git push origin <本地分支名>:<远程分支名>
,删除远程已有分支:git push origin --delete dbg_lichen_star
$ git branch -a
* dev
master
remotes/origin/dev
remotes/origin/master
推送到远程:
$ git push origin dev:dev2
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'dev2' on GitHub by visiting:
remote: https://github.com/runooboy/runooboy.github.io/pull/new/dev2
remote:
To github.com:runooboy/runooboy.github.io.git
* [new branch] dev -> dev2
结果:
$ git branch -a
* dev
master
remotes/origin/dev
remotes/origin/dev2
remotes/origin/master
删除远程已有分支:
$ git push origin --delete dev2
To github.com:runooboy/runooboy.github.io.git
- [deleted] dev2
结果:
$ git branch -a
* dev
master
remotes/origin/dev
remotes/origin/master
git stash暂存
git stash
保存当前工作进度,会把暂存区和工作区的改动保存起来。执行完这个命令后,在运行git status
命令,就会发现当前是一个干净的工作区,没有任何改动。使用git stash save 'message...'
可以添加一些注释。
git stash list
显示保存进度的列表。也就意味着,git stash
命令可以多次执行。
git stash pop [–index] [stash_id]
git stash pop
恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。git stash pop --index
恢复最新的进度到工作区和暂存区。(尝试将原来暂存区的改动还恢复到暂存区)git stash pop 'stash@{1}'
恢复指定的进度到工作区。stash_id是通过git stash list
命令得到的通过git stash pop
命令恢复进度后,会删除当前进度。
git stash apply [–index] [stash_id]
除了不删除恢复的进度之外,其余和git stash pop
命令一样。
git stash drop [stash_id]
删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度。
git stash clear
删除所有存储的进度。
注意
- git中两个不同分支同时修改了同一处(同一行)内容之后,只要两个分支修改后的内容一致,就不会产生冲突。