git使用文档
一、创建版本库
1、本地仓库
1、创建文件夹,使用该文件夹作为仓库根目录
1 | mkdir repo #创建文件夹,名字为repo |
2、通过git init
命令来初始化仓库
1 | git init |
2、远程仓库
1)查看远程仓库信息
1 | 查看关联的远程仓库的名称 |
- 添加远程仓库的关键
远程仓库的名称一般默认为 origin ,当然,你可以设置为其他的名称。
通过 git clone 下载项目到本地时,项目文件夹中的 .git 目录就是版本库目录。
.git 目录中的 config 文件中有远程仓库的关联配置。
1 | git_url 为你的远程仓库的 url,可采用 http 协议或 ssh(git) 协议 |
3)删除远程仓库的关联
1 | git remote remove <name> |
4)修改远程仓库的关键
方式一:
1 | git remote set-url origin <newurl> |
方式二: 先删除再添加
1 | 删除关联的远程仓库 |
方式三:直接修改.git
目录下的config
配置文件
二、提交文件
1、在 /home/power/root
下创建 test.txt
文件,并输入一些文字
1 | touch test.txt # 创建test.txt文件 |
2、使用 git add <filename | . >
文件添加到本地仓库
1 | git add test.txt |
完成,没有任何的输出。
git add filename
:将指定的文件添加到仓库
git add .
: . (点)用来代替当前文件及其子文件添加到仓库。
3、使用 git commit -m <message>
告诉 git 将使用 git add
命令添加的内容提交到仓库
1 | git commit -m "添加了新文件" |
-m
参数用于为本次提交添加评论,可以根据自己的情况添加更有意义的评论内容。
注:
git add
可以使用多次,多次提交仅需要使用一次 git commit
就可完成提交
三、版本回退
1、快照、版本
在 git 中,一次 commit
被称为一个快照(版本),下面让我们多次修改文件并提交。
版本1:添加了新文件
1 | this is a new file |
版本2:修改了文件
1 | this is a update file |
版本3:再次修改了文件
1 | this is a file with update |
2、查看提交记录
使用 git log
命令可以查看我们每次提交的ID、日期、提交人和评论。
1 | git log |
如果git log
命令执行后发现输出的内容过多,那么,我们可以通过添加 --pretty=oneline
来使得输出一行显示
1 | git log --pretty=oneline |
3、回退版本
在 git 中,用 HEAD
表示当前版本,也就是最新提交的ID为“ba26d28…”,上一个版本就是 HEAD^
,上上个版本就是 HEAD^^
,如果我们要会退到前100个版本,我们可以使用 HEAD~100
。这种方式也进适用于最近的几个版本之间回退。
git reset
命令用来回退版本。
1 | git reset --hard HEAD^ |
如果我们回退版本时发现自己回退错了版本,那怎么办?先让 git log
命令看看日志变化
1 | git log --pretty=oneline |
从日志中可以发现,第三版提交的记录居然不存在了,我们想要回到第三版怎么办?
git reset --hard <id>
可以帮助我们会退到第三版,前提是我们并没有关闭当前的命令行,可以从控制台的日志中找到第三版的ID。
1 | git reset --hard ba26d28 |
但是通过刚才的命令我们发现,第三版的ID是一长串内容,而我们只写了前几位,这样真的可以?答案是可以的。git 会通过给定的前几位去查找ID,如果查找的ID唯一,就正常执行命令。否则命令错误。
但是,如果我们关闭了当前控制台窗口,没办法在窗口中找到提交记录的ID怎么办?
总是会有办法的,我们可以使用 git reflog
查询到 git 指针的所有操作记录
1 | git reflog |
这样,我们就可以找到指定的版本号了。
4、查看当前文件状态
git status
可以查看当前工作区文件的状态。
1 | git status |
5、文件与版本库对比
git diff <id> -- <filename>
可以查看指定文件与版本库之间的差异
1 | git diff d4adfa4 -- test.txt |
6、撤销修改
git checkout -- <file>
可以将指定文件回退到最近一次 git add
或 git commit
状态
1 | git checkout -- test.txt |
如果我们已经通过 git add
将文件添加到缓存区,但还没有执行 git commit
命令,我们可以使用 git reset HEAD <file>
将缓存区的内容撤销掉,重新放入工作区。再次通过 git checkout -- <file>
将文件回退。
7、删除文件
git rm <file>
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
四、分支管理
1、创建分支
首先,我们创建dev
分支,然后切换到dev
分支:
1 | git checkout -b dev |
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
1 | git branch dev |
然后,用git branch
命令查看当前分支:
1 | git branch |
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
我们可以在当前分支上工作,工作完成后通过 git commit
进行提交
2、合并分支
现在,我们把dev
分支的工作成果合并到master
分支上:
1 | $ git merge dev |
git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev
分支的最新提交是完全一样的。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
用带参数的git log
也可以看到分支的合并情况:
1 | $ git log --graph --pretty=oneline --abbrev-commit |
3、删除分支
合并完成后,就可以放心地删除dev
分支了:
1 | $ git branch -d dev |
删除后,查看branch
,就只剩下master
分支了:
1 | $ git branch |
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。
注:如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
4、分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
下面我们实战一下--no-ff
方式的git merge
:
首先,仍然创建并切换dev
分支:
1 | $ git checkout -b dev |
修改readme.txt文件,并提交一个新的commit:
1 | $ git readme.txt |
现在,我们切换回master
:
1 | $ git checkout master |
准备合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
:
1 | $ git "merge with no-ff" dev --no-ff -m |
因为本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。
合并后,我们用git log
看看分支历史:
1 | $ git log --graph --pretty=oneline --abbrev-commit |
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
5、隐藏工作细节
git stash
可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
1 | git stash |
查看隐藏的工作空间
1 | git stash list |
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
1 | git stash pop |
你可以多次stash,恢复的时候,先用git stash list
查看,然后恢复指定的stash,用命令:
1 | git stash apply stash@{0} |
6、多人协作
- 首先用
git clone <path>
拉取分支 - 查看远程库信息
git remote -v
- 试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
7、美化提交线
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
1 | git rebase |
8、创建远程分支
- 新建本地分支
1 | git checkout -b dev |
- 将本地分支推送到远程
1 | git push origin dev:dev |
前一个dev是本地分支的名称,后一个dev是远程分支的名称
9、删除远程分支
方式一: 直接推送一个空分支到远程分支,相当于删除远程分支
1 | git push origin :dev |
方式二:指定--delete
参数
1 | git push origin --delete dev |
五、标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
1、创建标签
- 命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; - 命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息; - 命令
git tag
可以查看所有标签。
2、操作标签
- 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>
可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
六、自定义git
- 配置邮箱:
git config --global user.email <mail>
- 配置用户名:
git config --global user.name <name>
- 配置控制台颜色:
git config --global color.ui true
1、忽略特殊文件
- 忽略某些文件时,需要编写
.gitignore
; .gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理!git add -f <file>
强制添加文件git check-ignore -v <file>
检查配置文件错误,git会提示配置文件中的那条规则把指定文件排除了。
2、配置别名
git config --global alias.别名 命令
可以为命令配置别名。
--global
参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
3、配置文件
配置Git的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config
文件中:
1 | $ cat .git/config |
别名就在[alias]
后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
中:
1 | $ cat .gitconfig |
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
七、命令总结
命令 | 解释 |
---|---|
git init |
初始化仓库 |
git add <file> |
添加文件到临时区 |
git add -f <file> |
强制添加文件到临时区 |
git commit -m <msg> |
提交文件到分支 |
git reset --hard commit_id |
恢复文件到指定版本 |
git log --graph --pretty=oneline --abbrev-commit |
单行显示提交历史信息 |
git reflog |
查看命令历史 |
git status |
查看工作区状态 |
git rm <file> |
删除指定文件 |
git branch |
查看所有分支 |
git branch <name> |
创建分支 |
git checkout <name> |
切换分支 |
git checkout -b <name> |
创建 + 切换分支 |
git merge <name> |
合并分支 |
git merge --no-ff -m <msg> |
禁用快速合并并添加标签,分支历史看以看到分支信息 |
git branch -d <name> |
删除分支 |
git branch -D <name> |
强制删除分支 |
git stash |
保存工作现场并隐藏 |
git stash list |
查看隐藏的工作现场 |
git stash apply |
恢复工作现场,stash内容不删除 |
git stash apply <stash@{0}> |
恢复到指定的工作现场,stash内容不删除 |
git stash drop |
删除工作现场 |
git stash pop |
恢复工作现场,并删除stash内容 |
git stash pop <stash@{0}> |
恢复到指定的工作现场,并删除stash内容 |
git remote -v |
查看远程库信息 |
git push origin master |
将master分支推送到远程库 |
git clone <path> |
从远程库克隆信息 |
git pull <remote> <branch> |
抓取远程的新提交 |
git checkout -b branch-name origin/branch-name |
在本地床架和远程分支对应的分支,本地和远程分支的名称最好保持一致 |
git branch --set-upstream branch-name origin/branch-name |
建立本地分支和远程分支的关联 |
git rebase |
合并分支提交线 |
git tab <tagname> -m <msg> <commit-id> |
新建标签,默认为 HEAD,也可以指定一个 commit-id |
git tag |
查看所有标签 |
git show <tagname> |
查看标签信息 |
git tag -d <tagname> |
删除标签 |
git push origin <tagname> |
推送标签到远程 |
git push origin --tags |
一次性推送所有未推送的标签到远程 |
git push origin :refs/tags/<tagname> |
删除远程标签,需要先删除本地标签 |
git config --global user.email <mail> |
配置全局邮箱 |
git config --global user.name <name> |
配置全局用户名 |
git config --global color.ui true |
显示控制台颜色 |
git config alias.<aliasname> <commend> |
为commend配置别名为aliasname,复合命令要使用单引号包裹 |
git check-ignore -v <file> |
检查配置文件错误 |