git的常见用法
一、基本介绍
Git
是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
1、安装
具体安装过程可见Git安装。
安装完成后需要配置用户信息,如下:
git config --global user.name "runoob"
git config --global user.email test@runoob.com
如果用了--global
选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目里使用其它名字或者电邮,只要去掉--global
选项重新配置即可,新的设定保存在当前项目的.git/config
文件里。
2、工作流程
- 克隆
git
资源到自己的本地,或者自己初始化一个git
仓库。 - 在本地进行修改、新增、删除。
- 将本地资源先放到暂存区然后提交到远程
git
仓库。 - 远程
git
仓库有更新时可以拉取最新代码。
上面我们有说到一个名词“暂存区”,在git
中有这么几个概念:
Workspace
:工作区,也就是我们的的编辑器目录。Index/Stage
:暂存区,一般存放在 ".git
" 目录下的index
文件(.git/index
)。Repository
:仓库区,也就是本地仓库, 也就是我们的.git
文件。Remote
:远程仓库。
二、常用命令
具体文档可见官网。
1、创建仓库
(1)、git init
在当前目录创建一个Git
仓库,该命令执行完后会生成一个.git
文件夹,通过ls -a
命令可以看到,该文件夹里主要是存放Git
仓库的一些信息。
(2)、git init [repository name]
新建一个文件夹,并将其初始化为一个Git
仓库。
(3)、git clone [repository url]
从指定路径的远程仓库将仓库克隆下来。
2、仓库配置
(1)、git config --list
显示当前的Git
配置。
(2)、git config [--global] user.name "[name]"
设置提交仓库时的用户名。
(3)、git config [--global] user.email "[email address]"
设置提交仓库时的用户邮箱。
3、仓库分支管理
(1)、git branch
列出当前工作目录的全部本地分支,分支名前面带“*”号的代表该分支为当前分支。
(2)、git branch -r
列出当前工作目录远程仓库的全部分支。
(3)、git branch -a
列出当前工作目录的全部分支(包括本地分支和远程分支)。
(4)、git branch [branch name] [origin branch name]
在指定的分支(不指定的话就默认是当前分支)基础上创建一个新的分支。
(5)、git checkout [branch name]
切换到指定的分支。I
(6)、git checkout -b [branch name] [origin branch name]
该命令是上两条命令的合体,在指定的分支(不指定的话就默认是当前分支)基础上创建新的分支并切换到该新分支。
(7)、git branch -m oldBranchName newBranchName
、 git push --delete origin oldBranchName
、git push --set-upstream origin newBranchName
修改指定分支的名字。
(8)、git branch -d [branch name]
删除指定的本地分支。
(9)、git push origin --delete [remote branch name]
删除指定的远程分支。
(10)、git branch --set-upstream [branch name] [remote branch name]
在指定的本地分支和远程分支之间建立追踪关系。
3、仓库内容操作
(1)、git add [file1] [file2] ...
将指定文件添加到暂存区。
(2)、git add [dir]
将指定文件夹添加到暂存区。
(3)、git add .
将当前工作目录的所有文件都添加到暂存区。
(4)、git commit [file1] [file2] ... -m [message]
将指定的暂存区文件提交到本地仓库,message
是提交信息。
(5)、git commit -m [message]
将暂存区内容提交到本地仓库,message
是提交信息。
(6)、git commit -am [message]
git add
和git commit
两个命令的合体,将当前工作目录的所有文件都添加到暂存区,并提交到本地仓库,message
是提交信息。
(7)、git push [远程主机名] [本地分支名]:[远程分支名]
例如:git push origin master
的意思就是将本地的master
分支提交到origin
主机的master
分支,并与之合并。由于本地分支名和远程分支名相同,所以省略了冒号。git
默认把远程主机名命为origin
。
(8)、git push [远程主机名] :[远程分支名]
例如:git push origin :master
,如果省略了本地分支名,则相当于删除了指定的远程分支,因为这相当于提交了一个空的分支。
(9)、git push [远程主机名]
例如:git push origin
,将本地当前分支的代码提交到远程origin
主机同样名字的分支,并与之进行合并。
(10)、git push
远程主机名在远程主机名相同的情况下也可以省略,将本地当前分支的代码提交到远程同样名字的分支,并与之进行合并。
(11)、git push -u [远程主机名] [远程分支名]
将本地分支与远程分支建立关联,并推送所有内容
(12)、git pull [远程主机名] [本地分支名]:[远程分支名]
例如:git pull origin master
的意思就是将远程origin
主机的master
分支下拉到本地,并与本地的master
分支合并。由于本地分支名和远程分支名相同,所以省略了冒号。git
默认把远程主机名命为origin
。
(13)、git push [远程主机名]
例如:git pull origin
的意思就是将远程origin
主机的分支(与本地当前分支分支名相同)下拉到本地,并与本地的当前分支合并。
(14)、git pull
远程主机名在相同的情况下也可以省略,将远程origin
主机的分支(与本地当前分支分支名相同)下拉到本地,并与本地的当前分支合并。
(15)、git fetch [远程主机名][分支名]
例如:git fetch origin master
的意思就是将远程origin
主机的master
分支下拉到本地。
(16)、git fetch
取回远程主机所有分支的更新。
(17)、git merge [branch name]
将指定分支的代码合并到当前分支。如果合并后有冲突,可使用git merge --abort
命令终止合并。
(18)、git rebase
rebase
即变基,改变基准点,假如从master分支的最新节点“1”拉出feature分支,feature分支上有两次新的提交“2,3”,master分支也有两次新的提交"4,5",这个时候如果在feature分支上执行git rebase master
,则会先提取feature分支上不同于两个分支共同节点上的改变“2',3'”,然后将feature分支的基点改为"5",再将“2',3'”应用到新的基点上,目前节点为“1,4,5,2',3'”。这种情况下rebase成功之后,会显示有2个待拉取,四个待推送,如果是你个人的开发分支,这个时候可以执行git push --force origin feature
。强制推送,用本地的分支状态覆盖掉远程。但是如果是公共分支的话,强制推送会导致其他同事的代码丢失,这个时候可以使用git push --force-with-lease origin feature
,该命令在强制覆盖前会进行一次检查,可以避免代码被盖掉的风险。
git rebase
有两个常见用法,一是通过rebase
命令合并多个commit
;二是类似merge
命令,对代码进行合并,与merge
不同的是,merge
合并后会生成一个新的commit
,而rebase
是将之前的commit
应用到你的分支上,所以并不会产生新的commit
。如果合并后有冲突,可使用git rebase --abort
命令终止合并。
具体可见关于merge和rebase的区别。
具体可见关于rebase合并多个commit。
git rebase详解(图解+最简单示例,一次就懂)
(19)、git remote
列出所有的远程主机名称。
(20)、git remote -v
列出所有的远程主机名称加地址。
(21)、git remote add [远程主机名] [仓库地址]
将本地仓库与指定远程主机的仓库相关联。
(22)、git remote set-url --add [远程主机名] [仓库地址]
不额外添加远程仓库,而是给现有的远程仓库添加额外的地址。
与上一条命令的区别可见本地Git仓库关联多个远程仓库的两种方法。
(23)、git remote rm [远程主机名]
取消本地仓库与指定远程主机的关联。
(24)、git remote rename [原主机名] [新主机名]
用于给远程主机的重命名。
(25)、git checkout -- [filename]
回退工作区的修改内容,不可逆操作
(26)、git reset HEAD
回退暂存区的修改内容
(27)、git reset HEAD^
回退所有内容到上一个版本
(28)、git reset HEAD^ [filename]
回退某文件到上一个版本
(29)、git reset --mixed [commit id]
回退到指定版本,只保留源码,回退commit和index信息。
(30)、git reset --soft [commit id]
回退到指定版本,本地的源码也会变成该指定版本的内容,当前版本的内容不会丢失。
(31)、git reset --hard [commit id]
回退到指定版本,本地的源码也会变成指定版本的内容,当前版本的内容会丢失。
(32)、git push -f
git reset
都是回退本地仓库的版本,若想同时回退远程的版本,则需要把本地内容进行强推。
(33)、git merge -s recursive -X theirs branch-name
merge
时如果产生很多冲突,都需要选择取传入的代码,可以使用该命令一键解决冲突
4、仓库查看
(1)、git status
查看当前分支的状态,文件是否需要add,commit或者delete。
(2)、git status --porcelain
查看改动过后待提交的文件。
(3)、git log
显示当前分支的版本历史。
(4)、git log --stat
显示当前分支的版本历史,以及每次版本的变动。
(5)、git log -S [keyword]
根据关键字搜索提交历史。
(6)、git tag
列出所有的tag
。
(7)、git tag [tag]
新建一个tag
在当前commit
。
(8)、git tag [tag] [commit]
新建一个tag
在指定commit
。
(9)、git tag -d [tag]
删除本地的指定tag
。
(10)、git push origin :refs/tags/[tagName]
删除远程的tag
。
(11)、git show [tag]
查看指定tag
的信息。
(12)、git push [remote] [tag]
提交指定tag
。
(13)、git push [remote] --tags
提交所有的tag
。
(14)、git checkout -b [branch] [tag]
新建一个分支,指向某个tag
。
5、分支内容保存、回退等命令
可参考Git不要只会pull和push,试试这5条提高效率的命令
Git 储藏(stash)详解
三、参考文章
1、Git使用小记
2、Git常用命令及方法大全
3、git rebase的两种用法
4、git rebase使用技巧
5、Git如何撤销提交(命令行+IDEA)