git的使用

git 基本使用

git 分为 3 个区

  • 工作区 —— 存放文件
  • 暂存区 —— 工作区变更,提交到暂存区
  • 版本库 —— 暂存区的内容,提交到版本库

status 颜色

  • 红: 工作区变更了,但是没有提交到暂存区,此时 git checkout . 会撤回变更无法找回
  • 绿: 已经提交到暂存区
  • 无: 都被 git 管理起来了
1
2
3
4
5
6
7
git status # 查看文件状态(红)

git add . # 工作区-> 暂存区(变绿)


git rest HEAD # 把 工作区 <- 暂存区(由绿变红)
git checkout . #工作区 变更撤回
1
2
3
git commit -m '注释' # 暂存区 -> 版本库

git log # 查看版本库 详细

空文件夹不会被 git 管理

git 忽略文件

  1. 根目录下新建.gitignore文件
  2. 在里面写需要忽略的文件
    1
    2
    3
    mode_models  # 直接忽略该目录
    .idea # 忽略 该文件
    *.log # 忽略 以.log结尾的文件

git 多分支

小公司常用方案: master 分支、dev 分支、bug 分支 、个人分支

以前默认 master 是主分支, 现在默认 main 分支

常用分支操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git branch #查看已建立的分支

git branch 分支名 # 建立分支
git branch -f 分支1 分支2 # 强制分支1指向分支2, 可以分支回退

git checkout 分支名 # 切换分支 或git switch
git checkout -b 分支名 [节点]# 创建分支 并指向节点,把HEAD指向该分支

git merge 分支名 # 合并分支
git rebase 节点1 [节点2] # 取出一系列的提交记录(节点2从节点1的族系分离点开始的所有节点),“复制”它们,然后在另外一个地方逐个的放下去。使得两个分支的功能看起来像是按顺序开发; 把节点2放到节点1下面,节点2缺省默认是HEAD

git rebase -i 分支名 # 可视化, 选择指定节点后面的一些节点添加到指定节点后

git pull origin master# 获取最新的更改,并将它们合并到当前所在的本地分支中

git pull:

  1. 暂存区 工作区 版本库 都会被替换成远程仓库分支的版本。

git 搭建远程仓库

github:
创建一个空仓库

本地:

1
2
3
4
5
6
git init
git add .
git commit -m 'comment'

git remote add origin 仓库路径 #添加一个远程仓库地址名字叫origin(仅本地有效)
git push origin master # 把本地版本库-> origin对应的远程仓库的master上

origin: 在本地仓库中对远程仓库起的别名, 一般叫 origin

1
git clone 仓库地址

拉取远程仓库到本地

1
2
3
git fetch <remote> [place] # 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。
git fetch <remote> [[source]:<destination>]
git pull 仓库地址 # == git fetch + git merge , 本地的远程分支同步改变

推送本地到远程仓库

1
2
git push <remote> [place] # 本地的远程分支同步改变
git push <remote> [[source]:<destination>] # 把本地的source分支推送到远程的destination分支, destination不存在会创建

git push origin main 则是,把main分支推送到origin仓库里

git push origin main --force 强制推送

跟踪本地的远程分支

1
2
git branch -u origin/main foo
git checkout -b foo o/main

git push origin :foo 删除远程仓库的foo分支

git fetch origin :bar 在本地创建一个bar分支

回退

1
2
3
4
git reset --hard 版本号/分支名    #本地版本回退, 版本号可以git log 看到

git push origin master -f #强行推到远端,完全以我为准

整理提交记录 git cherry-pick

git cherry-pick 版本号 指定某些提交记录复制到当前所在的位置(HEAD)下面的话

  • 例如git cherry-pick c1 c2 c3

标签 tag

唯一标记一个节点,不可移动

  • git tag <tagname> 节点

不过不带节点,默认标记HEAD所指节点

  • git describe 节点
    • 查找距离这个节点最近的tag
    • 节点省略默认是HEAD
    • 输出格式 <tagName>_<step>_g<hash>

公司常见git使用情况

  1. 每个人在仓库里有自己的分支
    多分支
  2. 每个人先fork到自己仓库
    fork

push不上 – 冲突

push

  1. 没有权限
  2. 本地版本比线上落后
    • 解决:先git pull一下
    • 解决:变基 rebase
      1
      2
      git checkout feature    #切换到feature分支
      git rebase master #

rebase

执行上面两行代码后

原理:当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向主分支的最新提交,最后将刚才提取的修改应用到主分支的最新提交的后面。

如果B后面没有M git rebase就与git merge没有区别

冲突情况

  1. 多人开发同一分支
  2. 不同分支同一文件被修改,然后 merge

解决: 多 pull

情况一

远程已经更新到新版本,而自己基于旧版本的新代码怎么发布

解决方法1

1
2
3
4
git fetch
git rebase
git push
### git pull --rebase == git fetch + git rebase

解决方法2

1
2
3
4
git fetch 
git merge
git push
#等价于 git pull + git push

情况二

远程服务器拒绝 可能是main被锁定了, 需要一些Pull Request来合并修改。如果你直接提交(commit)到本地main, 然后试图推送(push)修改, 你将会收到这样类似的信息:

1
! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)

解决方法

创建一个新分支