1 基本概念
工作区(working tree/working directory)
暂存区(stage / index)[1]
HEAD
一个指针(头指针), 指向当前工作去所在的历史提交。Detached HEAD
HEAD
指向某个历史提交, 而不是某个分支。比如下图中,执行完git checkout main~3
(或者git checkout b325c
)后的HEAD
就是Detached HEAD
。上图中,分支名
main
引用了ed489
这个commit-id, 分支名stable
引用了a47c3
这个commit-id,HEAD
引用了b325c
这个commit-id
当HEAD处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支(可以认为这是在更新一个匿名分支)。一旦此后你切换到别的分支,比如说main,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了。注意这个命令之后就不会有东西引用2eecb。图解如下[2]:
解决办法: 在执行git checkout main
之前执行git checkout -b new-branch-name
.
- 分支名
和HEAD
一样,也是一个指针(实际上叫引用ref
) - 补丁(patch)
补丁是一个文本文件, 按照邮件格式format, 包含有类似git diff
的内容及其它一些元信息。和patch
相关的一些命令:git format-patch
、git apply
。
2 基础操作
- 基本配置
1
2
3git config --global user.name xxx
git config --global user.mail xxx
ssh-key - 本地管理
1
2
3
4git add file_name
git commit -m "xxx"
amend: 修正, 使用git commit --amend可以将修改(文件修改或者commit message修改)添加到上次提交上,避免出现很多次commit
git commit --amend
3 分支操作
查看分支
1
git branch: 添加-a显示远程分支
创建分支
1
2git branch branch-name: 基于当前HEAD创建分支
git branch branch-name commit-id: 基于commit-id提交创建分支切换分支
1
2git checkout branch-name: 创建分支
git checkout -b branch-name: 创建分支并切换到该分支分支合并
- git merge
git merge
将不同的分支合并起来, 可以分3中情况进行讨论:- 另一个分支是当前提交的祖父节点: 合并命令将不做任何事情
- 当前提交时另一个分支的祖父节点: 进行
fast-forward
合并, 指向只是简单移动, 生成一个新的提交
。
- 三方合并(当前提交和另一个分支有公共的祖先节点): 可能需要解决冲突
- git rebase
另外一种比较常用的合并方法是使用变基命令git rebase
, 使用该命令可以使得提交历史更加清晰, 便于管理。git rebase
操作示意图如下, 它会在当前分支上重演另一个分支的历史:
- git merge
摘樱桃
cherry-pick
cherry-pick命令”复制”一个提交节点并在当前分支做一次完全一样的新提交.
commit
后发现和远程代码库存在冲突时, 解决冲突的常用方法:
1 | 在本地仓库更新并合并代码 |
- 删除分支
1
2
3
4
5删除本地分支
git branch -d local_branch_name
删除远程分支
git push <远程主机名> --delete <远程分支名>
git push origin --delete master - 修改提交历史
使用场景: 在某次commit
后, 如果想撤销这次commit
, 保留commit
前的状态。1
2git reset --soft HEAD^
git reset [mode] commit-id 通用用法git reset
是回到之前某个提交的状态, 我们用图来解释一下git checkout commit-id
和git reset commit-id
的区别。
可以看到,使用git reset
时,HEAD
和main
一并移动到了b325c
。git reset
有3中模式可供选择:
1、 –soft:只修改 HEAD 指针,不修改暂存区和工作区
2、 –mixed:修改 HEAD 指针和暂存区,不修改工作区(默认)
3、 –hard:修改 HEAD 指针、暂存区和工作区(完全回退)
4 远程操作
常用命令:
1 | git clone |
常用的远程操作可以用下图进行概括[1]:
Comments