Git

基本操作

  • 基本操作

    git init 创建一个新的本地存储库

    git clone 克隆代码

    git clone -b <分支名称> [指定目录] 将存储库克隆到指定目录,并指定分支

    git status 查看当前更改状态

    git add 提交更改,存储到暂存区

    git reset 取消暂存文件,保留文件更改 [–hard] 将所有内容恢复到最后一次提交

    git checkout . 还原所有修改,不会删除新增的文件

    git clean -xdf 下面命令会删除新增的文件

    git diff 查看已更改但未暂存内容的差异 [–staged] 已 commited 但尚未提交的内容的差异

    git commit -m “add 添加新功能” 提交本地仓库

    git commit –amend -m “new message” 重写最后的提交消息

    git commit –amend –no-edit 修改最新的提交而不更改提交消息

    git log 显示当前活动分支的提交历史

    git log branchB..branchA 显示 branchA分支 上不在 branchB分支 上的提交

    git diff branchB…branchA 显示 branchA分支 中的内容与 branchB分支 中的内容的差异

    git push 提交远程仓库 ( 默认是向远程仓库的master分支push)

    git push origin xxxxxx 提交到远程仓库的xxxxxx分支

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 功能开发完成后,将提交的本地仓库的xxxxxx分支合并到主分支,再上传到远程仓库

    //首先切换到主分支
    git checkout master
    //拉取master分支新代码,防止主分支做了更改,合并失败( 此阶段可能会产生冲突)
    git pull
    //将xxxxxx分支合并到master主分支
    git merge xxxxxx
    //将最新代码推送到远程仓库
    git push
  • 分支操作

    git branch 查看当前分支;列出所有本地分支 [-av] 列出所有分支,本地和远程

    git branch -m #重命名分支

    git checkout 切换分支 [-b 分支名] 并创建 [-d 分支名] 删除分支

工作中项目git都如何管理,冲突,push不上去如何解决

  1. 现在公司中一般的git仓库的管理方式是什么样的

    • 共用一个仓库,不同开发人员用不同分支,编写完后,再合并到主分支( 中小型公司)
    • 主仓库不直接开发,成员把仓库fork到自己的账号下,然后开发合并
  2. 代码为什么会push不上线上仓库

    • 没有权限
    • 本地比线上落后,有人比你先提交了他的功能代码( 重点)
    1
    2
    3
    4
    5
    6
    7
    8
    // 解决方案
    git pull // 然后在重新提交

    // 如果发生的冲突修改的是跟你是同一个文件的同一区域 git pull 就会产生冲突,需协商手动解决
    // 如果有冲突会有 '<<<<< HEAD' 和 '======' ">>>>>>>> 哈希值"
    '<<<<< HEAD' 到'======' 是你本地的版本代码
    '======' 到 ">>>>>>>> 哈希值" 是远程仓库版本
    // 协商手动解决完后,需重新走一遍提交流程
  3. 如何解决代码冲突

关于提交问题

  • 合并(会把dev分支最新到main分支复制的分支记录所有合并到main分支上)

    1
    git merge dev
  • 将分支合并后但不提交,会把修改记录或者冲突记录在工作本地;需自动提交(只会生成一个提交记录)

    1
    git merge --squash dev

视觉化的方式查看git提交记录

1
2
3
4
5
6
7
8
9
10
11
12
git log --graph --pretty=oneline --abbrev-commit

# log
* 7a3c4e7 Merge branch 'feature-xyz'
* e3f7b2a Update README.md
| * 1f3a5bc Add new feature XYZ
|/
* 2d8e155 Initial commit

# 每一行代表一个提交。
# * 表示当前分支的提交,而 | 和 / 则显示出提交的分支和合并情况。
# 缩短的提交哈希值(如 7a3c4e7)在行的开始部分,后面是提交的描述信息。

关于回退问题

如果没有冲突,直接回退:git reset –hard HEAD

说明:将工作区和暂存区都回滚到上一次提交的状态,丢掉合并带来的改动。谨慎使用,因为会丢失未提交的修改。

如果你还想保留合并引入的改动以备后续参考,可以仅回退提交状态,但保留改动:git reset –soft HEAD

这时改动仍在暂存区,可按需重新提交或修改后再提交。

git stash

  • 保存修改

    1
    2
    3
    git stash
    # 添加信息方式的保存
    git stash save "message"
  • 查看保存的所有stash列表

    1
    git stash list
  • 应用stash

    1
    2
    3
    4
    5
    6
    # 应用最近的stash记录,完成后不会删除
    git stash apply
    # 应用最近的stash记录,完成后会删除
    git stash pop
    # 应用指定stash记录
    git stash apply stash@{n}
  • 清空stash

    1
    git stash clear

worktree

功能:它 允许我们同时在多个分支上工作,并且每个分支都有自己的工作目录

场景:你正在某个分支中处理一个功能,突然之间需要在主分支(master)中修复一个关键性 bug

不使用 git worktree

  1. 在分支中存储或提交功能的更改
  2. 切换到主分支(master),在主分支中修复错误,提交修复
  3. 切换回功能分支,然后取消存储或检出更改。

使用 git worktree:

  1. 使用以下命令为主分支创建一个新的工作树到新的文件夹下
1
git worktree add ../bugfix master
  1. 并在该目录中签出主分支。现在,你可以转到 bugfix 目录并修复 bug,在这里进行的任何更改都将在主分支上进行,并不会影响其他分支。一旦完成了bug修复,则可以直接提交你的更改
1
2
cd ../bugfix
git commit -am "修复 bug"
  1. 返回到原工作目录并继续在原分支(feature)上完成之前的工作,在原分支(feature)中的完成过的代码依然存在,并且你不需要进行额外的存储和切换分支的操作
1
2
cd ../feature
// 分支功能操作