Created: 2021-10-07 Thu 15:57
rebase
, stash
, bisect
等等注:为避免不正确翻译反而给你带来困惑,除非毫无争议的概念,此处尽量采用英文。
一个提交是一次变更记录,由 commit
子命令生成。
多次提交环环相扣,形成树状提交历史:
一个 commit 包含:commit id 、作者名字和邮箱、时间戳和 commit message (描述信息)
定义:一串40 个 [a-f]
字符( SHA1 摘要值)
其他简便的表示方法:
HEAD
当前分支的最后一次提交master^
表示 master 的前一次 revision更多请参考 man gitrevisions
HEAD
一种游标或者指针,同一时刻只能指向某个 commit ,此即 HEAD
。
仓库用于存放所有版本管理相关的数据,包括提交、分支等。
.git/
目录,除非你很确定你在做什么,否则别修改其中的文件。
remote-tracking branch ,名字格式是 <remote>/<branch>
此种分支你无法提交更改
tracking branch: 用于追踪远端分支的分支
通过 fetch/pull/push 子命令来与远端进行同步
文件除了已经存入仓库之外,还有两个地方:
Git 比 SVN 多了 staging area 这一个概念,请务必要理解它。
详细内容,请参考 git-add 。
通常翻译为“暂存区”。
index 是 working tree 的一个快照( snapshot ),下次提交的就是这个快照。
tracked 已纳入 git 中管理的文件
可以细分为三种文件:
文件状态转换图:
hunk 概念:由 @@@...@@@
包围的一块连续的差异
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
- static void describe(char *arg)
++static void describe(char *arg, int last_one)
{
+ unsigned char sha1[20];
+ struct commit *cmit;
struct commit_list *list;
hunk 比文件粒度更细,用于操作文件的一部分
“古老”的 diff/patch 工具就已有 hunk 概念
.o
结尾的文件: *.o
obj/
$HOME/.config/git/ignore
当前用户默认,对用户的所有工程都起作用$GIT_DIR/.gitignore
工程内,此文件自身也纳入 Git 管理$GIT_DIR/info/exclude
工程内,同时不纳入 Git 管理(不推荐)注:工程内的 ignore 文件优先级高于 home 目录的。
git checkout foo
切换到某个分支git checkout -b bar
从 HEAD
创建新分支,并切换到它git status
查看当前工作区的状态git add foo.clj
把文件当前内容放入 staging areagit commit -m "hello world"
提交git commit --amend
更改 HEAD
commit
git diff
查看变更
默认对比 working area vs. index 的差异;
加 --cached
对比 index 与上一次 commit 的差异。
git log
查看当前分支的提交日志(历史)
git log --oneline --decorate --graph --all
显示所有分支的提交历史
/img/slides/2021-10-07-git-log-all.png
命令: git merge
,按是否 fast-forward 可以分为两种情况。
执行 git merge --ff-only topic
不带任何选项时, Git 会优先使用 ff 方式,建议明确加选项。
Before vs. After topic A---B---C topic | master / |/ D---E master D---E---A---B---C
执行 git merge --no-ff topic
,会有一个真正的 merge commit 。
示例1:
Before vs. After A---B---C topic A---B----C topic / / \ D---E master D---E------------F master
示例2:
Before vs. After A---B---C topic A-----B-----C topic / / \ D---E---F---G---H master D---E---F---G---H---I master
git clone https://github.com/whatacold/texttoolkit.git
从远端克隆到本地git remote add origin https://github.com/whatacold/texttoolkit.git
添加一个远端到本地仓库git remote
查看远端,加 -v
同时查看地址git push origin
把当前分支同步到远端git fetch origin
从远端同步最新版本,但不改变 tracking branchgit pull origin
拉取最新代码并合并,相当于这两步: git fetch
+ git merge
一般企业内部的项目采用的是此种模式
GitHub/GitLab 的协作,采用的就是这种模式
使用手册 git help <subcommand>
/ man git-<subcommand>
一般在手册的结尾部分,会有一些示例演示常见用法。