Git

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

inet_protocols = ipv4
inet_interfaces = all
  1. 生成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命令后, 都要查看命令执行是否成功,养成习惯。

克隆项目到本地

  1. 拷贝项目的SSH地址

  2. 在终端中切换到项目目标位置,例如要将项目克隆到本地文件夹

  3. 在终端中输入克隆命令

git clone https://github.com/cpwk/school-trade-api.git

分享项目到远程资源库

有时,我们在本地已经创建的项目,需要分享到Git远程资源库。

  1. 在远程资源库创建同名空项目

  2. 切换项目目录根目录

  3. 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 ...”,代表切换版本成功。
需要注意的是,如果当前分支有未提交的修改,切换版本时会失败,这是对我们工作内容的一种保护机制,防止工作内容丢失。可以有以下几种处理:

  1. 先提交当前分支修改的内容
  2. 废弃当前分支未提交的修改
git reset --hard
  1. 暂存当前分支的修改,等其他分支工作完成,切回当前分支后再取回这些修改。

提交代码

在编写代码之前,一定要知道工作区当前所在分支,避免出现在错误的分支上编写代码。
在完成工作提交代码时执行以下操作:

  • 查看分支修改状态,检查是否存在本次不应该提交的修改。
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”命令。
  1. 暂存修改至堆栈区,执行命令:
git stash

我们通过前后两次执行“git status”命令,发现工作区的修改没有了。
需要强调的是,该命令不仅会暂时保存工作区(Workspace),还会保存暂存区(Index)的修改到堆栈区。
2. 查看堆栈区列表
存储修改到堆栈区后,就可以在干净的分支上进行其他工作了。当其他工作完成之后,我们需要恢复之前存储在堆栈区的内容。
首先,执行可以执行命令查看堆栈区的存储列表,执行命令:

git stash list
  • 列表格式为:
stash@{堆栈区序号}: WIP on 分支名称: 暂存时最后一次commit号的前缀 该commit备注
  1. 从堆栈区恢复
  • 从堆栈区恢复暂时存储的修改内容,可以执行命令:
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 提交地址
  1. 删除远程地址
git remote rm origin
  1. 更换远程地址
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值