Git指令集
初始化设置
配置用户名
1 | git config --global user.name "Your Name" |
配置邮箱
1 | git config --global user.email "mail@example.com" |
存储配置
1 | git config --global credential.helper store |
创建仓库
创建一个新的本地仓库 ( 省略 project-name
则在当前目录创建)
1 | git init <project-name> |
克隆一个远程仓库
1 | git clone <url> |
四个区域
工作区(Working Directory)
就是你在电脑里能实际看到的目录。
暂存区(Stage/Index)
暂存区也叫索引, 用来临时存放未提交的内容, 一般在 .git
目录下的 index
中。
**本地仓库(**Repository)
Git在本地的版本库, 仓库信息存储在 .git
这个隐藏目录中。
**远程仓库(**Remote Repository)
托管在远程服务器上的仓库。 常用的有GitHub、 GitLab、 Gitee。
对于区域和分支的问题
当对文件做出改动时,工作区和暂存区对所有分支都是可见的;
但当在某个分支提交后,则该改动只能在该提交的分支查看到,并且
ls
和ls-files
都只能在当前分支中看到该改动,别的分支看不到
查看当前分支当前工作区的文件列表
1 | ls |
查看当前分支当前暂存区文件列表
1 | git ls-files |
文件状态
已修改(Modified)
修改了但是没有保存到暂存区的文件。
已暂存(Staged)
修改后已经保存到暂存区的文件。
已提交(Committed)
把暂存区的文件提交到本地仓库后的状态。
基本概念
main / master
默认主分支origin
默认远程仓库HEAD
指向当前分支的指针HEAD^
上一个版本HEAD~4
上4个版本
特殊文件
.git
Git仓库的元数据和对象数据库.gitignore
忽略文件,不需要提交到仓库的文件.gitattributes
指定文件的属性,比如换行符.gitkeep
使空目录被提交到仓库.gitmodules
记录子模块的信息.gitconfig
记录仓库的配置信息
添加和提交
添加一个文件到暂存区
1 | git add <file> |
添加所有文件到暂存区
1 | git add . |
提交所有暂存区的文件到仓库
1 | git commit -m "message" |
提交所有已修改的文件到仓库
1 | git commit -am "message" |
分支
查看所有本地分支,当前分支钱前面会有一个 *
, -r
查看远程分支, -a
查看所有分支
1 | git branch |
创建一个新分支
1 | git branch <branch-name> |
删除一个已经合并的分支
1 | git branch -d <branch-name> |
删除一个分支,不管是否合并
1 | git branch -D <branch-name> |
切换到指定分支,并更新工作区
1 | git checkout <branch-name> |
创建一个新分支,并切换到该分支
1 | git checkout -b <branch-name> |
给当前的提交打上标签,通常用于版本发布
1 | git tag <tag-name> |
合并分支
合并分支a到分支b
-no-ff
参数表示禁用 Fast forward
模式,合并后的历史有分支,能看出曾经做过合并
-ff
参数表示使用 Fast forward
模式,合并后的历史会变成一条直线
1 | git merge --no-ff -m "message" <branch-name> |
1 | git merge --ff -m "message" <branch-name> |
合并&squash
所有提交到一个提交
1 | git merge --squash <branch-name> |
rebase
不会产生新的提交,而是把当前分支的每一个提交都"复制"到目标分支上,然后再把当前分支指向目标分支
merge
会产生一个新的提交,这个提交有两个分支的所有修改
Rebase
Rebase
操作可以把本地未push的分支提交历史整理成直线,看起来更直观。但是,如果多人协作时,不要对已经推送到远程的分支执行 Rebase
操作
1 | git checkout <dev> |
撤销
移动一个文件到新的位置
1 | git mv <file> <new-file> |
从工作区和暂存区中删除一个文件,然后暂存删除操作
1 | git rm <file> |
只从暂存区中删除一个文件,工作区中的文件没有变化
1 | git rm --cached <file> |
恢复一个文件到之前的版本
1 | git checkout <file> <commit-id> |
提交一个新的提交,用来撤销指定的提交,后者的所有变化都将被前者抵消,并且应用到当前分支
1 | git revert <commit-id> |
重置当前分支的 HEAD
为之前的某个提交,并且删除所有之后的提交。
--hard
参数表示重置工作区和暂存区--soft
参数表示重置暂存区--mixed
参数表示重置工作区
1 | git reset --mixed <commit-id> |
撤销暂存区的文件,重新放回工作区 (git add
的反向操作)
1 | git restore --staged <file> |
查看
列出还未提交的新的或修改的文件
1 | git status |
查看提交历史, --oneline
可简略查看
1 | git log --oneline |
查看未暂存的文件更新了哪些部分
1 | git diff |
查看两个提交之间的差异
1 | git diff <commit-id> <commit-id> |
Stash
Stash
操作可以把当前工作现场"储藏"起来,等以后恢复现场后继续工作。
-u
参数表示把当前所有 未跟踪 的文件也一并存储
-a
参数表示把所有 未跟踪 的文件和 忽略 的文件也一并存储
save
参数表示存储的信息,可以不写
1 | git stash save "message" |
查看所有 stash
1 | git stash list |
恢复最近一次 stash
1 | git stash pop |
恢复指定的 stash
, stash@{2}
表示第三个 stash
, stash@{0}
表示最近的 stash
1 | git stash pop stash@{2} |
重新接受最近一次 stash
1 | git stash apply |
pop
和 apply
的区别时,pop
会把 stash
内容删除,而 apply
不会。
可以用 git stash drop
来删除 stash
1 | git stash drop stash@{2} |
删除所有 stash
1 | git stash clear |
远程仓库
添加远程仓库
1 | git remote add <remote-name> <remote-url> |
查看远程仓库
1 | git remote -v |
删除远程仓库
1 | git remote rm <remote-name> |
重命名远程仓库
1 | git remote rename <old-name> <new-name> |
查看远程分支
1 | git branch -r |
拉取
git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
从远程仓库拉取代码
1 | git pull <remote-name> <branch-name> |
fetch
默认远程仓库 (origin)
当前分支的代码,然后合并到本地分支
1 | git pull |
将本地改动的代码 rebase
到远程仓库的最新代码上( 为了有一个干净、 线性的提交历史)
1 | git pull --rebase |
获取所有远程分支
1 | git fetch <remote-name> |
fetch
某一个特定的远程分支
1 | git fetch <remote-name> <branch-name> |
推送
推送代码到远程仓库 (然后再发起 pull request
)
1 | git push <remote-name> <branch-name> |
GitFlow
GitFlow 是一种流程模型,用于在Git上管理软件开发项目
主分支 (master/main)
代表了项目的稳定版本,每个提交到主分支的代码都应该是经过测试和审核的。
开发分支 (develop)
用于日常开发。所有的功能分支、发布分支和修补分支都应该从开发分支派生出来。
功能分支 (feature)
用于开发单独的功能或者特性。每个功能分支都应该从开发分支派生,并在开发完成后合并回开发分支。
发布分支 (release)
用于准备项目发布。发布分支应从开发分支派生,并在准备好发布版本后合并回主分支和开发分支。
热修复分支 (hotfix)
用于修复主分支上的紧急问题。热修复分支应该从主分支派生,并在修复完成后,合并回主分支和开发分支。