Git教程
Git简介
Git是一个分布式版本管理系统,是为了更好地管理Linux内核开发而创立的
Git可以在任何时间点,把文档的状态作为更新记录保存起来。因此可以把编辑过的文档复原到以前的状态,也可以显示编辑前后的内容差异。
使用Git管理文件的话,更新的历史会保存在Git
安装Git
Git - Downloads:https://git-scm.com/downloads
配置Git
在使用 git
提交前需要配置用户名和邮箱
配置全局
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
配置当前仓库
移除 --global
参数执行
创建版本库
版本库又叫仓库,Git的仓库分为远程仓库和本地仓库两种
- 远程仓库:配有专用的服务器,为了多人共享而建立的仓库。
- 本地仓库:为了方便用户个人使用,在自己的机器上配置的仓库。
平时用手头上的机器在本地仓库上操作就可以了。如果想要公开在本地仓库中修改的内容,把内容上传到远程仓库就可以了。另外,通过远程仓库还可以取得其他人修改的内容。
创建仓库的方式有两种:一种是创建全新的本地仓库,另一种是复制远程仓库。
创建本地仓库
在合适的位置创建一个空目录
mkdir learngit
cd learngit
初始化 git
仓库
git init
文件添加到版本库
新建文件 readme.txt
,填写内容
Git is a version control system.
Git is free software.
用命令
git add
将文件添加到仓库
git add readme.txt
命令
git commit
提交到仓库
git commit -m "readme file"
[master (root-commit) 6bba314] readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
# 提交所以修改文件
git add .
# 提交指定文件
git add src/file1.txt
# 提交多个文件
git add file1.txt file2.txt
只添加已经提交过的文件到暂存区
git add -u
查看修改的文件
提交一个文件后继续修改里面的内容,使用 git status
查看工作区
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
使用 git diff
查看修改的内容
查看工作区和暂存区的差异
git diff readme.txt
查看工作区和版本库的差异
git diff HEAD -- readme.txt
# 查看工作区和版本库的所有文件差异
git diff HEAD
查看修改日志
git log
简化查看
git log --pretty=oneline
版本回退
在git中,HEAD
表示当前版本,也就是当前处在的提交节点,上一个版本是 HEAD^
,上上个版本是 HEAD^^
,需要回退到多个版本时可以写成 HEAD~3
回退到上上个版本示例
git reset --hard HEAD^^
或
git reset --hard HEAD~2
版本回退之后之前的修改都会放到工作区中
窗口还没有关闭时还可以往前找,找到之前的 commit id
git reset --hard 574b81b
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
可以看到又恢复了之前的提交
Git版本回退是切换 HEAD
的指向位置,你让HEAD
指向哪个版本号,你就把当前版本定位在哪。
可以使用 git reflog
查看每一次的操作记录
想要恢复到某个版本时必须找到对应的
commit id
工作区和暂存区
仓库目录下的文件处在工作区,使用 git add
命令添加的文件时会把文件从工作区添加到暂存区中,git commit
提交修改时把所有暂存区的文件内容提交到当前分支
提交后没有对工作区的内容做任何修改时,这个工作区就是“干净”的
- 工作区:仓库目录下的文件
- 暂存区:暂存区也叫索引(index),使用
git add
添加的修改内容 - 仓库:
git commit
把暂存区的内容提交到仓库
撤销修改
撤销暂存区的修改,重新放回工作区
git reset HEAD
git reset readme.txt
git reset .
撤销工作区与暂存区的修改,丢弃工作区的修改
git checkout -- readme.txt
或
git restore readme.txt
在使用
checkout
撤销时不要忘记带上--
不然会切换到另一个分支
git reset
命令即可以回退版本,也可以把暂存区的修改回退到工作区,使用HEAD
时表示最新的版本
删除文件
清除未跟踪的文件 git clean
(慎用)
-d # 删除未跟踪目录以及目录下的文件,如果目录下包含其他git仓库文件,并不会删除(-dff可以删除)。 -f # 如果 git cofig 下的 clean.requireForce 为true,那么clean操作需要-f(--force)来强制执行。 -i # 进入交互模式 -n # 查看将要被删除的文件,并不实际删除文件 -x # 可以删除 `.gitignore` 忽略的文件和文件夹
git clean -df
默认情况下不会删除被忽略的文件列表
远程仓库
添加远程仓库
本地仓库和远程仓库进行关联
origin是默认习惯命名
添加一个名为 origin
的仓库,可以修改成其它名称
git remote add origin git@gitlab.xxx.com
推送到远程仓库
git push origin master
首次推送失败时尝试添加一个参数 -u
,后面再推送就可以简化了
git push -u origin master
查看远程仓库
git remote -v
删除远程仓库
这里是解除本地和远程仓库的关联关系,并不是正真的删除远程仓库。远程仓库没有任何改动
git remote rm origin
更新名称
git remote rename
git remote rename origin origin2
克隆远程仓库
git clone git@gitlab.xxx.comg
更新仓库分支
查看远程仓库分支的修改内容,拉取远程最新的分支到本地
git fetch
分支管理
不同类别的修改(Bug修复和功能凯峰)要尽量分开提交,方便一会在历史记录中查找特定的修改内容
创建分支
每次提交Git都会把它们串成一条时间线,这条时间线就是一个分支,截止目前只有一条时间线,这个分支叫主分支,即 master
分支
创建 dev
分支并且切换到 dev
分支
git checkout -b dev
或
git switch -c dev
在 git checkout
命令加上 -b
参数表示创建并切换,等同于
git branch dev
git checkout dev
仅创建分支
git branch dev2
切换分支
git checkout dev
或
git switch dev
查看分支
git branch
查看远程分支
git branch -r
查看所有分支(本地+远程)
git branch -a
修改分支
更新分支名称
git branch -m <old> <new>
合并分支
切换到 master
分支后执行命令
git merge dev
删除分支
git branch -d dev
如果删除没有合并过的分支时会提示上删除失败,强制删除使用
-D
git branch -D dev
删除远程分支
git branch --delete origin dev2
分支管理策略
合并分支时,Git会用 Fast forward
模式
在这种情况下,删除分支后会丢掉分支信息
强制禁用 Fast forward
模式(普通模式合并)会生成一个新的commit,所有需要添加 -m
参数添加描述信息
准备合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
合并后的历史有分支,能看出来层级做过合并,
Fast forward
合并看不出来曾经做过合并
储存区
开发任务进行到一半时需要紧急修复Bug,此时工作还没有完成没法提交
使用 git stash
存储工作区的修改
git stash
这个时候用 git status
查看工作区是干净的,处理完Bug之后可以回来继续开发
查看储存区
git stash list
恢复储存区
此方式不会删除
git stash apply
此方式在恢复的同时删除
git stash pop
多个 stash
恢复指定内容
git stash apply stash@{0}
删除储存区
git stash drop
# 删除指定储存区
git stash drop stash@{1}
清空储存区
此操作会清除所有内容,操作前注意有没有重要信息**(慎用)**
git stash clear
复制提交
将一个提交从其它分支复制到当前分支
git cherry-pinck <commit>
多人协作
推送分支
将本地提交推送到远程分支,推送时需要指定本地分支
git push origin dev
不是所有分支都要推送到远程仓库
master
分支:主分支需要时刻同步dev
分支:所有成员在开发分支上面工作,也需要时刻同步bug
分支:只用于本地修复bug,可以不用推送到远程feature
分支:取决于其他开发人员是否需要和你合作
每次推送前都要拉取一下最新代码到本地
git pull origin dev
或
git pull
本地分支推送远程仓库时使用其它名字
git push origin dev:dev2
rebase
rebase操作可以把本地未push的分叉提交历史整理成直线
使我们在查看历史提交的变化时更容易
git rebase master
针对变基前当前分支已经推送到远程后就不能直接推送了,提示需要先拉取最新代码再推送,此时能保证此分支只是自己在修改,且只是把master
的最新代码合过来了,这个时候需要强制推送覆盖远程即可
git push origin -f dev
Merge与rebase
git rebase 简单说就是将你的commit提前,保证在你rebase的这一时刻,你的代码是最新的。否则在你修改完本地代码push到远程库时会出现冲突(因为在你修改的时候,别人也在修改,你两的修改出现的冲突,也就是你两个的文件出现了不一致的地方)。
推送本地所有分支到仓库
git push --all origin
改写提交
git commit --amend
使用场景
- 添加最近提交漏掉的文件
- 修改最近提交的注释
推送远程仓库时开发一个功能已经在本地提交过多次,查看历史记录可以看到多个提交内容,这些都属于一个功能,推送到远程仓库之前可以合并成一个提交节点
第一步:使用git reset
到开发功能的第一个节点
git reset <commit>
第二部:将工作区的修改添加到暂存区
git add .
第三步:改写提交
git commit --amend
第四步:强制推送远程仓库(-f
慎用)
git push origin -f dev
revert
取消某一次提交的内容
git revert HEAD
或
git revert <commit id>
或
git revert HEAD~3
取消连续的提交
git revert HEAD, HEAD^, HEAD~2
取消最近连续的三次提交
方式1
左开右闭区间:(x…y),不好含x,包含y
git revert HEAD~3...HEAD
方式2
git revert 3867949...e075687
可以看到每一次取消都作为一个新的commit进行提交
reset与revert
- reset:回溯到指定提交的版本,指定版本之后的提交都重置了
- revert:删除指定提交的内容,提交前后的操作都不受影响
修改已经提交过的注释
方式一
git commit --amend
修改注释信息
查看提交日志
方式二
git rebase -i HEAD~2
将需要修改的提交从pick
修改为 edit
继续使用git commit --amend
修改提交信息,修改好之后执行 git rebase --continue
标签管理
发布一个版本时常常会打一个标签 tag
,标签是版本库的一个快照,恢复到某个标签就是恢复到指定的某个版本
标签起到了一个别名的作用,标签名称可以很快的找到指定的版本
创建标签
git tag v1.0
默认情况下是在当前分支的最新提交上创建的
对指定提交节点打标签
首先查看历史记录的日志
git log --pretty=oneline --abbrev-commit
找到对应的commit id
git tag v0.9 3c88b34
查看标签
查看所有标签
git tag
标签使用字母进行排序
标签数量多时可以查看指定标签
git tag -l "v1.0*"
查看标签信息
git show v0.9
标签说明
创建后再手动输入批注信息
git tag -a <name>
创建标签时添加说明文字
git tag -a v1.1 -m "version 1.1"
删除标签
git tag -d v0.9
删除多个标签
git tag -d v0.9 v1.2
推送标签
git push origin v1.0
推送所有未推送到远程的标签
git push origin --tags
删除远程标签
git push origin :refs/tags/v1.1
忽略文件
github:https://github.com/github/gitignore
一个无法添加的文件可以被 .gitignore
忽略了,可以使用 -f
强制添加到git
git add -f test.txt
有可能是.gitignore
文件写的有问题,使用检查命令
git check-ignore -v test.txt
或
# 注意:存在标签和仓库同名时都会删除
git push --delete origin <tagname>
注意事项
Idea控制台乱码
Idea中,操作terminal控制台,使用git log查看日志时,出现如下乱码
<94>
原因
Idea默认使用的是cmd.exe
解决方案
- 临时:在使用控制台前输入命令:set LESSCHARSET=utf-8修改字符编码为UTF-8,再次使用git指令
- 永久:idea设置:file=>setting=>Tools=>Terminal=>Environment Variables=>set LESSCHARSET=utf-8
参考文档
优化操作
美化log
添加配置
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
使用git lg
查看git日志
git lg
Git图形界面工具
- sourcetree:https://www.sourcetreeapp.com/
Git命令速查表
Git Cheat Sheet
git-cheat-sheet:https://liaoxuefeng.gitee.io/resource.liaoxuefeng.com/git/git-cheat-sheet.pdf
GIt操作指令
Git常用命令速查表
Git速查
- 本文作者: lightsolid
- 版权声明: 本文著作权归作者所有,转载请注明出处!
部分内容及图片收集于网络,如有侵权,请联系我们删除