git命令功能总结
- 1.创建git的本地仓库
- [2. 配置本地仓库(name和email地址)](#2. 配置本地仓库(name和email地址))
- [3. 工作区、版本库、暂存区、对象区](#3. 工作区、版本库、暂存区、对象区)
-
- [3.1 add, commit](#3.1 add, commit)
- [3.2 打印提交日志](#3.2 打印提交日志)
- [3.2 修改文件](#3.2 修改文件)
- [4.版本回退(git reset)](#4.版本回退(git reset))
- [5. 撤销修改(在push之前撤销)](#5. 撤销修改(在push之前撤销))
- 6.删除版本库中的文件
- 7.分支管理
-
- [7.1 创建分支](#7.1 创建分支)
- [7.2 切换分支](#7.2 切换分支)
- [7.3 合并操作](#7.3 合并操作)
- 7.4删除本地分支
- [7.5 合并冲突](#7.5 合并冲突)
- [git log --graph 命令](#git log --graph 命令)
- [7.6 合并模式](#7.6 合并模式)
- [7.7 合并(修bug)模式](#7.7 合并(修bug)模式)
- [7.8 功能取消了!(删除分支)](#7.8 功能取消了!(删除分支))
- 8.远端仓库
-
- [8.1 克隆](#8.1 克隆)
- [8.2 提交到远端(本地新,远程仓库旧)](#8.2 提交到远端(本地新,远程仓库旧))
- [8.3 拉取远程仓库(本地旧,远程仓库新)](#8.3 拉取远程仓库(本地旧,远程仓库新))
- [9. <<.gitignore文件>>](#9. <<.gitignore文件>>)
- [10. 给命令取别名](#10. 给命令取别名)
- [11. 标签管理](#11. 标签管理)
-
- [11.1 打标签](#11.1 打标签)
- [11.2 删除标签](#11.2 删除标签)
- [11.3 将本地标签推送到远程仓库](#11.3 将本地标签推送到远程仓库)
- [11.4 删除标签](#11.4 删除标签)
- [12. 和远程仓库有关的命令](#12. 和远程仓库有关的命令)
-
- [12.1 查看远程仓库有哪些分支](#12.1 查看远程仓库有哪些分支)
- [12.2 在本地和远程仓库的分支建立连接](#12.2 在本地和远程仓库的分支建立连接)
- [12.3 将远程的dev合并到远程的master分支](#12.3 将远程的dev合并到远程的master分支)
- [12.4 远端如果没有自己创建的dev分支怎么办?](#12.4 远端如果没有自己创建的dev分支怎么办?)
- [12.5 本地只有dev分支和master分支,远端有dev1,dev2等分支,现在要在dev2上开发,怎么办?](#12.5 本地只有dev分支和master分支,远端有dev1,dev2等分支,现在要在dev2上开发,怎么办?)
- [12.6 有两个人分别在feature-1和feature-2上开发,怎么办呢?](#12.6 有两个人分别在feature-1和feature-2上开发,怎么办呢?)
- [12.7 删除远程分支](#12.7 删除远程分支)
- [13. **注意事项**](#13. 注意事项)
1.创建git的本地仓库
bash
git init
运行完之后就会出现了一个.git的隐藏目录(用来追踪和管理仓库的文件数据),代表初始化完毕。
2. 配置本地仓库(name和email地址)
- 设置命令
bash
git config user.name "xxx"
git config user.email "123456@qq.com"
- 查看命令
bash
git config -l
- 重置配置
bash
git config --unset user.name
git config --unset user.email
- 全局配置和删除(生效在该机器所有git仓库中)
bash
git config --global user.name "xxx"
git config --global user.email "123456@qq.com"
git config --global --unset user.name
3. 工作区、版本库、暂存区、对象区
图中左侧为工作区,右侧为版本库。在版本库中标记为"index"的区域是暂存区(stage,index),标记为"master"的是 master 分支所代表的目
录树。标记为"objects"的是对象区。
3.1 add, commit
-
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
-
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
bash
git add <文件名1> <文件名2>
git commit -m "备注信息"
3.2 打印提交日志
- 查看git提交日志信息
bash
git log
git reflog //查看每次提交的日志
- 每个日志只打印一行
bash
git log --pretty=oneline
- 在我们执行完add、commit之后,.git隐藏目录会出现如下信息字符串,这些字符串记录着我们修改的日志:
可以使用如下命令查看这些字符串的内容代表什么!
bash
git cat-file -p 0e6b1780b73cd9220ec5073dc64b42f7ad4bd945
其中master使用cat查看就可以了。
其中HEAD指向的是master,然后master里面存的是最新一次提交的id字符串!
3.2 修改文件
- 查看当前仓库状态
bash
git status
表示当前在暂存区没有修改的文件(连add都没有,更别说commit了),只是在工作区修改了。
-查看该文件到底修改了什么内容
bash
git diff <文件名>
因为当前目录只是在工作区修改的,所以执行add后再看看status:
commit后再看看status:
4.版本回退(git reset)
git reset本质是回退版本库的内容,工作区和暂存区会不会退,具体看reset后面的参数(soft、mixed、hard)
bash
git reset [--soft | --mixed | --hard] [HEAD]
git reset的参数:
- --soft 只回退版本库中的内容,对于暂存区和工作区不回退。
- --mixed 回退版本库和暂存区的内容,不回退工作区。(默认选项)
- --hard回退所有区域的内容。(慎用)
5. 撤销修改(在push之前撤销)
bash
git checkout -- <filename>
描述xxxcode是已经修改了的内容:
- 第一种情况是只在工作区修改了,如何撤销?
bash
git checkout -- <filename>
这样工作区的文件回到最近一次add/commit时的状态。
- 第二种情况是工作区暂存区都改了,如何撤销这次操作呢?
bash
#修改namefile到当前版本
# HEAD当前版本
# HEAD^上一个版本
git reset --mixed HEAD <namefile>
mixed将暂存区和版本库都修改了,所以此时就回到了情况1的场景,这样再运行checkout --就可以了。需要两步。 如何使用--hard选项就只需要一步,因为三个位置都到当前版本了。
- 第三种情况就是全部修改了,如何撤销呢?
bash
#回退到上一个版本HEAD^
# 全部回退hard
git reset --hard HEAD^
6.删除版本库中的文件
git add 本质上是提交修改(告诉哪个文件修改了),并不是添加文件。
- 普通版
bash
rm <namefile>
git add <namefile> #提交修改
git commit -m "delete namefile"
- 简化版
bash
git rm <namefile> #删除工作区和暂存区的文件
git commit -m "delete namefile" #在版本库也删除
7.分支管理
- 查看本地当前有哪些分支(master分支只要创建了就会有)
- HEAD一般来说指向master
bash
git branch
7.1 创建分支
- 创建一个dev分支
bash
git branch dev
示意图:
7.2 切换分支
- 切换到dev分支
bash
git checkout dev
示意图:
并且在dev分支commit之后,指针变化如图所示:
7.3 合并操作
将dev分支合并到master分支上,也就是让master也显示dev上更改的内容
- 先切换到master分支上,然后执行合并命令
bash
git checkout master
git merge dev
示意图如下:
7.4删除本地分支
只能在其他分支上删除dev(不能自己删除自己)
bash
git branch -d dev
7.5 合并冲突
创建并切换到dev分支
bash
git branch -b dev
-
如图场景所示:之前文件的内容是aaa,我在dev分支将aaa修改为ccc,在master将aaa修改为bbb,然后在master执行merge时,就会发生merge error。如下图
-
出错后,需要先fix冲突,然后再次将文件add和commit即可。
-
因为git不知道我们到底是需要ccc版本的还是需要bbb版本的,因此需要我们自己在ReadMe文件里面选择,=上面的是HEAD分支上的,下面是dev1分支上的,保留哪个删除哪个即可。下面是只保存bbb的代码(其他的全删除即可)。
然后再执行add 和 commit 之后再次merge即可!
示意图如图所示:
git log --graph 命令
graph是图形化分支的操作,然后abbrev-commit简化commit的字符串。
bash
git log --graph --abbrev-commit
如下图,最左边的图,表示了我们分支创建和合并的基本过程
7.6 合并模式
不使用Fast-Forward模式(我们要看到合并的示意图):
- 告诉git合并时不使用 noff模式,但是此时master没有修改,因此需要commit一下,再往前走一步。
bash
git merge --no-ff -m "merge with --no-ff" dev
7.7 合并(修bug)模式
场景:主分支master、dev开发分支。突然说master上有bug需要修一下。
- 如果当时在dev分支上进行开发,先运行stash保存一下代码。(防止dev写的代码出现在master上)。
bash
git stash
- 然后就可以切到master分支上
bash
git checkout master
- 在master创建一个bug分支修复bug
bash
git checkout -b fix-bug
- 修复完成后 add 和commit
bash
git add .
git commit -m "fix_bug"
- 将修改好的代码合并到master里面(切换到master并merge)
bash
git checkout master
git merge --no-ff -m "merge fix_bug" fix-bug
- bug修复完了,接着回dev进行开发。
bash
git checkout dev
- 将存储区里的代码恢复出来
bash
git stash pop
bash
git stash list #查看当前存储了哪些内容
- 开发完成后要add,commit
bash
git add .
git commit -m "code finish!"
9.写完功能后dev要合并到master上(但是master上已经进行bug修改过了,已经不一样了),所以建议先将master合并到dev上,修改没问题后再。用merge合并dev这样就不会影响到master上的代码。
bash
git merge --no-ff "merge master" master
# 然后手动去解决冲突
git add .
git commit -m "sove conflict"
# 再切换到master上,合并dev
git checkout master
git merge --no-ff -m "merge dev2" dev
7.8 功能取消了!(删除分支)
正常来说删除分支的操作是git branch -d dev
即可解决。能够i执行这个的前提条件是该dev已经merge过了。删了也无所谓。
但是如果一些功能我们已经开发好久了,产品经理说这个功能取消了,这个我们就并没有merge过,使用-d
就删不掉了。因为git不想让你这样删掉分支(写的代码就全没了)。
但是确实是不需要这些代码了。所以执行git branch -D dev
强制删除。
8.远端仓库
简单理解就是根据 本地的master和远程仓库的master分支如果建立起了联系,我们就可以使用相关命令去推送了。
使用git remote
查看远程仓库名
使用git remote -v
看更详细的信息和权限。
8.1 克隆
使用git clone url
去克隆远程仓库到本地。
bash
git clone url
如果是自己的仓库,别忘记使用git config -l
查看配置项,如果不是远端的地址,需要使用第二节的内容配置好,name是昵称。email是仓库绑定的邮箱。
8.2 提交到远端(本地新,远程仓库旧)
新建文件后,先add 然后 commit 之后。
bash
git push <远程仓库> <本地分支>:<远端分支>
git push origin master:master
如果本地分支和远程仓库的分支一样可以使用git push origin master
来省略一个master。
8.3 拉取远程仓库(本地旧,远程仓库新)
pull : 拉取+合并
bash
git pull <仓库名> <远程分支名>:,本地分支名>
git pull orgin master:master
如果本地分支和远程仓库的分支一样可以使用git pull origin master
来省略一个master。
9. <<.gitignore文件>>
忽略以.so和.init为结尾的文件。但是不包括c.so文件。
虽然被忽略了,但是使用git add -f a.so
可以把a.so文件强制添加到版本库中。但是不推荐使用。
- 有时候我们不知道a.so文件是否被忽略了。可以执行如下命令去检查:
bash
git check-ignore -v a.so
然后会告诉你在.gitignore的第3行位置已经被忽略了.
.*忽略所有以.开头的文件,但是记得要把ignore文件添加进去哦
10. 给命令取别名
就是简化命令的操作。
使用git config--global alias.st 命令
给一个命令取了别名st。
注意如果是好多命令,要加''单引号给引起来。
bash
git config --global alias.st status
git config --global alias.lpa 'log --pretty=oneline --abbrev-commit'
分别起了st和lpa两个别名。
11. 标签管理
commit id 非常难记,因此标签就相当于域名,简化我们记忆。
11.1 打标签
- 给最新一次提交打标签
bash
git tag <标签名>
git tag v1.0
- 查看所有标签
bash
git tag
- 给指定提交打标签(需要拿到commit id)
bash
# 拿到commit id
git log --pretty=oneline --abbrev-commit
# 给指定Id 打标签
git tag v0.2 <id>
- 查看标签详细信息
bash
git show <标签名>
git show v1.0
- 创建带有说明的标签
bash
git tag -a <标签名> -m "xxx" <ID>
11.2 删除标签
删除标签 git tag -d <标签名>
11.3 将本地标签推送到远程仓库
- 推送指定标签
bash
git push origin <标签名>
- 推送所有标签
bash
git push origin --tags
11.4 删除标签
不建议直接在远程仓库删除
- 先将本地标签删除,再通过push方式删除远端。
bash
git tag -d <标签名>
git push origin :<标签名>
12. 和远程仓库有关的命令
12.1 查看远程仓库有哪些分支
bash
git branch -r
git branch -a #既看本地的又看远程的
12.2 在本地和远程仓库的分支建立连接
自己本地没有dev而远端有dev。这时候pull之后,需要自己本地再次建立一个dev分支 ,然后和远端建立连接,这样push,pull操作可以直接简化使用了。
bash
git checkout -b dev origin/dev
这样本地dev和远端dev直接建立连接了。
- 如何查看是否建立起链接呢?
bash
git branch -vv
- 如何在dev创建完了,没有发生链接呢?如何补救
bash
git branch --set-upstream-to=origin/dev dev
这样就可以是远程的dev分支和本地的dev链接起来了。
12.3 将远程的dev合并到远程的master分支
- 使用PR表单(省略)
- 本地merge操作后再推送到远程(前面写过)
1.先git checkout master
切换到master分支
2.保持master最新git pull
3.再切换到devgit checkout dev
4.合并master到devgit merge master
,然后解决冲突(完了之后add commit)
5.切换到master并且合并dev分支git checkout master
并且git merge dev
因为我们第4步已经解决冲突了,所以第5步不需要解决冲突
6.推送master到远端仓库自动合并git push
12.4 远端如果没有自己创建的dev分支怎么办?
使用git push origin dev
即可推送上去,并且在远端自动建立一个dev分支。
12.5 本地只有dev分支和master分支,远端有dev1,dev2等分支,现在要在dev2上开发,怎么办?
- 使用
git pull
即可
功能1:拉取建立分支的详细内容(需要先建立链接)
功能2:拉去仓库的所有分支(可以获得dev2,dev3等)
分支拉取下来了之后,和远端建立链接,然后再开发即可。
12.6 有两个人分别在feature-1和feature-2上开发,怎么办呢?
为了防止污染master都建议先自己合并master再让master合并自己即可。
12.7 删除远程分支
远程仓库的分支已经被删除了,但是本地仍然存在。如何删除本地的远程分支呢?
先使用git branch -a
查看所有分支。
使用git remote show origin
查看origin仓库的所有远程分支
可以看出git提示我们有些分支已经stale了,表示很陈旧了。
使用git remote prune
即可删除本地里面的远程分支。
13. 注意事项
-
远程仓库的分支和本地仓库的分支并不是同一个分支,可以这么理解,虽然分支名字相同,但是没有任何联系 ,相当于不同文件夹下的同名目录。 但是我们可以通过建立链接操作,将本地分支和远程仓库分支联系起来,这样两个分支其实就有了桥梁,就可以互通了。
-
对于任何的远程操作,本地修改后,都要先进行add和commit命令,提交到版本库,让git追踪到,才能进行push合并等操作。
经验有限,后续会持续添加注意事项...