Git是什么
Git是一个开源的分布式版本控制系统,用于敏捷高效地管理项目,是目前最先进版本控制系统。
Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
Git与曾经常用的集中式版本控制工具CVS、SVN等不同,它分布式版本库的方式。
GitHub是目前全球最大的Git开源资源库,地址是https://github.com/,这是程序员的聚宝盆,上面有最优秀的程序员贡献的最棒的代码和资源。
Gitee是目前国内优秀的Git资源库,既可以创建开源项目,又可以托管私有项目。地址是https://gitee.com/。

安装Git
在使用之前需要先安装Git,目前在Mac、Windows和Linux/Unix平台上运行。安装下载地址为:https://git-scm.com/downloads。
下载相应系统的对应的安装文件,安装即可。
本地环境安装
安装GitLab
- 环境安装https://www.cnblogs.com/wenwei-blog/p/5861450.htmlhttps://blog.youkuaiyun.com/u013697959/article/details/78041465https://blog.youkuaiyun.com/liuxiaoming1109/article/details/81032679
- 启动postfix的时候报错https://blog.youkuaiyun.com/Rodulf/article/details/70224856
- 修改 /etc/postfix/main.cf的设置
inet_protocols = ipv4
inet_interfaces = all
- 邮箱配置https://docs.gitlab.com/omnibus/settings/smtp.html#aliyun-enterprise-mail-with-tls
- GitLab 项目创建后地址由Localhost改为实际IP的方法https://blog.youkuaiyun.com/qq_37674858/article/details/81214519
- 汉化https://www.cnblogs.com/roam/p/7677836.html
- 配置SSH
配置SSH是为了在执行Git命令时,不用每次都输入账号密码。
- 生成SSH Key
首先,进入个人主目录,查看是否存在“.ssh”目录(隐藏文件夹),若存在可直接跳过自步骤,若不存在就需要先生成一个SSH Key。
我们使用自己的账号登录Git资源库网站,查看生成SSH Key的说明文档。点击个人账号,进入“profile settings”,点击“SSH Keys”,最后点击“generate it”。
- 终端中进入个人主目录,执行命令:
ssh-keygen -t rsa -C "1395688079@qq.com"
这个指令会要求你提供一个位置和文件名去存放键值对和密码,你可以点击Enter键去使用默认值。
直接按Enter就行。然后,会提示你输入密码,直接回车即可,其中,"1395688079@qq.com"
是个人GIT平台的账号,替换成自己的。
2. 添加SSH Key
- 先拷贝目录.ssh中的文件id_rsa.pub的全部内容,执行命令:
cat ~/.ssh/id_rsa.pub

然后,打开网站“SSH Keys”页面,点击“Add SSH Key”按钮,打开添加页面:

- 在“key”后的文本域中粘贴,在“Title”后的输入框中键入一个名词作为该SSH Key的标记,点击“Add key”按钮保存。
Git控制流程

图中四个节点分别是:
- Remote:远程资源库
- Repository:本地资源库
- Index:暂存区
- workspace:工作区
节点与节点之间通过Git命令控制资源的交互 - fetch/clone:从远程资源库克隆拷贝到本地资源库
git clone [url]
- checkout:从本地资源检出到工作区
git checkout [branch-name]
- pull:从远程资源库拉取资源到工作区
git pull
- add:把工作区的变更(添加、删除和修改)提交到暂存区
git add .
git add [dir]
git add [file1] [file2] [...]
- commit:将暂存区提交到本地资源库
git commit -m [message]
- push:同步本地资源库的提交到远程资源库
git push
Git使用场景
执行任何Git命令后, 都要查看命令执行是否成功,养成习惯。
克隆项目到本地
-
拷贝项目的SSH地址
-
在终端中切换到项目目标位置,例如要将项目克隆到本地文件夹
-
在终端中输入克隆命令
git clone https://github.com/cpwk/school-trade-api.git
分享项目到远程资源库
有时,我们在本地已经创建的项目,需要分享到Git远程资源库。
-
在远程资源库创建同名空项目
-
切换项目目录根目录
-
Git初始化,输入命令
git init
- 使本地项目与远程资源库建立连接
git remote add origin https://github.com/cpwk/school-trade-api.git
其中https://github.com/cpwk/school-trade-api.git是该项目在资源库的SSH地址。
- 将本地项目资源文件添加到暂存区
git add .
- 提交暂存区到本地资源库
git commit -m '项目托管到远程资源库'
- 同步到远程资源库
git push -u origin master
至此,本地项目就与远程资源库建立连接,并托管所有已有代码。
切换分支
工作区默认是在主分支(master)上的,由于主分支的重要性,我们往往不能直接在主分支上开发代码,而是在其他分支上开发代码,待功能完善经过测试后合并到主分支上。
例如,我们要在“v0.1”版本的分支上编写代码,我们需要先将工作区切换到该版本。
先将远程资源库中分支同步到工作区,输入命令
git pull
- 执行切换分支的命令
git checkout v0.1
如果,回车执行命令后,终端输入“Switched to a new branch ...”,代表切换版本成功。
需要注意的是,如果当前分支有未提交的修改,切换版本时会失败,这是对我们工作内容的一种保护机制,防止工作内容丢失。可以有以下几种处理:
- 先提交当前分支修改的内容
- 废弃当前分支未提交的修改
git reset --hard
- 暂存当前分支的修改,等其他分支工作完成,切回当前分支后再取回这些修改。
提交代码
在编写代码之前,一定要知道工作区当前所在分支,避免出现在错误的分支上编写代码。
在完成工作提交代码时执行以下操作:
- 查看分支修改状态,检查是否存在本次不应该提交的修改。
git status
- 查看工作区修改明细,开头是“-”号的红色内容是修改前的内容,而开头是“+”号的绿色部分是修改后的内容。
$ git diff
- 提交前先更新远程资源库中最新代码到工作区,因为可能有团队中其他成员提交了代码。
git pull
如果没有拉取到新的内容,或者拉取到新内容并且与工作区修改没有冲突,则可以提交代码。
如果拉取到新内容,并且和工作区修改的内容相冲突,则需要先处理掉冲突的部分,然后重复以上操作,提交代码。
- 提交代码
前面三部都是提交前的准备工作,不能跳过。确定本次要提交的修改准确无误后,方可提交代码。至少,别人拉取你提交的代码后,项目是能启动的吧。
依次执行以下命令:
git add .
git commit -m '本次提交的说明,需要让别人明白你提交了什么'
git push
暂存至堆栈区
我们在日常工作中,可能会遇到以下场景:
- 当正在某个项目的分支v1.1版本上开发时,项目中出现了一个bug,需要立即在分支v1.0版本上修复。但是正在开发的内容只完成了一半,还不想或者还不能提交,提交了不能运行的代码会影响其他团队成员的工作。
- 由于疏忽本应该在分支v1.1版本上开发的内容,却在分支v1.0版本上进行了开发,需要切到分支v1.1上继续开发。
解决这两个场景下的问题,我们需要使用“git stash”命令。
- 暂存修改至堆栈区,执行命令:
git stash
我们通过前后两次执行“git status”命令,发现工作区的修改没有了。
需要强调的是,该命令不仅会暂时保存工作区(Workspace),还会保存暂存区(Index)的修改到堆栈区。
2. 查看堆栈区列表
存储修改到堆栈区后,就可以在干净的分支上进行其他工作了。当其他工作完成之后,我们需要恢复之前存储在堆栈区的内容。
首先,执行可以执行命令查看堆栈区的存储列表,执行命令:
git stash list
- 列表格式为:
stash@{堆栈区序号}: WIP on 分支名称: 暂存时最后一次commit号的前缀 该commit备注
- 从堆栈区恢复
- 从堆栈区恢复暂时存储的修改内容,可以执行命令:
git stash pop
该命令会从堆栈区弹出最顶端,也就是最后一次暂存的内容,即“stash@{0}”中的内容,恢复到工作区(Workspace),并从堆栈区移除,我们就可以继续之前未完成的工作了。
“git stash”还有其他的子命令,例如:
- 从堆栈区恢复内容,但是不从堆栈区移除
git stash apply
该命令默认恢复的是“stash@{0}”中的内容。也可以恢复指定stash到当前工作区,例如:
git stash apply stash@{1}
- 清除堆栈区中的所有内容
git stash clear
- 查看堆栈区最后保存的stash和当前工作区的差异
git stash show
- 同样可以比较指定stash和当前工作的差异
git stash shwo stash@{1}
解决冲突
-
当执行“git pull“或者“git stash pop“命令合并代码时,如果命令反馈信息提示有代码冲突(CONFLICT),则需要先合并冲突的代码,在进行提交操作。
-
在IDEA或WebStorm集成开发环境中点击打开“Version Control“,
-
然后点击“Merge Conflicts“后的“Resolve“链接,打开有冲突的文件列表:
-
双击列表中一行,打开合并视图来解决该文件的冲突:
打开的视图中有三个子窗口,分别你修改的版本(Your Version)、从代码库中拉取的版本(Changes from server)和合并后的目标版本(Result)。
对比两个版本之间的代码差异,进行合并工作,每一处冲突都可能有以下三种情况:
- 保留从服务器代码块中拉取的部分
- 保留你的本地修改,覆盖拉取部分的相应冲突
- 既保留从服务器代码块拉取的部分,也保留本地修改的部分
将合并结果保存到Result视图中,保证代码正确可运行。最后点击右下角“Apply“按钮,直到所有冲突都已解决。
Git常⽤命令
新建代码库
- 在当前⽬录新建⼀个Git代码库
git init
- 新建⼀个⽬录,将其初始化为Git代码库
git init [project-name]
- 下载⼀个项⽬和它的整个代码历史
git clone [url]
配置
Git的设置⽂件为.gitconfig,它可以在⽤户主⽬录下(全局配置),也可以在项⽬⽬录下(项⽬配置)。
- 显示当前的Git配置
git config --list
- 编辑Git配置⽂件
git config -e --global]
- 设置提交代码时的⽤户信息
git config [--global] user.name “[name]”
git config [--global] user.email “[email address]”
- 查找git安装路径
which git
增加/删除⽂件
- 添加指定⽂件到暂存区
git add [file1] [file2] …
- 添加指定⽬录到暂存区,包括⼦⽬录
git add [dir]
- 添加当前⽬录的所有⽂件到暂存区
git add .
- 添加每个变化前,都要求确认。对于同⼀个⽂件的多处变化,可以实现粉刺提交
git add -p
- 删除⼯作区⽂件,并将这次删除放⼊缓存区
git rm [file1] [file2] …
- 停⽌追踪指定⽂件,但该⽂件会保留在⼯作区
git rm --cached [file]
- 改⽂件名,并将这个改名放⼊暂存区
git mv [file-original] [file-renamed]
代码提交
- 提交暂存区到仓库区
git commit -m [message]
- 提交暂存区的指定⽂件到仓库区
git commit [file1] [file2] … -m [message]
- 提交⼯作区⾃上次commit之后的变化,直接到仓库区
git commit -a
- 提交时显示所有diff信息
git commit -v
- 使⽤⼀次新的commit,替代上⼀次提交,
- 如果代码没有任何变化,则⽤来改写上⼀次commit提交的信息
git commit --amend -m [message]
- 重做上⼀次commit,并包括指定⽂件的新变化
git commit --amend [file1] [file2] …
分⽀
- 列出所有本地分⽀
git branch
- 列出所有远程分⽀
git branch -r
- 列出所有本地分⽀和远程分⽀
git branch -a
- 新建⼀个分⽀,但依然停留在当前分⽀
git branch [branch-name]
- 新建⼀个分⽀,并切换到该分⽀
git checkout -b [branch]
- 新建⼀个分⽀,指向指定commit
git branch [branch] [commit]
- 新建⼀个分⽀,与指定的远程分⽀建⽴追踪关系
git branch --track [branch] [remote-branch]
- 切换到指定分⽀,并更新⼯作区
git checkout [branch-name]
- 切换到上⼀个分⽀
git checkout -
- 建⽴追踪关系,在现有分⽀与指定的远程分⽀之间
git branch —set-upstream [branch] [remote-branch]
- 合并指定分⽀到当前分⽀
git merge [branch]
- 选择⼀个commit,合并进当前分⽀
git cherry-pick [commit]
- 删除分⽀
git branch -d [branch-name]
- 删除远程分⽀
git push origin --delete [branch-name]
git branch -dr [remote/branch]
标签
- 列出所有tag
git tag
- 新建⼀个tag在当前commit
git tag [tag]
- 新建⼀个tag在指定的commit
git tag [tag] [commit]
- 删除本地tag
git tag -d [tag]
- 删除远程tag
git push origin :refs/tags/[tagName]
- 查看tag信息
git show [tag]
- 提交指定tag
git push [remote] [tag]
- 提交所有tag
git push [remote] --tags
- 新建⼀个分⽀,指向某个tag
git checkout -b [branch] [tag]
查看信息
- 显示有变更的⽂件
git status
- 显示当前分⽀的版本历史
git log
- 显示commit历史,以及每次commit发⽣变更的⽂件
git log --stat
- 搜索提交历史,根据关键字
git log -S [keyword]
- 显示某个commit之后的所有变动,每个commit占据⼀⾏
git log [tag] HEAD --pretty=format:%s
- 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
git log [tag] HEAD --grep feature
- 显示某个⽂件的版本历史,包括⽂件改名
git log --follow [file]
git whatchanged [file]
- 显示指定⽂件相关的每⼀次diff
git log -p [file]
- 显示过去5次提交
git log -5 --pretty --oneline
- 显示所有提交过的⽤户,按提交次数排序
git shortlog -sn
- 显示指定⽂件是什么⼈在什么时间修改过
git blame [file]
- 显示暂存区和⼯作区的代码差异
git diff
- 显示暂存区和上⼀个commit的差异
git diff --cached [file]
- 显示⼯作区与当前分⽀最新commit之间的差异
git diff HEAD
- 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
- 显示今天你写了多少⾏代码
git diff --shortstat "@{0 day ago}"
- 显示某次提交的元数据和内容变化
git show [commit]
- 显示某次提交发⽣变化的⽂件
git show --name-only [commit]
- 显示某次提交时,某个⽂件的内容
git show [commit]:[filename]
- 显示当前分⽀的最近⼏次提交
git reflog
- 从本地master拉取代码更新当前分⽀:branch ⼀般为master
git rebase [branch]
远程同步
- 更新远程仓库
git remote update
- 下载远程仓库的所有变动
git fetch [remote]
- 显示所有远程仓库
git remote -v
- 显示某个远程仓库的信息
git remote show [remote]
- 增加⼀个新的远程仓库,并命名
git remote add [shortname] [url]
- 取回远程仓库的变化,并与本地分⽀合并
git pull [remote] [branch]
- 上传本地指定分⽀到远程仓库
git push [remote] [branch]
- 强⾏推送当前分⽀到远程仓库,即使有冲突
git push [remote] --force
- 推送所有分⽀到远程仓库
git push [remote] —all
- 强制覆盖本地⽂件
git reset —hard origin/[branch]
撤销
- 恢复暂存区的指定⽂件到⼯作区
git checkout [file]
- 恢复某个commit的指定⽂件到暂存区和⼯作区
git checkout [commit] [file]
- 恢复暂存区的所有⽂件到⼯作区
git checkout .
- 重置暂存区的指定⽂件,与上⼀次commit保持⼀致,但⼯作区不变
git reset [file]
- 重置暂存区与⼯作区,与上⼀次commit保持⼀致
git reset --hard
- 重置当前分⽀的指针为指定commit,同时重置暂存区,但⼯作区不变
git reset [commit]
- 重置当前分⽀的HEAD为指定commit,同时重置暂存区和⼯作区,与指定commit⼀致
git reset --hard [commit]
- 重置当前HEAD为指定commit,但保持暂存区和⼯作区不变
git reset --keep [commit]
- 新建⼀个commit,⽤来撤销指定commit。后者的所有变化都将被前者抵消,并且应⽤到当前分⽀
git revert [commit]
- 暂时将未提交的变化移除,稍后再移⼊
git stash
git stash pop
其他
- ⽣成⼀个可供发布的压缩包
git archive
- ⽣成patch
git diff > filename.patch
- git 更换push 提交地址
- 删除远程地址
git remote rm origin
- 更换远程地址
git remote add origin [新地址]
- 把当前分支与远程分支进行关联
git push --set-upstream origin master
权限管理
五种权限:Guest、Reporter、Developer、Master、Owner
- Guest:可以创建issue、发表评论,不能读写版本库
- Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
- Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限
- Master:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
- Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限
Gitlab中的组和项目有三种访问权限:Private、Internal、Public - Private:只有组成员才能看到
- Internal:只要登录的用户就能看到
- Public:所有人都能看到
开源项目和组设置的是Internal