Git

# Git

# 简介

Git 是分布式版本控制系统,没有“中央服务器”。

# 配置

git config --global user.name "Your Name"
git config --global user.email "email@example.com"
1
2

# 内容

# 基础知识

  1. 工作区

    本地文件目录。

  2. 暂存区

    git add将工作区要添加的文件放到暂存区stage

    git commit将暂存区的文件提交到当前分支(默认master)。

  3. 版本库

    .git目录即为 Git 的版本库,其里面有暂存区、默认分支master和指向master的指针HEAD

# 基本流程

# 创建版本库

git init
1

# 把文件添加到仓库

git add <file>
git add readme.txt
1
2

# 把文件提交到仓库

git commit -m <message>
git commit -m 'wrote a readme file'
1
2

复制相同提交内容

git cherry-pick <commit_id>
// commit_id只需要前7位
1
2

# 查看工作区状态

git status
1

# 日志

# 提交日志

git log命令显示的是从最近到最远的提交日志。版本号commit id由 SHA1 计算出的。

  1. 普通

    git log
    
    1
  2. 简易

    git log --pretty=oneline
    
    1
  3. 视图

    git log --graph
    
    1

# 命令日志

该命令可以帮助我们回到未来的版本。

git reflog
1

# 修改

# 撤销工作区的修改

git checkout -- <file>
1

有两种情况

  1. 工作区修改,但未提交到暂存区。此时,执行命令后将和版本库一模一样。
  2. 第一次修改提交到暂存区后,工作区又存在修改。此时,执行命令后将回到第一次修改提交到暂存区的状态。

原理:将版本库的版本替换到工作区。

# 撤销暂存区的修改

撤销暂存区的修改,重新回到工作区,工作区不变。

git reset head <file>
1

# 缓存未提交的修改

未提交的修改包括工作区和暂存区,将其存放在堆栈中,用于后续恢复。

基本操作

  1. 缓存

    git stash
    
    1
  2. 查看缓存记录

    git stash list
    
    1
  3. 恢复缓存

    • 删除 stash 内容

      git stash pop
      
      1
    • 不删除 stash 内容

      git stash apply
      
      1

      指定恢复哪个缓存

      git stash apply num
      
      1

# 删除

版本库中删除文件

git rm file
1

工作区删除文件

rm file
1

# 远程仓库

关联远程库

git remote add name git@server-name:path/repo-name.git
git remote add origin git@github.com:aisuandebowen/learngit.git
1
2

name:指定远程库名字,例如 origin。

# 本地替换远程
git push --force
1
# 合并远程分支
git pull

git fetch
1
2
3

问题:fetch和pull的区别

  • git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
  • git pull是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
# 推送并将本地分支和远程分支关联
git push -u origin master
1
# 查看远程库信息
git remote -v
1
# 删除与远程库的关联
git remote rm origin
1
# 克隆仓库
git clone
1
# 本地分支和远程分支设置关联
 git branch --set-upstream-to=origin/<branch-name> <branch-name>
1

# 分支 branch

# 查看分支

git branch
1

# 创建分支

git branch <name>
1

# 切换分支

// 两个都可以,推荐第一个。
git switch <name>
git checkout <name>
1
2
3

# 创建并切换分支

git switch -c <name>
git checkout -b <name>
1
2

# 合并某分支到当前分支

git merge <name>
1

冲突解决方案:当 Git 无法进行快速合并时,需要手动更改,Git 用<<<<<<<=======>>>>>>>标记不同的内容。

--no-ff参数

git merge --no-ff -m "merge with no-ff" dev
1

以上命令,将会合并并提交一个 commit。合并分支推荐使用普通模式--no-ff,因为快速模式合并没有历史。

# 删除分支

git branch -d <name>
1

当要删除的分支没有被合并过,是无法删除的。此时一定要删除的话推荐:

git branch -D <name>
1

# 查看commit id属于哪个分支

git branch --contains <commit id>
git branch --contains <commit id> -r // 加远程
1
2

# 变基rebase

# 命令

git rebase
1

# 原理

场景:现有分支A、B。当前分支A,准备rebase B

内部过程:

  1. 取消A分支的所有commit
  2. 将过程1的操作临时保存成patch文件,保存在.git/rebase目录下;
  3. 然后,把 A 分支更新到最新的 B 分支;
  4. 最后,把上面保存的 patch 文件应用到 A 分支上。

# 用途

# 多次提交合并
git rebase HEAD~{n}
1
# 分支合并
git rebase master
1

相比merge优点,历史记录更清晰。

# 注意事项

# 异常退出vi

恢复方法:

git rebase --edit-todo
1
# 出现冲突时
  1. 解决冲突;
  2. git add更新;
  3. git rebase --continue继续变基编辑。
# 终止编辑
git rebase --abort
1

# merge和rebase的区别

# merge

通过merge合并分支会新增一个merge commit,然后将两个分支的历史联系起来

其实是一种非破坏性的操作,对现有分支不会以任何方式被更改,但是会导致历史记录相对复杂

# rebase

rebase会将整个分支移动到另一个分支上,有效地整合了所有分支上的提交

主要的好处是历史记录更加清晰,是在原有提交的基础上将差异内容反映进去,消除了 git merge所需的不必要的合并提交

# 标签 Tag

标签本质是指向某次提交 commit,方便使用。因为平常使用commit_id不方便!!!

# 创建标签

  • 以最新提交的 commit 为准,创建标签。

    git tag <tag-name>
    
    1
  • 创建带有说明、指定commit-id的标签。

    git tag -a <tag-name> -m <message> <commit-id>
    
    1

    注意:标签总是和某个 commit 挂钩。如果这个 commit 既出现在 master 分支,又出现在 dev 分支,那么在这两个分支上都可以看到这个标签。

# 显示已有标签

git tag
1

显示指定标签详细信息

git show <tag-name>
1

# 删除标签

  • 本地

    git tag -d <tag-name>
    
    1
  • 远程

    git push origin :refs/tags/<tag-name>
    
    1

# 推送标签到远程

  • 推送一个标签

    git push origin <tag-name>
    
    1
  • 推送所有标签

    git push origin --tags
    
    1

# 忽略特殊文件 ignore

# 正常操作

  1. 新建.ignore文件。

  2. 填写规则

    • 单个特殊文件

      全称文件名。

    • 有特点的特殊文件

      .class文件,可以使用通配符*来表示,即*.class

      如果不想此规则忽略某个文件,可以!文件名,如!localConfig.txt

# 特殊操作

  1. 强制添加被 ignore 限制的文件

    git add App.class -f
    
    1
  2. 查看限制某文件的具体命令所在

    git check-ignore -v 文件名
    
    1