Git 基本使用
在基本使用之前,需要认识一下Git的工作区、暂存区和版本库的概念
工作区: 开发环境中的目录,当前的改动未被记录到版本控制中。
暂存区:临时存储区域,包含了即将被提交到版本库中的文件快照,在提交之前可以选择性的将工作区中的改动添加到暂存区。
版本库:包含该项目的所有版本历史记录。通常我们的代码库会维护在远程,所以版本库分为本地版本库和远程版本库。
让我们来看下,这几个区是怎么进行交互的:
从上图中我们可以看到
1、工作区 -> 暂存区
使用git add 命令将文件添加到暂存区。
// 添加某一文件名为fileName的文件
git add fileName
// 添加所有改动的文件
git add .
2、暂存区->本地目录树(本地版本库)
使用git commit将暂存区中的所有文件添加到本地目录树中
git commit -m "本次提交说明"
3、本地目录树->远程版本库
使用git push将本地版本库的代码同步到远程代码库
git push origin branch-name
4、远程版本库->本地版本库
如果是第一次从远程代码库拉代码到本地,通常本地是没有版本库的,所以我们使用git clone 将远程代码库克隆到本地;如果不是第一次(已经和远程仓库绑定)那么可以使用git push 或者git fetch + git merge将代码拉下来,并同步到本地版本库和工作区。
// 同步远程版本库并合并到当前工作区
git pull origin branch-name
// 同步远程版本库
git fetch origin branch-name
// 合并代码
git merge origin/branch-name
Git 创建仓库
1、新起一个项目
如果是新起一个项目的话,需要搞定本地仓库和远程托管,假设使用github作为远程托管代码的平台的话,可以先在github上创建一个仓库,这样远程托管部分就完成了,本地仓库的创建有多种方式,这里介绍两种情况:
**a、 不需要通过工具结构化创建模板代码**: 那么直接git clone 命令将远程仓库down下来就行。
// git clone <Git仓库> <本地目录名称>
git clone git://github.com/****/demo.git GitDemo
// 如果不指定本地目录名称,那么会默认使用demo作为目录名称
git clone git://github.com/****/demo.git
然后在该目录中操作即可。
**b、需要通过工具结构话创建模板代码**(比如在Android Studio中创建了一个项目,Idea 会自动生成很多模版代码文件):这个时候就需要自行和远程仓库关联。
// 如果工具没有帮忙生成git仓库,那需要自行生产,如果自动生成,则省略这步
// 进入到项目的目录
git init
// 需要和远程仓库关联,才能推送到远程
git remote add <地址>
// 然后将所有文件添加到本地仓库
// 也就是 一套组合拳
git add .
git commit -m "init"
git push
2、在旧项目上迭代
比如说,作为新人参与已经迭代了的项目时,这种情况比较简单,只需要将远程仓库git clone下来就行,然后就能开始开发了~
git clone <地址> <目录>
Git 分支管理
1、创建新分支及切换
// 创建一个 new-branch 分支
git branch new-branch
// 切换到 new-branch 分支
git checkout new-branch
// 切换分支还有一种方法 推荐 (因为git checkout负载比较重,容易混)
git switch new-branch
2、删除分支
git branch -d new-branch
3、分支合并
在协同合作的过程中,在开发分支完成开发后需要合并到公共分支,或者公共分支有新的提交,需要合并到开发分支,这些都涉及到分支的合并,git提供了两种合并分支的能力,开发者可以根据自己的需求去选择不同的方法进行分支合并。
git merge
将其他分支的改动点合并后在当前分支上生成一个最新的提交记录(额外的),这种方法可以比较清晰的看出各个分支间的交互,改动的来源;不好的地方是会使的整个提交记录比较杂。
// 当前分支 current 和 公共分支 main
// 现在将当前分支的代码改动合并到公共分支
// 首先切换到公共分支
git switch main
// merge
git merge current
// 执行上述代码后,会生成一个新的节点 c5在main分支上
合并前:
执行上述代码,合并后
从main分支合到current分支同理,只不过角色转换了。
git rebase
当执行rebase时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面。
(这里大家可能会对待变基分支、和基分支的概念有疑问)
假设我们现在在current分支上进行了部分修改,然后此时公共分支main有新的改动,我们需要将main分支的改动合并到current分支上,那么current分支是**待变基**分支,main是**基**分支
// 把main的改动合并到current
// git rebase main
合并前:
合并后:
合并后发现current改动前的基点变成了main中最新的节点,这样做可以使得整个提交记录是一条直线,但是他的缺点也很明显,就是无法溯源改动,所以通常在开发过程中,会约定不能在公共分支进行rebase,否则会导致公共分支的提交记录被修改,使得记录不清晰。
所以不能在公共分支进行rebase 不能在公共分支进行rebase 不能在公共分支进行rebase!!!
Git 提交记录管理
1、HEAD
HEAD会指向一个提交记录,当它指向这个提交记录时,你所做的操作都是基于该提交记录进行的,默认情况下,HEAD总是指向当前分支最新的提交记录,但是在某些情况下,我们可以分离HEAD使其指向我们需要的提交记录,以完成需要进行的操作。
// 假设当前提交记录的引用为 c1
// 那么我们将HEAD分离出来
git checkout c1
那现在要将其指向c0,该怎么做呢?其实也很简单,只需要知道c0的引用的哈希值就行
git checkout c0
如果我们不知道某个提交记录的哈希值(虽然可以通过git log看到提交记录的哈希值),但是可以很直观的看到它的相对位置呢?这就需要学习到几个特殊符号啦~
2、相对引用 ~ 和 ^
相对引用不同于通过哈希值的方式进行指向改变,它可以通过当前位置进行相对移动。
- 使用 ^ 向上移动 **1 **个提交记录
- 使用 ~N 向上移动 N 个提交记录
向上移动一个提交记录
git checkout HEAD^
再向上移动2个提交记录
git checkout HEAD~2
3、撤销提交
当提交的改动不需要时,要进行回滚的操作,git也提供了多种方法进行代码的回滚。
git reset
重置当前分支到特定提交(该提交的内容不会被重置),会更改历史提交记录,适用于未提交到远程版本库的修改。
// 首先需要知道要回滚到具体提交记录的哈希值(当然也可以使用相对引用)
git reset c2
// 相对引用法,两者效果相同
git reset HEAD~2
reset 一共有四种回滚模式, 默认使用的是Mixed模式进行的回滚。
- Mixed: 重置 HEAD 到指定的提交,暂存区重置,但工作目录保持不变。
- soft: 只重置 HEAD 到指定的提交,暂存区和工作目录保持不变。
- hard: 重置 HEAD 到指定的提交,暂存区和工作目录都重置。
- keep: 重置 HEAD 到指定的提交,暂存区重置,工作目录仅重置提交的代码,其余的保持不变。
// soft
git reset <提交记录哈希> --soft
// mixed
git reset <提交记录哈希> --mixed
// hard
git reset <提交记录哈希> --hard
// keep
git reset <提交记录哈希> --keep
git revert
撤销一系列提交,不会修改历史记录,但是会生成一个新的提交记录(该提交记录的内容会剔除咱们需要撤销的内容),这个使用于已经提交到远程仓库的修改。并且和reset不同的是,在进行回滚时,回滚的内容也包含我们指定的提交记录中包含的内容(也就是回滚到该记录的上一级)
// 回滚到c2
git revert c2
// 使用相对引用
git revert HEAD~2
4、自由修改提交树
git cherry-pick
如果想要复制一些提交记录到当前所在位置(HEAD)下的话,可以使用git cherry-pick命令,被选中的提交记录会依次被添加到当前位置的后面。
// 需要知道提交记录的哈希值
git cherry-pick c2 c4
修改前
修改后:
git rebase -i
交互式 git rebase用法,可以通过相对引用的方式修改提交记录, 再使用这个命令后会出现一个文本编辑,通过改变每个提交前的pick选择来改变改记录的保留或者是否和其他记录合并
git rebase -i HEAD~3
输入命令后进入到下面的文本编辑页面
将feat 15移除的话,需要将Feat: 15 前的pick改为drop即可
修改完成后输入 :wq 即可退出编辑
完成操作后的效果如下:
else case
case: 进行reset、revert等操作时,操作失误导致需要的记录丢失,怎么找回?
可以通过git reflog 查看历史操作记录,然后找到回归丢失前的哈希值,然后通过git reset 将丢失的记录找回。
git reset <需要恢复的哈希值>
强烈推荐 Learn Git Branching
版权归原作者 胖胖虎ya 所有, 如有侵权,请联系我们删除。