git操作笔记

1 基本概念

  • 工作区(working tree/working directory)

  • 暂存区(stage / index)[1]
    aHA9Hj

  • HEAD
    一个指针(头指针), 指向当前工作去所在的历史提交。

  • Detached HEAD
    HEAD指向某个历史提交, 而不是某个分支。比如下图中,执行完git checkout main~3(或者git checkout b325c)后的HEAD就是Detached HEAD
    22PYkT

    上图中,分支名main引用了ed489这个commit-id, 分支名stable引用了a47c3这个commit-id, HEAD引用了b325c这个commit-id

当HEAD处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支(可以认为这是在更新一个匿名分支)。一旦此后你切换到别的分支,比如说main,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了。注意这个命令之后就不会有东西引用2eecb。图解如下[2]:
vbbCNx
N8Wsnk

解决办法: 在执行git checkout main之前执行git checkout -b new-branch-name.

  • 分支名
    HEAD一样,也是一个指针(实际上叫引用ref)
  • 补丁(patch)
    补丁是一个文本文件, 按照邮件格式format, 包含有类似git diff的内容及其它一些元信息。和patch相关的一些命令:git format-patchgit apply

2 基础操作

  • 基本配置
    1
    2
    3
    git config --global user.name xxx
    git config --global user.mail xxx
    ssh-key
  • 本地管理
    1
    2
    3
    4
    git add file_name
    git commit -m "xxx"
    # amend: 修正, 使用git commit --amend可以将修改(文件修改或者commit message修改)添加到上次提交上,避免出现很多次commit
    git commit --amend

3 分支操作

  • 查看分支

    1
    git branch: 添加-a显示远程分支
  • 创建分支

    1
    2
    git branch branch-name: 基于当前HEAD创建分支
    git branch branch-name commit-id: 基于commit-id提交创建分支
  • 切换分支

    1
    2
    git checkout branch-name: 创建分支
    git checkout -b branch-name: 创建分支并切换到该分支
  • 分支合并

    • git merge
      git merge将不同的分支合并起来, 可以分3中情况进行讨论:
      • 另一个分支是当前提交的祖父节点: 合并命令将不做任何事情
      • 当前提交时另一个分支的祖父节点: 进行fast-forward合并, 指向只是简单移动, 生成一个新的提交
        WkxSAr
      • 三方合并(当前提交和另一个分支有公共的祖先节点): 可能需要解决冲突
        AqD7mM
    • git rebase
      另外一种比较常用的合并方法是使用变基命令git rebase, 使用该命令可以使得提交历史更加清晰, 便于管理。git rebase操作示意图如下, 它会在当前分支上重演另一个分支的历史:
      ETZPqt
  • 摘樱桃cherry-pick
    cherry-pick命令”复制”一个提交节点并在当前分支做一次完全一样的新提交.
    C27vGQ

commit后发现和远程代码库存在冲突时, 解决冲突的常用方法:

1
2
3
4
5
6
7
8
# 在本地仓库更新并合并代码
git fetch origin
git rebase origin/main
# 修改完冲突代码后进行提交
git add -u
git rebase --continue
# 更新patch并提交
git push origin HEAD:refs/for/main
  • 删除分支
    1
    2
    3
    4
    5
    # 删除本地分支
    git branch -d local_branch_name
    # 删除远程分支
    git push <远程主机名> --delete <远程分支名>
    git push origin --delete master
  • 修改提交历史
    使用场景: 在某次commit后, 如果想撤销这次commit, 保留commit前的状态。
    1
    2
    git reset --soft HEAD^
    git reset [mode] commit-id 通用用法
    git reset是回到之前某个提交的状态, 我们用图来解释一下git checkout commit-idgit reset commit-id的区别。
    l7EO1K
    可以看到,使用git reset时, HEADmain一并移动到了b325c
    git reset有3中模式可供选择:
    1、 –soft:只修改 HEAD 指针,不修改暂存区和工作区
    2、 –mixed:修改 HEAD 指针和暂存区,不修改工作区(默认)
    3、 –hard:修改 HEAD 指针、暂存区和工作区(完全回退)

4 远程操作

常用命令:

1
2
3
4
5
git clone
git fetch
git merge
git pull
git push

常用的远程操作可以用下图进行概括[1]:
LrjmNx

5 参考资料

1 Git/GitHub 基础介绍
2 图解Git
3 猴子都懂的git入门
4 Pro-git

Comments

Unable to load Disqus, please make sure your network can access.