参考:廖雪峰git教程
背景
git使用是必须必须会的,每次遇到就是临时的找命令或者只记住了基础的命令,所以想把它总结下来,之后查的时候也方便。
概念
1. 工作区
工作区就是我们平时工作的本地仓库,此时的仓库是没有经过add的。
2. 暂存区
暂存区是git add 之后,但未进行提交的部分。此部分为暂存区。如果我们直接执行 git diff 而不加任何参数的时候,比较的就是工作区和暂存区。
设置仓库
初始化本地仓库
git init
查看远程仓库地址命令
git remote -v
删除远程仓库地址
git remote rm origin
添加远程仓库地址 http://.....
git remote add origin [url]
查看remote地址,远程分支,还有本地分支与之相对应关系等信息
git remote show origin
删除那些远程仓库已经不存在的分支
git remote prune origin
建好 develop 分支的跟踪中央仓库分支
git checkout -b develop origin/develop
设置账号
查看全局账号
git config --global user.name
查看全局邮箱
git config --global user.email
设置全局变量的user.name
git config --global user.name "用户名"
设置全局变量的邮箱
git config --global user.email "邮箱地址"
# 局部的信息就是去掉上面的 --global
提交commit
提交变化文件到缓存区
git add .
提交 commit
git commit -m "描述"
修改最近一次 commit 提交的描述
git commit --amend
推送远程仓库
第一次推送分支
git push -u origin master
git push -u origin develop
推送主分支
git push origin master
推送其他分支
git push origin dev
推送当前分支
# 不带任何参数的git push,默认只推送当前分支,这叫做simple方式。
git push origin
管理分之
查看本地分支
git branch
查看远程分支列表
git branch -r
查看所有分之
git branch -a
查看本地分支与远程分支的映射关系
git branch -vv
建立当前分支与远程分支的映射关系
git branch -u origin/master
git branch --set-upstream-to origin/addFile
撤销本地分支与远程分支的映射关系
git branch --unset-upstream
创建分支
git branch dev
切换分支
git checkout dev
创建dev分支,然后切换到dev分支
# git checkout命令加上-b参数表示创建并切换,相当于以上两条命令
git checkout -b dev
删除本地分支
# 在master分支下,删除新开的dev分支
git branch -d dev
删除分支(即使没有合并)
注意:如果dev的更改,push到远程,在GitLab(或者其他git系统)上面进行了merge操作,
但是本地master没有pull最新的代码,会删除不成功,
可以先git pull origin master,或者强制删除
git branch -D dev
删除远程分支dev
git push origin :dev
更新分支列表信息
# -p 表示删除不存在的远程跟踪分支
git fetch -p
commit 回退
回退上一个版本
git reset --hard HEAD^
# 上上一个版本就是HEAD^^
# 100个版本写成HEAD~100
回退到指定版本
git reset --hard 1094a
# 1094a 是版本号。
# 版本号没必要写全,前几位就可以了,Git会自动去找。
# 当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了
commit 历史
查看分支历史
git log
简化查看分之历史
# 没有pretty的是,只有commit id 前7位,加pretty的是全部的id
git log --oneline
git log --pretty=oneline
图形式展示分支历史
git log --graph
简化版图形式展示分支历史
git log --graph --oneline
简化版图形式展示分支历史附带展示已经修改的文件
git log --graph --oneline --name-only
使用git reset --hard命令改变了HEAD指向某个版本后后,还可以用git log --reflog查看所有版本。
git log --reflog
合并
普通合并
git merge dev
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward
# 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m "merge with no-ff" dev
合并多次提交
非关键性的提交太多会让版本历史很难看、冗余,所以合并多次提交也是挺有必要的。
同样是使用以上的变基命令,不同的是变基命令打开的文本编辑器里的内容的修改。
将pick修改为squash,可以是多行修改,然后保存退出。
这个操作会将标记为squash的所有提交,都合并到最近的一个祖先提交上。
注意:不能对的第一行commit进行修改,至少保证第一行是接受合并的祖先提交。
-i参数表示进入交互模式。
git rebase -i <commit range>
历史
记录你的每一次命令
git reflog
查看本地工作区、暂存区中文件的修改状态
git status
帮助
git help
帮助特定的命令
git help diff
文件对比
在我们不指定专门的文件夹的时候,git diff 默认比较的是整个项目 git 目录。
工作区与暂存区比较
git diff
工作区与 HEAD ( 当前工作分支) 比较
git diff HEAD
工作区比较上次的提交
git diff HEAD^
工作区比较上两次提交,于是有了,git diff HEAD~n 是比较上n次提交与现在工作区间的关系
git diff HEAD~2
工作区与暂存区文件比较
git diff filename
工作区比较特定提交
git diff commitId
工作区与特定提交文件进行比较
git diff commitId filepath
暂存区与 HEAD 比较
git diff --cached
暂存区比较 HEAD 的某个文件差异
git diff --cached _posts/blog/2019-02-16-git.md
当前分支与 branchName 分支进行比较
git diff branchName
当前分支的文件与branchName 分支的文件进行比较
git diff branchName filepath
查看某两个版本之间的差异
git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9 b8e7b00c02b95b320f14b625663fdecf2d63e74c
查看某两个版本的某个文件之间的差异
git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9:filename b8e7b00c02b95b320f14b625663fdecf2d63e74c:filename
合并多次 commit
针对多次 commit 但是未 push 到远程仓库的情况
使用 git log –oneline 命令查看提交历史
想要合并前四个 commit,执行 git rebase -i HEAD~4 对最近的 4 个 commit 进行 rebase 操作
进入编辑界面,把要保留的 commit 使用 pick,其他的使用 squash 命令,或者根据命令提示选择自己想用的命令。
squash 和 fixup 区别是 squash 会将该 commit 的注释添加到上一个 commit 注释中,fixup 是放弃当前 commit 的注释。
保存退出,Git 自动进入另一个界面,此时就可以写合并之后 commit 的信息了。
将信息修改后保存退出,可以看到成功的命令。
重新查看提交提交历史,会发现这些 commit 已经合并了,整个提交历史简洁了很多
删除某次 commit
同样的,利用 git 压缩 rebase 指令来删除某个 commit,过程和以上是类似的;
将需要删除的 commit 设置操作指令 drop ,保存退出即可。
Merge Request
如何通过 GitLab 的 Merge Request(合并请求)进行代码审查以及我们遵循的现有代码审查最佳实践来改进工作流程。
参考链接