Git的使用


 

Git工作流程

在这里插入图片描述
Repository是本地仓库(暂存区域),Remote是远程仓库。

根目录下的.git文件夹中,index文件是暂存区域,其他文件组成版本库,HEAD文件指向当前版本。

 

工作流程

  • 大佬写好项目骨架push到远程仓库;
  • 组员第一次参与该项目时fetch或clone项目到本地仓库,之后每天pull更新到工作区域
  • 每天写写代码,新增的文件、文件夹 git add 添加到git管理中,写好了 git commit 提交到本地仓库,git push到远程仓库

 

项目骨架提交流程

1、本地 git 配置好远程仓库的 ssh key(公私钥)
 

2、在远程创建好仓库,初始化仓库时

  • 添加README文件:勾选
  • 添加 .gitignore:如果本地项目中已经有了这个文件,则不必勾选,否则选择对应的模板。IDEA创建的项目一般都有此文件,去掉其中的 README 即可,不用勾选此项。
  • 许可证:一般选择 MIT 即可
  • 注意:创建的默认分支是 main,不是master,也可以在 settings 中改为 master
    在这里插入图片描述
     
    3、推送本地项目到远程,有2种方式

 

方式一 (推荐)

(1)git clone 先把远程仓库clone到本地

(2)把本地项目中的文件剪切到clone下来的文件夹中

(3)git add -> commit -> push。push时如果之前没有绑定对应的远程账号(比如github、gitlab账号),需要先验证账号。

 

方式二

(1)打开本地项目的根目录,右键 -> Git Bash Here -> git init 初始化为一个本地仓库,此时会生成一个对应的.git文件夹。

(2)关联到对应的远程仓库 git remote add origin https://github.com/xxx/xxx.git

如果报错 fatal: remote origin already exists,说明此本地仓库已经关联某个远程仓库,
git remote -v 查看已关联的远程仓库,git remote rm origin 删除已关联的远程仓库后再重试。

 
注意: git初始化本地仓库时创建的默认分支是master,github初始化(远程)仓库时创建的默认分支是main。可以 git checkout 切换到 main 操作,也可以将github初始化(远程)仓库时创建的默认分支改为master,总之要保证后续操作时远程、本地的主分支一致。
 
(3)git add -> commit
 

(4)git pull --rebase origin master|main master、main根据远程仓库的主分支确定,后续不在说明。

先拉一下远程文件,不然远程仓库初始化时生成的README之类的文件本地仓库中没有,后续 push 时可能会报错 error: failed to push some refs to https://github.com/xxx/xxx.git

如果报错 fatal: unable to access : Failed to connect to github.com port 443: Timed out 之类 443、ssl 错误,一般是因为开着vpn,将vpn关闭后再试。
 

(5)推送到远程仓库 git push -u origin master|main,如果之前没绑定github 之类对应的远程账号,需要先验证账号。

 

方式三 (推荐)

针对于 IDEA + github
在这里插入图片描述
Create Git Repository 相当于 git init,只是创建本地仓库。
 
在这里插入图片描述
会自动创建本地仓库、github远程仓库,并push到远程仓库中去,创建的远程分支与本地分支保持一致,均为master。要求指定的远程仓库不存在,不然会提示错误。

 

创建本地仓库
cd F:/program/xm-mall  #先cd到项目根目录
git init  #初始化当前目录为仓库,当前目录下会生成一个隐藏的.git文件夹


#也可以这样
cd F:/program
git init xm-mall  #初始化指定目录为仓库,如果xm-mall不存在会自动创建

 

暂存区域
添加到暂存区域
git add db.sql upload  #添加文件、文件夹到暂存区域,如果有多个,空格隔开。可以使用相对路径、绝对路径,相对路径相对于当前目录,可用pwd查看当前目录

git add resource/*    #可使用通配符
git add mapper/*.xml

git add .    #.表示当前目录下的所有文件、文件夹
git add --all   #也可以这样写

 

查看暂存区域
git status  #查看增删改的文件哪些被添加到了暂存区域(绿色),哪些没有被添加到暂存区域(红色)

git diff  #查看修改的具体内容

 

暂存区域回退

如果某些文件已添加到暂存区域,现在又不想提交到仓库,可以从暂存区域移除,即回退该文件的add操作

git reset HEAD db.sql  #把指定的文件从暂存区域回退,有多个时空格隔开
git reset HEAD  #如果缺省文件,默认为最近一次git add 添加的

 

本地 => 远程仓库
把暂存区域的内容提交到本地仓库
git commit -m "提交sql脚本"  #每次commit版本库中都会产生一个新的版本

git commit -am "提交所有修改"   #添加、提交一步到位,-a即all,将所有增删改过的文件添加到暂存区域、再提交到本地仓库
git push github master #指定远程仓库、要同步的分支

git push -u github master  #如果当前仓库与多个远程仓库关联,可以用-u指定一个默认的远程仓库,以后git push未指定远程仓库时,使用默认的远程仓库

git push master #如果当前仓库只与一个远程仓库关联,或者指定了默认的远程仓库,则可缺省远程仓库

 

版本管理
git log  #查看当前及之前的版本
git reflog  #列出版本库中所有的版本

 

版本回退
有3种回退类型:都会先将工作区的文件回滚到指定版本

  • mixed (常用),默认的回退类型,直接移除暂存区的内容,不回滚到工作区
  • hard 将暂存区的内容回滚到工作区,再移除暂存区的内容
  • soft 暂存区的内容保留,不移除也不回滚到工作区
git reset HEAD~   #回退到当前版本的上一个版本。HEAD指向当前版本,~也可以写成^
git reset HEAD~3  #回退到当前版本的上3个版本,不指定数字时,默认为1
git reset 版本号  #回退到指定版本


git reset HEAD~ readme.md   #如果指定了文件、文件,则只回退指定的文件、文件夹,有多个时空格分隔


#以上均未指定回退类型,默认为git reset --mixed,其它回退类型的用法和--mixed的相同,eg
git reset --hard HEAD~ 

 

远程仓库 => 本地

#从远程仓库clone项目到本地
git clone git@github.com:TANGKUO/HIS.git

#从远程仓库拉取更新,会自动合并到本地的当前分支
git pull

#从远程仓库拉取更新,不会自动合并,后续需要 git merge 手动合并。然后 git checkout 检出才能使用?
git fetch
git merge 本地分支名  #合并到本地仓库的指定分支中,缺省分支名时默认合并到当前分支中

 

分支管理

有时候需要开发某一模块,可以以分支的形式开发,分支、主干同时开发,分支开发完合并到主干上。项目默认的主干是master

git branch 分支名  #创建一个新分支,创建后的分支在本地仓库中,需要从当前分支切换过去才可以使用

git checkout 分支名  #从本地仓库中检出指定分支到工作区,即从当前分支切换到指定分支

git checkout -b 分支名  #一步到位,创建并检出|切换到该分支


git branch  #查看所有分支


git branch -d 分支名  #删除分支。-d只能删除已合并到主干上的分支,如果分支尚未合并到主干上,无法用-d删除
git branch -D 分支名  #-D 强制删除,不管分支有没有合并到主干上,都可以删掉

git merge 分支名  #把指定分支合并到当前分支中。合并默认使用fast forward模式,删除分支后会丢失分支信息,也就看不出来曾经有过这个分支、做过合并
git merge --no-ff -m "合并说明" 分支名   #--no-ff 不使用ff(fast forward)模式,删除分支后在历史版本中仍可以看到该分支信息、保留合并痕迹,可以加合并说明。这种用得多

#肯定要git commit提交该分支的修改到本地仓库中后,才进行分支合并
#合并之后一般要使用git branch -d 删除分支

 

标签管理

每次提交到本地仓库都会产生一个新的版本,Git使用一长串字符作为版本号来标识一个版本,其实也不算是版本号,只是commit id。

一串乱七八糟的字符可读性不好,如果项目开发得差不多了,要作为内测版、候选版、正式版之类的发布;或者项目进行了重大修改,要特殊标识这次提交,可以给本次提交加一个tag

git tag -a v2.0  #给最近1次提交的版本加tag,-a即add
git tag v2.0  #可以省略-a,之类写标签名
git tag v2.0 commit_id #给指定的提交版本加tag


git tag  #查看所有的tag,只列出tag
git log  #git log系列命令也会列出tag,信息更加详细
git show v2.0  #查看某个tag对应的提交版本的详细信息,包括提交者信息、提交时间、具体修改信息等


git tag -d v2.0   #删除指定的tag,只删除tag,不删除对应的版本


#tag默认存储在本地仓库中,删除也是删除本地仓库中的,push时默认不会推送tag
#如果要在远程仓库中使用tag,还需做一些操作
git push github v2.0  #推送指定的tag到远程仓库,标识的是上一次push提交的版本。此处的github是远程仓库别名
git push github --tags  #推送本地仓库中所有的tag到远程仓库,分别标识对应的版本
git push github :refs/tags/v2.0  #在本地仓库删除tag后,同步删除操作到远程仓库

 

删除文件、文件夹

直接在windows资源管理器中删除文件、文件夹,只是物理删除,本地仓库中关于该文件、文件夹的记录还在,版本回退时依旧可以恢复。

git方式删除文件、文件夹,是物理删除 + 删除版本库中的相关信息,一旦提交,版本回退时不会回滚该文件、文件夹(不会恢复)。

git rm index.html  #删除文件
git rm -r resource  #删除文件夹,-r表示递归

git rm会自动把删除操作添加到暂存区,我们只需git commit提交

 

BFG 修改已push的敏感内容

如果已经把连接地址、账号、密码之类的敏感信息 push 到 public 的远程开源仓库,可以使用 BFG 进行修改,不会在 git 历史记录中留下痕迹,但之前 pull 过的人仍会看到原来的提交内容。

1、官网下载 BFG:https://rtyley.github.io/bfg-repo-cleaner

2、新建 bfg.txt,指定处理方式

# 默认为删除,删除 password1 字符串
password1
# 把 password2 替换为 xxx
password2 ==>xxx
# 把 password3 替换为空串
password3 ==>
# 正则匹配替换,将password具体的数据删除 password=xxx 替换为 password=
regex:password4=\w+==>password=

3、命令行依次执行

# 先用 --mirror 克隆仓库
git clone --mirror git@github.com:chy/xxx.git

# 使用 BFG 进行处理
# 如果当前分支是 master 之类的保护分支,BFG 默认不能直接修改保护分支,需要额外加 --no-blob-protection
java -jar bfg.jar --replace-text "bfg.txt" xxx.git

# 进入克隆下来的项目根目录
cd xxx.git

# 清理 git 脏数据
git reflog expire --expire=now --all && git gc --prune=now --aggressive

# 推送至远程仓库
# 如果是保护分支、不允许强制推送,可以先取消保护,强制push后再重新设置为保护
git push --force
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值