GIT介绍、GIT常用命令大全(一)
常见的版本控制工具有 GIT、SVN、VSS(Visual Source Safe)、CVS(Concurrent Versions System)、ClearCase、BitKeeper、PVCS 、StarTeam。我平时使用GIT比较多,只用过SVN的第三方工具TortoiseSVN,其他的没有使用过。GIT的学习推荐廖雪峰大神的GIT教程,地址:https://www.liaoxuefeng.com/wiki/896043488029600。他的教程对新手非常友好,分支管理、多人协作、冲突等等都有讲解。
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。GIT在linux系统下使用相当方便,推荐安装GITK配合使用,在Windows下推荐使用VisualSVN Server+TortoiseSVN,当然各有需求与喜好。
ubuntu16.04中安装GIT:sudo git apt-get install git 安装GITK:sudo git apt-get install gitk 安装好后,就可以在本地学习GIT使用,在本地可以学习服务端、客户端使用了。服务端地址写127.0.0.1
工作区与暂存区的介绍
在电脑里能看到的目录就是一个工作区
版本库的stage(或者叫index)是暂存区
Head指向master分支
命令中:<>表示可选填写 []表示选项必须填写 ()表示可以等价替换为()里内容 所有的命令可以通过git --help进行查询学习
本地操作:
0.初始化设置
git init <dir> 初始化当前目录仓库
git config --global user.name "username" 设置用户名
git config --global user.email useremail@qq.com 设置邮箱
git config user.name 查看用户名
git config user.email 查看邮箱
git config --list 查看其他配置信息(git设置列表)
1.暂存相关命令
git add [file] 提交某文件到暂存区([file]可以是文件名或目录名)
git add -A <path> 提交所有变化到暂存区,省略<path>表示.(即当前目录)
git add . 提交新文件和被修改文件(不包括被删除文件)到暂存区
git add -u <path> 提交被修改和被删除文件(不包括新文件)到暂存区,省略<path>表示.(即当前目录)
git add -i <path> 查看中被所有修改过或已删除文件但没有提交的文件,并通过其revert子命令可以查看<path>中所有未跟踪的文件
2.提交相关命令
git commit -m "message" 将在本地存储库的“add”中所暂存的更改提交,以及添加本次提交的描述message信息
git commit -a “message” 将在本地存储库已跟踪文件中的执行修改或删除操作的文件都提交,以及添加本次提交的描述message信息
git commit -am "message" 代表-a与-m命令作用都生效
git commit -v 显示HEAD已提交和本次将要提交的内容之间的统一差异与发生了哪些更改来帮助用户描述提交。
git commit --amend 进入vim,可以更改上次提交的描述信息进行保存
git commit --amend -m "updated last message" 更改上次提交的描述信息用updated last message替换并保存
3.撤销与回退命令
(1)撤销在工作区的修改的代码
git checkout -- [file] 丢弃某个文件本次修改
git checkout -- . 丢弃本次全部修改
注意:git checkout -- [file] 这里有两种情况:一种是<file>自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是<file>已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。git checkout – . 丢弃全部修改包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响,对commit提交到本地分支的代码就更没影响了.
(2)代码git add到缓存区,并未commit提交
git reset HEAD [file] 丢弃某个文件本次暂存
git reset HEAD . 丢弃本次全部暂存
(3)git commit到本地分支
git reset <选项> HEAD-1(HEAD^) 回到上次提交版本
选项:
-mixed (为默认参数,与不写效果一样)不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
--soft 不删除工作空间改动代码,撤销commit,不撤销git add .
--hard 删除工作空间改动代码,撤销commit,撤销git add . (即恢复到了上一次的commit状态)
(4)回退某一个版本
git reset <选项> <版本号> 回到上次某次提交的版本,版本号可以在git log查看
选项:
-mixed (为默认参数,与不写效果一样)不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
--soft 不删除工作空间改动代码,撤销commit,不撤销git add .
--hard 删除工作空间改动代码,撤销commit,撤销git add . (即恢复到了上一次的commit状态)
(5)回退到指定分支的HEAD,例如origin仓库dev分支的HEAD
git reset --hard origin/dev
4.查看命令
git status 查看当前工作区和暂存区文件的状态
git log 可以查看提交历史,以便确定要回退到哪个版本
git log --graph 可以看到分支合并图
git relog 查看命令历史,以便确定要回到未来的哪个版本
git stash list 查看储存的工作现场
git branch 不带任何参数,列出本地已经存在的分支
git branch -a 查看所有分支列表,包括本地和远程
git branch -r 查看远程版本库分支列表
git branch -v查看每一个分支的最后一次提交,可以运行
git branch -vv 可以查看本地分支对应的远程分支
git branch --merged 查看哪些分支已经合并入当前分支
git branch --no-merged 查看尚未合并进来的分支
git diff <filename> 比较工作区与暂存区之间的差异,也就是修改之后还没有暂存起来的变化内容
git diff <branch> <filename> 查看当前分支文件和另一分支的区别.
git diff --cached(--staged) <commit> <filename> 查看已经暂存区和指定commit提交之间的差异
git diff <commit> <filename> 查看工作目录同Git仓库指定 commit 的内容的差异
git diff <commit> <commit> Git仓库任意两次 commit 之间的差别
5.删除命令
git rm [file]删除暂存区和工作区文件,删除后需要提交git commit -m " remove file"
git rm --cached <file> 删除暂存区文件
git rm –r * 递归删除整个目录中的所有子目录和文件
6.分支操作命令
git branch [branchname] 创建名为branchname的分支,创建分支时需要是最新的环境,创建分支但依然停留在当前分支
git branch -m [oldName] [newName] 给某分支重命名
git branch -d [branchname] 删除branchname分支,如果在分支中有一些未merge的提交,会删除分支失败
git branch -D [branchname] 即使有未merge的提交, 也会强制删除branchname分支
git merge [branchname] 将某个指定分支合并到当前分支有冲突需先解决
git merge --squash [branchname] 将branchname上的所有提交已经合并到当前分支暂存区(再次执行commit命令提交)
git cherry-pick [branchcommit] 拣选另一条分支上的某个提交条目的改动提交到当前分支的暂存区(可以拣选多次,执行commit命令提交,branchcommit是某分支的commit id)
git cherry-pick -n [branchcommit1] [branchcommit2]... 拣选另一条分支上的多个提交条目的改动提交到当前分支的暂存区
git merge --no-ff -m "message" [branchname] 禁用Fast forward合并branchname分支,并添加描述信息
git checkout [branchname](git switch [branchname])切换到分支branchname
git checkout -m [branchname]切换分支检出失败时,会自动尝试合并(可能会冲突)后再切换到分支branchname
git checkout -b [branchname](git switch -c [branchname])创建并切换到分支branchname
7.保存工作现场
git stash 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash apply <stashname>恢复到 工作现场stashname(不输 <stashname>是恢复到最新储存的工作现场)
git stash drop删除工作现场 stashname
git stash pop恢复的同时也删除工作现场
git stash branch [branchname]从储藏中创建分支
8.Tag标签
git tag <-a 标签名> <-d 标签名> <-m 备注> ...
git tag 列出所有标签
git tag -l [匹配字符] l列出匹配字符的所有标签 -l 或--list ,如git tag -l “V1.8.5*” 列出包含“V1.8.5“
git tag -a [标签名] -m ["标签备注"] 创建附注标签,如git tag -a v1.4
git show [标签名] 可以看到标签信息和与之对应的提交信息,如git show v1.4
git tag [标签名] 创建轻量标签(不需要使用 -a
、-s
或 -m
选项,只需要提供标签名字)git tag v1.4
git tag -a v1.2
git log --pretty=oneline --abbrev-commit 对历史提交做tag处理git tag <tag_name> <commit_id>
git tag -d v1.0-beta # -d参数删除掉tag -d即--delete
git push origin :refs/tags/v1.0-beta # 本次删除后,删除掉远程仓库的tag,名称为v1.0的tag
git push origin v1.0-beta # 推送到远程仓库
git push origin v1.0-beta:refs/tags/v1.0-beta # 推送到远程仓库
git push origin --tags # 一次性推送全部尚未推送到远程的本地tags
git checkout 2.0.0 检出标签
git checkout -b version2 v2.0.0创建新分支并检出
git fetch --tags拉取所有标签
git pull --tags拉取并合并所有标签
与服务端GIT交互
0.创建仓库
git init --bare <dir> 当前目录创建一个裸存储库
1.克隆远程仓库
git clone [gitserver address] 将远程存储库master分支克隆到当前目录,目录名与远程仓库目录名相同
git clone -b [remote branch name] [gitserver address] 表示克隆名为remote branch name的这个分支
git clone [gitserver address] [ localbranchdir name]将远程存储库master分支克隆到当前目录,并重新定义本地目录名称为 localbranchdir name
2.增加与查看远程仓库
git remote add < localshortname> [gitserver address] 添加gitserver address远程仓库,可以指定一个简单的名字 localshortname指代gitserver address
git remote 查看所有的远程仓储名称
git remote -v 查看关联的所有的远程仓储名称及地址
git remote show [gitserver address] 将会显示出gitserver address远程仓库的详信息([gitserver address]可以用< localshortname>代替)
git remote rename [old localshortname] [new localshortname] 重命名远程仓库简称
git remote rm [gitserver address] 解除与远程仓库的关系
3.上传数据到远程仓库
上传数据到远程仓库一般形式为 git push <选项> <远程主机名> <本地分支名> <远程分支名>
git push [remote]推送当前分支到[remote]远程仓库
git push [remote] --force强行推送当前分支到远程仓库,即使有冲突
git push [remote] --all 推送所有分支到远程仓库(不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机)
git push [remote] [local branch]上传本地指定分支到远程仓库
示例:
git push 如果当前分支只有一个远程分支,那么主机名都可以省略,就可以推送当前分支到远程仓库
git push origin 如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
git push origin master 表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
git push origin :refs/for/master 推送一个空的本地分支到远程分支,等同于git push origin --delete master
4.下载数据到本地仓库
下载数据到本地仓库语法:git pull <选项> <远程主机名> <远程分支名>:<本地分支名>
git pull <远程主机名> <远程分支名>:<本地分支名>要取回远程主机的远程分支,与本地分支合并
git pull <远程主机名> <远程分支名> 取回取回远程主机的远程分支并与当前分支合并
git pull <远程主机名> 本地的当前分支自动与对应的远程主机的已建立追踪关系分支进行合并
git pull 当前分支自动与唯一的一个追踪分支进行合并
示例:
git pull origin next:master
git pull origin next
git pull origin
git pull
以上pull可以换成fetch
git fetch和git pull的区别:git fetch:相当于是从远程获取最新版本到本地,不会自动合并。git pull:相当于是从远程获取最新版本并merge到本地
git fetch origin mastergit
log -p master..origin/master
git merge origin/master
以上三行命令的含义:首先从远程的origin的master主分支下载最新的版本到origin/master分支上,然后比较本地的master分支和origin/master分支的差别,最后进行合并,用以下三行命令表示更清晰
git fetch origin // 同步远程所有分支到本地
git fetch origin master //仅同步远程master分支到本地
git fetch origin master:tmp
git diff tmp
git merge tmp
而git pull origin master命令其实相当于git fetch 和 git merge
5.远程分支操作
git branch -a 列出所有本地分支和远程分支
git branch --track [branch] [remote-branch] 新建一个分支,与指定的远程分支建立追踪关系
git branch --set-upstream [branch] [remote-branch] 在现有分支与指定的远程分支之间建立追踪关系
git branch -u [remote-branch] 当前分支与指定的远程分支之间建立追踪关系
git branch -dr [remote/branch] (git push origin --delete [branch-name]) 删除远程分支
git checkout -b [new branch] [start branch] 创建new branch分支并从start branch开始,start branch可以是远程的分支 (例如git checkout -b new_branch origin/xxx // 新建分支new_branch同步远程分支origin/xxx)
git checkout orgin/远程分支名 检出想要的远程分支
git branch orgin/远程分支名 创建远程分支
git checkout -b orgin/远程分支名 远程没有该分支,创建并检出
对于删除远程仓库文件或回滚远程仓库版本需谨慎,用ssh [远程仓库主机地址]登入确认后再操作较为安全如ssh gitserver@192.168.XXX