Git 的基本使用汇总

2019/02/16 Tools

参考:廖雪峰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(合并请求)进行代码审查以及我们遵循的现有代码审查最佳实践来改进工作流程。


参考链接

Search

    Table of Contents