git使用
git基础
特点
分布式版本控制系统,直接记录快照(blob对象),而不是保存差异累计
存储项目随时间改变的快照
可靠性和本地执行,本地拥有完整的历史记录
轻量级分支
完整性:存储文件前通过SHA-1计算校验和,确保
几乎只增加数据而不丢失或修改,快照流
状态:
已修改:在工作区修改了文件
已暂存:添加到暂存区
已提交:保存到git仓库
git配置
/etc/gitconfig
文件:包含系统上每一个用户及他们仓库的通用配置。 如果使用带有--system
选项的git config
时,它会从此文件读写配置变量。~/.gitconfig
或~/.config/git/config
文件:只针对当前用户。 可以传递--global
选项让 Git 读写此文件。- 当前使用仓库的 Git 目录中的
config
文件(就是.git/config
):针对该仓库。
每一个级别覆盖上一级别的配置
命令:
1 | git config --global user.name "Js" |
git工作流
git clone将remote克隆到本地
git checkout -b my-feature创建自己的分支,将branch所有源文件同步给硬盘
git diff查看修改
git add
git commit
git push origin my-feature
倘若此时远端仓库已被修改
git checkout main —> git pull origin master获取最新代码
git checout my-feature —> git rebase main将最新分支传入f-commit之前,手动解决conflict
rebase和merge直观区别:
Init–>update–>f-commit和init–>f-commit(merge update)
git push -f origin my-feature
当pr或者squash and merge后
git checkout main —> git branch -D my-feature —> git pull
常规操作
1、创建仓库
git init
:创建新仓库。创建.git子目录,包含初始化git仓库的所有必须文件
git clone [url]
:克隆现有仓库,拉取每一个文件每一个版本
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
同步更新
git clone git://git.kernel.org/pub/scm/git/git.git
2、添加暂存区(跟踪文件)
文件可以看作只有两种状态:已跟踪和未跟踪
1 | git add [文件/目录] |
跟踪文件,添加到暂存区,等待提交
把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 对象来保存它们)
通过 git status
查看状态
1 | git status -s |
修改后未执行git add暂存然后直接git commit:会提交上次git add的版本而不是现在修改过的版本
3、提交
1 | git commit -m "Story 182: Fix benchmarks for speed" |
Git 会先计算每一个子目录的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针
git commit -a == git add && git commit
git log
:查看提交记录,常见参数 -p
--stat
-数字
4、撤销
git commit --amend
:这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
git reset HEAD <file>…
:取消暂存
git checkout -- <file>
:(危险)撤销对文件的修改
5、移动或删除文件
git mv <> <>
:相当于mv,git rm,git add
git rm <file>
:从暂存区移除并删除文件,–cached参数只移除不删除
远程仓库
git remote add <shortname> <url>
:添加远程仓库
git remote [remote-name]
:查看远程仓库,默认名称origin,默认分支master(现在是main了)
git remote show origin
:查看更多信息
git fetch
:抓取新推送
git pull
:抓取并合并
git push origin master
:推送
git remote rename pb paul
:修改远程仓库简写名
git remote remove
:移除远程仓库
打标签
git tag:列举标签
git tag -a v1.4 -m ‘my version 1.4’:创建附注标签,完整对象
git show v1.4
额外:
.gitignore
忽略这些文件,不进行管理
1 | # no .a files |
git dff
git diff查看未暂存的改动
git diff –staged查看暂存区的改动
命令别名
1 | git config --global alias.co checkout |
分支
1、我们在add时暂存区保存着快照对象(blob对象),当git commit
时首先计算哈希值,创建一个树对象保存所有哈希值,树对象包含指向blob的指针,随后创建一个提交对象包含指向树对象的指针,然后提交
2、而每次修改后提交,提交对象包含指向上版本的提交对象的指针,使用以下命令查看指针指向git log --decorate --oneline
3、HEAD是指向当前所在分支的指针
4、当我们切换分支进行commit时,当前分支向前移动,其他分支不变,这样每个分支都可以基于各自版本分叉历史,
5、git的分支本质仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效
分支管理:
git branch < name >
: 创建分支
git branch -d <name>
:删除分支
git branch -M main
:强制重命名
git checkout [-b] <name> <commit-hash>
:(创建并)切换分支
git merge < name >
:合并分支
直接使用git checkout不会更改当前分支指针,只会改变commit,git checkout - 返回,此时处于“分离HEAD”状态
再使用git switch -c < branch>在当前提交创建分支
git branch
:获取分支列表
git branch -v
:获取分支列表最后一次提交信息
git branch --no-merged
:
注意:
当切换分支时记得git commit -a,因为git会重置工作目录,回到最后当分支最后一次提交的模样
合并分支时
1、没有冲突时
- 若是直接祖先,进行快进(fast-forward),直接前进指针
- 三方合并,git自行决定最优公共快照
2、解决冲突
1 | <<<<<<< HEAD:file |