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合并等操作。
经验有限,后续会持续添加注意事项...