一、Git整体理解
Git代码管理是分布式管理方式系统,优点在于其极高的安全性和非常强大的分支管理。
工作区(working directory): 就是本地的代码区,电脑能看到的目录,就是工作区.
暂存区(Index):工作区下有一个隐藏的'.git'文件,其主要作用是存储Git自动创建的第一个master分支,还有指向master分支的HEAD指针.还有一个最重要的stage的暂存区.需要提交的文件修改通通放到暂存区,然后一次性提交到暂存区的所有修改.
本地仓: 本地的个人仓库.管理着个人的代码的版本信息.
远程仓: 线上的仓库.管理着推送到服务器的代码版本.
过程一、有工作区<->暂存区
- 工作区->暂存区:
用git add . 添加所有的修改或者git add <文件名>添加单个指定的文件修改到暂存区中. - 暂存区->工作区:
(1)git rm --cached "文件路径" 不删除物理文件,紧将git的缓存删除.
(2)git rm --f "文件路径" 不仅将该文件从缓存中 删除,还将物理文件删除(不会放到垃圾桶).
例如: git rm -rf .DS_Store
(3)git reset <版本号> 利用版本库清空暂存区.原理:将当前分支重设(reset)到指定的<commit>或者HEAD(默认,如果不指定commit,默认是HEAD,即最新的一次提交)
--hard
git reset --hard <commit号>重设(reset)index和working directory,自从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>
--soft
git reset --soft <commit号>index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中
过程二、由暂存区<->本地仓库
- 暂存区->本地仓库
用git commit -m'本次commit的描述' - 本地仓库->暂存区
(1) git reset <版本号> 利用版本库清空暂存区.原理:将当前分支重设(reset)到指定的<commit>或者HEAD(默认,如果不指定commit,默认是HEAD,即最新的一次提交)
(2) --hard
git reset --hard <commit号>重设(reset)index和working directory,自从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>
(3) --soft
git reset --soft <commit号>index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中.退回到该次commit提交,但是该版本之后所有的修改都没有了,如果想要恢复,就要试图从还未关闭的终端中找到你想要的退回的版本号,或者用git reflog查找你想要的commit版本号.继续用git reset --soft <commit号>回退
过程三、由本地仓->远程仓库
用git push
说明:三种git add的区别
-git add .
提交新文件(new)和被修改(modified)的文件,不包括被删除(deleted)的文件
-
git add -u
提交被修改(modified)和被删除(deleted)的文件,不包括新文件(new) -
git add -A
提交所有变化
1、在本地创建一个Git管理的项目
- 从线上拉项目到本地
用git clone "项目的地址路径"
克隆一个Git管理的项目到本地 - 本地项目上传线上
git init
git remote add origin "地址url"
2、Git上的常用查看操作
(1)查看文本内容
cat<文件名>
(2)查看git的状态
git status
会告诉你在当前的分支上git的情况(有没有修改,修改的文件是什么等)
3、查看更详细的文件修改
git diff
查看所有文件的不同
git diff <文件名>
查看指定文件的不同
diff是difference的缩写,只能查看还未add(还没加入到暂存区)的修改
4、查看所有的commit信息
git log
git log --pretty=oneline
更简洁的查看log信息(只有commit号和描述信息)
5、查看所有的git操作过的命令,可以找到删除了的commit号
git reflog
6、查看分支合并图
git log --graph
四、冲突处理
需要把
<<<<<<HEAD
=======
>>>>>>
中间的删掉
五、Git分支操作
1、分支基本操作
- 分支的创建和切换
git branch "分支名"
创建一个分支git checkout "分支名"
切换到该分支
创建并切换到该分支git checkout -b "分支名"
- 列出所有的分支
git branch
列出本地分支 用*标记当前的分支
git branch -a
列出远程分支 - 合并分支
git merge "分支名"
合并指定分支到当前分支
git rebase "分支名"
合并指定分支到当前分支
两者的区别在于会不会保留分支操作的记录,前者记录,后者不记录.建议用merge - 删除分支
删除本地分支:git branch -d "分支名"
强制删除本地分支:git branch -D "分支名"
删除远程分支:git push origin :<分支名>
(轻易不要动啊)
如果提示the branch XXX is not fully merged
(XXX分支有没合并到当前分支的内容) - 本地新建了一个分支要推送到线上,需要设置关联或者追踪
第一次push:git push origin 本地分支名:远程分支名
- 远程端生成了一个新的分支,拉取到本地
先关联远程端分支到本地:git branch --set-upstream-to=origin/<线上分支名> <本地分支名>
然后git pull
六、bug的分支
用issue作为分支的开头标记,当有一个bug出现需要改的时候,先拉取一个issue分支,修改并合并到开发分支上,然后删除issue分支。
七、feature分支
- 开发新的功能的时候,最好拉取一个新的分支,以feature开头。
- 丢掉一个没有合并过的分支,即删除分支
git branch -D <分支名>
强制删除该分支内容
八、暂存的使用
1、git stash
暂存
2、 git stash list
查看所有的暂存
3、git stash apply
从暂存开始执行,但是stash内容不会删除
4、 git stash drop
删除暂存
5、git stash pop
回复暂存的同时删除暂存
6、git stash apply stash@{0}
恢复指定的暂存
九、远程仓的操作
- 查看远程仓的信息
git remote
git remote -v
显示更详细的信息 - 将分支推送到远程仓
git push origin 本地分支名:远程分支名
十、标签的使用
标签智能在master分支上使用,尽量写清楚所有的修改,为了万一的版本回退做好描述工作。
1、git tag <name>
新建一个标签
2、git tag -a <name> -m'指定的标签信息'
3、git show <tag名字>
查看详细的tag信息
4、git tag
查看所有的tag名字
5、git tag -d <标签名字>
删除一个标签
6、git push origin < 标签名>
推送标签到远程
7、git push origin --tags
一次性推送所有未推送的标签
8、删除远程仓上的tag
- 先删除本地的标签:
git tag -d <tag名字>
- 删除远程端的标签:
git push origin :tag名字
十一、Git配置全局信息
1、配置作者名称
git config --global user.name "Your Name"
2、配置个人邮箱
git config --global user.email "email@example.com"
3、配置git的颜色(文件名会标记上颜色)
git config --global color.ui true
十二、Linux的一些简单操作和一些符号的解释
1、目录/文件的操作
-mkdir "目录名"
在当前路径下创建一个文件夹
mvdir "目录1" "目录2"
移动或者重命名一个目录 (如果目录2不存在,就直接修改目录1的名称为目录2)rmdir
"目录名" 删除一个目录touch
创建一个文件vim "文件名 编辑文件,如果文件不存在,就创建并进入编辑.
删除一个文件
sudo rm -rf <文件名>
在上帝权限下删除,可以删除一个该用户没有权限的文件(包括系统文件),不建议使用
rm <文件名>
能删除当前用户权限下的文件
2、转换目录cd + "路径"
进入该文件目录下(也可以将文件直接拖进来)cd ..
回到上级目录
-cd . 当前目录
cd / 回到根目录
cd test.rtf
不可用. 不能cd到文件里.只能cd到目录.
报错信息: -bash: cd: test.rtf: Not a directory
3、拷贝/移动/删除
cp "需要拷贝的文件路径" "目标地址路径"
拷贝文件 例如: cp /Users/goulela/Desktop/test.rtf /Users/goulela/Desktop/文件夹2
mv "需要移动的文件路径" "目标地址路径"
移动文件 例如: mv 文件夹2 /Users/goulela/Desktop/创建文件夹/文件夹
4、显示操作
-file "文件名"
显示文件的类型wc "文件名"
统计文件的字符数,词数,行数pwd
查看当前所在的目录ls
显示当前路径下有什么文件ls + "目录名"
显示特定的路径下有什么文件ls -w
显示中文ls -l
详细信息ls -a
显示所有文件,包括隐藏文件
5、时间操作
-
data
显示系统的当前日期和时间 -
cal
显示日历
6、网络与通信 -
ping "url"
给一个远程主机发送 回应请求 - 终止ping打印
control + c
-
who
列出当前登录的所有用户 -
whoami
显示当前正进行操作的用户名
十三、符号解释
1、-r
就是向下递归,不管有多少级目录,一并删除
2、-f
就是直接强行删除,不作任何提示的意思
3、-rf
向下递归强制删除
十四、显示安装详细信息
在安装命令后面添加--verbose,可以查看打印详细信息
十五、git config
配置git的相关参数
git一共有3个配置文件:
1、仓库级的配置文件:在仓库的.git/.gitconfig
,该配置文件只对所在的仓库有效。
2、全局配置文件:Mac系统在~/.gitconfig
,Windows系统在C:\Users\<用户名>\.gitconfig
。
3、系统级的配置文件:在Git的安装目录下(Mac系统下安装目录在/usr/local/git
)的etc
文件夹下的gitconfig
。
# 查看配置信息
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -l
# 查看当前生效的配置信息
$ git config -l
# 编辑配置文件
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -e
# 添加配置项
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> --add <name> <value>
# 获取配置项
$ git config <--local | --global | --system> --get <name>
# 删除配置项
$ git config <--local | --global | --system> --unset <name>
# 配置提交记录中的用户信息
$ git config --global user.name <用户名>
$ git config --global user.email <邮箱地址>
# 更改Git缓存区的大小
# 如果提交的内容较大,默认缓存较小,提交会失败
# 缓存大小单位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <缓存大小>
# 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态
$ git config --global color.ui true
# 配置可以缓存密码,默认缓存时间15分钟
$ git config --global credential.helper cache
# 配置密码的缓存时间
# 缓存时间单位:秒
$ git config --global credential.helper 'cache --timeout=<缓存时间>'
# 配置长期存储密码
$ git config --global credential.helper store
十六、Git clone
从远程仓库克隆一个版本库到本地。
# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下
$ git clone <远程仓库的网址>
# 指定本地仓库的目录
$ git clone <远程仓库的网址> <本地目录>
# -b 指定要克隆的分支,默认是master分支
$ git clone <远程仓库的网址> -b <分支名称> <本地目录>
十七、Git init
初始化项目所在目录,初始化后会在当前目录下出现一个名为.git的目录。
# 初始化本地仓库,在当前目录下生成 .git 文件夹
$ git init
十八、git status
查看本地仓库的状态
# 查看本地仓库的状态
$ git status
# 以简短模式查看本地仓库的状态
# 会显示两列,第一列是文件的状态,第二列是对应的文件
# 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中
$ git status -s
十九、git remote
操作远程库
# 列出已经存在的远程仓库
$ git remote
# 列出远程仓库的详细信息,在别名后面列出URL地址
$ git remote -v
$ git remote --verbose
# 添加远程仓库
$ git remote add <远程仓库的别名> <远程仓库的URL地址>
# 修改远程仓库的别名
$ git remote rename <原远程仓库的别名> <新的别名>
# 删除指定名称的远程仓库
$ git remote remove <远程仓库的别名>
# 修改远程仓库的 URL 地址
$ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>
二十、git branch
操作git的分支命令
# 列出本地的所有分支,当前所在分支以 "*" 标出
$ git branch
# 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出
$ git branch -v
# 创建新分支,新的分支基于上一次提交建立
$ git branch <分支名>
# 修改分支名称
# 如果不指定原分支名称则为当前所在分支
$ git branch -m [<原分支名称>] <新的分支名称>
# 强制修改分支名称
$ git branch -M [<原分支名称>] <新的分支名称>
# 删除指定的本地分支
$ git branch -d <分支名称>
# 强制删除指定的本地分支
$ git branch -D <分支名称>
二十一、git checkout
检出命令,用于创建,切换分支等
# 切换到已存在的指定分支
$ git checkout <分支名称>
# 创建并切换到指定的分支,保留所有的提交记录
# 等同于 "git branch" 和 "git checkout" 两个命令合并
$ git checkout -b <分支名称>
# 创建并切换到指定的分支,删除所有的提交记录
$ git checkout --orphan <分支名称>
# 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响
$ git checkout <文件路径>
二十二、git cherry-pick
把已经提交的记录合并到当前分支。
# 把已经提交的记录合并到当前分支
$ git cherry-pick <commit ID>
二十三、git add
把要提交的文件的信息添加到暂存区中。当使用git commit时,将依据暂存区中的内容类进行文件的提交。
# 把指定的文件添加到暂存区中
$ git add <文件路径>
# 添加所有修改、已删除的文件到暂存区中
$ git add -u [<文件路径>]
$ git add --update [<文件路径>]
# 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -A [<文件路径>]
$ git add --all [<文件路径>]
# 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
$ git add -i [<文件路径>]
$ git add --interactive [<文件路径>]
二十四、git commit
将暂存区中的文件提交到本地仓库中。
# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息
$ git commit
# 把暂存区中的文件提交到本地仓库中并添加描述信息
$ git commit -m "<提交的描述信息>"
# 把所有修改、已删除的文件提交到本地仓库中
# 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"
# 修改上次提交的描述信息
$ git commit --amend
二十五、git fetch
从远程仓库获取最新的版本到本地的tmp分支上。
# 将远程仓库所有分支的最新版本全部取回到本地
$ git fetch <远程仓库的别名>
# 将远程仓库指定分支的最新版本取回到本地
$ git fetch <远程主机名> <分支名>
二十六、git merge
合并分支
# 把指定的分支合并到当前所在的分支下
$ git merge <分支名称>
二十七、git diff
比较版本之间的差异
# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改
$ git diff
# 比较暂存区中的文件和上次提交时的差异
$ git diff --cached
$ git diff --staged
# 比较当前文件和上次提交时的差异
$ git diff HEAD
# 查看从指定的版本之后改动的内容
$ git diff <commit ID>
# 比较两个分支之间的差异
$ git diff <分支名称> <分支名称>
# 查看两个分支分开后各自的改动内容
$ git diff <分支名称>...<分支名称>
二十八、git pull
从远程仓库获取最新版本合并到本地。
首先会执行git fetch,然后执行 git merge,把获取的分支的HEAD合并到当前分支。
# 从远程仓库获取最新版本。
$ git pull
二十九、git push
把本地仓库的提交推送到远程仓库
# 把本地仓库的分支推送到远程仓库的指定分支
$ git push <远程仓库的别名> <本地分支名>:<远程分支名>
# 删除指定的远程仓库的分支
$ git push <远程仓库的别名> :<远程分支名>
$ git push <远程仓库的别名> --delete <远程分支名>
三十、git log
把本地仓库的提交推送到远程仓库
# 把本地仓库的分支推送到远程仓库的指定分支
$ git push <远程仓库的别名> <本地分支名>:<远程分支名>
# 删除指定的远程仓库的分支
$ git push <远程仓库的别名> :<远程分支名>
$ git push <远程仓库的别名> --delete <远程分支名>
三十一、git reset
还原提交记录
# 重置暂存区,但文件不受影响
# 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件
# 没有指定 commit ID 则默认为当前 HEAD
$ git reset [<文件路径>]
$ git reset --mixed [<文件路径>]
# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
$ git reset <commit ID>
$ git reset --mixed <commit ID>
# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
# 相当于调用 "git reset --mixed" 命令后又做了一次 "git add"
$ git reset --soft <commit ID>
# 将 HEAD 的指向改变,撤销到指定的提交记录,文件也修改了
$ git reset --hard <commit ID>
三十二、git revert
生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。
# 生成一个新的提交来撤销某次提交
$ git revert <commit ID>
三十三、删除掉本地不存在的远程分支
多人合作开发时,如果远程的分支被其他开发删除掉,在本地执行 git branch --all 依然会显示该远程分支,可使用下列的命令进行删除:
# 使用 pull 命令,添加 -p 参数
$ git pull -p
# 等同于下面的命令
$ git fetch -p
$ git fetch --prune origin