Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

git 基础 #231

Open
louzhedong opened this issue Aug 20, 2020 · 0 comments
Open

git 基础 #231

louzhedong opened this issue Aug 20, 2020 · 0 comments

Comments

@louzhedong
Copy link
Owner

louzhedong commented Aug 20, 2020

基本概念

1.版本库

Git版本库(repository)是一个简单的数据库,包含所有用来维护与管理项目的修订版本和历史的信息。

Git维护两个主要的数据结构:对象库(object store)和索引(index)

文件管理与索引

1. git mv

git mv 可以移动或重命名文件

git mv oops newOops

等同于

mv oops newOops
git rm oops
git add newOops

git log 命令可以查看文件的历史记录,但无法查看改过名字之前的记录,要查看全部历史记录,需要使用

git log --follow newOops 

提交

合并操作自身会导致在版本库中多出一个提交

1.原子变更集

所有改动要么全部应用,要么全部拒绝

2.识别提交

HEAD始终指向当前分支的最近提交。当切换分支时,HEAD会更新为指向新分支的最近提交

ORIG_HEAD

FETCH_HEAD

MERGE_HEAD

相对提交

Git还提供一种机制来确定相对于另一个引用的提交,通常是分支的头。

在同一代提交中,插入符号^是用来选择不同父提交的

波浪线~用来返回父提交之前并选择上一代提交

git rev-parse命令最终把任何形式的提交转换成对象库中实际的、绝对的提交散列ID

提交历史记录

git log 相当于git log HEAD,输出当前HEAD往前的日志

--pretty=参数可以选择short,oneline,full

-p选择来输出提交引进的补丁或变更 git log -1 -p commitId

--stat选项列举了提交中所更改的文件以及每个文件中有多少行做了改动

Git 使用有向无环图(DAG)来实现版本库的提交历史记录

git log --graph --pretty=oneline --abbrev-commit

--abbrev-commit 显示SHA-1的前8个字符,而不是所有的40个

--merge 只显示跟产生冲突的文件相关的提交

--left-right 如果提交来自合并的“左”边则显示<(我们的版本),如果来自合并的“右”边则显示>(他们的版本)

分支

合并变更到不同分支

git checkout -m dev 通过在本地修改和对目标分支之间进行一次合并操作,尝试将本地修改加入到新工作目录中

Diff

git diff 显示工作目录(未git add)和暂存区(git add之后)的差异

git diff commit 显示工作目录和给定提交间的差异

git diff --cached 显示暂存区(git add 之后)和版本库(git commit 之后)的差异

git diff HEAD 显示工作目录和版本库的差异

--stat选项会显示针对两个树状态之间差异的统计数据

--color会使输出结果使用多种颜色显示

git diff --ours 显示当前分支的改动

git diff --theirs 显示对方分支的改动

合并

三方合并标记线(<<<<<、=====和>>>>>>)是自动生成的,程序不关注这个。

一旦通过选择其中一边来解决冲突,它就不再显示了

中止或重新启动合并

在git commit 之前中止合并使用 git reset --hard HEAD

在git commit 之后中止合并并使用 git reset --hard ORIG_HEAD

git checkout -m

交叉合并

递归(recursive)策略是git merge的默认策略

Git策略:所有分支生而平等

Git可以完成压制提交,只要在执行git merge 或 git pull 的时候给出 --squash选项。

更改提交

注意事项:如果没有其他开发人员已经获得了你的版本库的副本,你就可以自由地修改和完善版本库提交历史记录

如果一个分支已经公开了,就不应该重写

git reset

git reset调整HEAD引用指向给定的提交,并且是“破坏性的”

git reset有三个选项:--soft、--mixed、--hard

--soft只改变HEAD引用,索引和工作目录不变。会将改变放在暂存区(git add 之后)

--mixed改变HEAD引用和索引引用,工作目录保持不变,git reset默认模式。改变放在工作目录中(git add之前)

--hard都改变,修改都将丢失

git cherry-pick

用于把版本库中的一个分支的特定提交引入一个不同的分支中

批量提交 git cherry-pick X..Y

git revert

应用给定提交的逆过程

修改最新提交

git commit --amend

变基提交

git rebase命令用来改变一串提交以什么为基础

变基操作一次只迁移一个提交,从各自原始提交位置迁移到新的提交基础,每个移动的提交都可能有冲突需要解决

git rebase -i 命令允许你修改一个分支的大小,然后把它们放回原来的分支或者不同的分支

储藏

git stash 储藏状态

git stash pop:当无冲突时,Git会自动将储藏状态栈中保存的状态删除。有冲突时,需要手动解决冲突并且不会主动删除,需要用git stash drop来删除

git stash apply 不会删除状态

引用日志

reflog记录非裸版本库中分支头的改变,每次对引用的更新,包括对HEAD的,引用日志都会更新以记录这些引用发生了哪些变化。

Git 针对引用支持大量基于日期的限定符。

一个提交,如果既不能从某个分支或引用指向,也不可达,将会默认在30天后过期,而那些可达的提交将默认在90天后过期。

储藏是通过使用stash引用的引用日志来实现的。

远程版本库

添加远程版本库 git remote add origin URL

git remote update 会导致在这个版本库中的每个remote都被更新,会从每个remote指定的版本库中检查并抓取新提交。

git pull = git fetch git merge/git rebase。默认情况下,第二个步骤是git merge

git pull --rebase会引起Git只在这次pull过程中变基

变基还是合并

通过合并,每次拉取将有可能产生额外的合并提交来记录更新同时存在于每一个分支的变更。

变基从根本上改变了一系列提交是在何时何地开发的概念,开发历史记录的某些方面会丢失

远程版本库配置

git remote update --prune 从远程版本库获得更新然后一步删除陈旧的追踪分支

git remote set-url origin Git:URL 更改远程版本库引用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant