一文了解Git日常利用
Git 基本利用在基本利用之前,须要熟悉一下Git的工作区、暂存区和版本库的概念
工作区: 开发环境中的目次,当前的改动未被记录到版本控制中。
暂存区:暂时存储区域,包罗了即将被提交到版本库中的文件快照,在提交之前可以选择性的将工作区中的改动添加到暂存区。
版本库:包罗该项目标所有版本历史记录。通常我们的代码库会维护在远程,所以版本库分为本地版本库和远程版本库。
让我们来看下,这几个区是怎么举行交互的:
https://i-blog.csdnimg.cn/direct/6c0eb95927254452af3bc499d7cd3e2e.png
从上图中我们可以看到
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分支上 归并前:
https://i-blog.csdnimg.cn/direct/bb2a88a8748543d1aa9ceaedbb89a596.png
执行上述代码,归并后
https://i-blog.csdnimg.cn/direct/270508dbf3d649e6852f46ba895f4afe.png
从main分支合到current分支同理,只不外脚色转换了。
git rebase
当执行rebase时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,末了将刚才提取的修改应用到基分支的最新提交的背面。
(这里大家大概会对待变基分支、和基分支的概念有疑问)
假设我们现在在current分支上举行了部门修改,然后此时公共分支main有新的改动,我们须要将main分支的改动归并到current分支上,那么current分支是待变基分支,main是基分支
// 把main的改动合并到current
// git rebase main归并前:
https://i-blog.csdnimg.cn/direct/9f9fbdb5a42545acbbcf5dc3e3baaf1d.png归并后:
https://i-blog.csdnimg.cn/direct/428850df389346b6858a590da4a8e795.png
归并后发现current改动前的基点变成了main中最新的节点,如许做可以使得整个提交记录是一条直线,但是他的缺点也很明显,就是无法溯源改动,所以通常在开发过程中,会约定不能在公共分支举行rebase,否则会导致公共分支的提交记录被修改,使得记录不清晰。
所以不能在公共分支举行rebase 不能在公共分支举行rebase 不能在公共分支举行rebase!!!
Git 提交记录管理
1、HEAD
HEAD会指向一个提交记录,当它指向这个提交记录时,你所做的操纵都是基于该提交记录举行的,默认环境下,HEAD总是指向当前分支最新的提交记录,但是在某些环境下,我们可以分离HEAD使其指向我们须要的提交记录,以完成须要举行的操纵。
// 假设当前提交记录的引用为 c1
// 那么我们将HEAD分离出来
git checkout c1 https://i-blog.csdnimg.cn/direct/cb6fa991165545be986a09972fd08249.png
那现在要将其指向c0,该怎么做呢?其实也很简朴,只须要知道c0的引用的哈希值就行
git checkout c0 如果我们不知道某个提交记录的哈希值(固然可以通过git log看到提交记录的哈希值),但是可以很直观的看到它的相对位置呢?这就须要学习到几个特别符号啦~
2、相对引用 ~ 和 ^
相对引用不同于通过哈希值的方式举行指向改变,它可以通过当前位置举行相对移动。
[*] 利用 ^ 向上移动 1 个提交记录
[*] 利用 ~N 向上移动 N 个提交记录
https://i-blog.csdnimg.cn/direct/cf9ced9434ad4d93984014bc45919e5c.png
向上移动一个提交记录
git checkout HEAD^ https://i-blog.csdnimg.cn/direct/e278bb91ffd14c76b44d4d166d6b7f41.png
再向上移动2个提交记录
git checkout HEAD~2 https://i-blog.csdnimg.cn/direct/e5f78dc640aa437d8b06bd086e21b7ac.png
3、撤销提交
当提交的改动不须要时,要举行回滚的操纵,git也提供了多种方法举行代码的回滚。
git reset
重置当前分支到特定提交(该提交的内容不会被重置),会更改历史提交记录,实用于未提交到远程版本库的修改。
// 首先需要知道要回滚到具体提交记录的哈希值(当然也可以使用相对引用)
git reset c2
// 相对引用法,两者效果相同
git reset HEAD~2 https://i-blog.csdnimg.cn/direct/a5f06906ff1a424d800ab543e19a550c.png
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 https://i-blog.csdnimg.cn/direct/8b131f89bec0438f9bbcdee1f6d42212.png
4、自由修改提交树
git cherry-pick
如果想要复制一些提交记录到当前地点位置(HEAD)下的话,可以利用git cherry-pick命令,被选中的提交记录会依次被添加到当前位置的背面。
// 需要知道提交记录的哈希值
git cherry-pick c2 c4 修改前
https://i-blog.csdnimg.cn/direct/f66ee5a1e4a04d86a2384dc751b52029.png
修改后:
https://i-blog.csdnimg.cn/direct/2cd5560881af4159874b5dd086c2b5e8.png
git rebase -i
交互式 git rebase用法,可以通过相对引用的方式修改提交记录, 再利用这个命令后会出现一个文本编辑,通过改变每个提交前的pick选择来改变改记录的保留大概是否和其他记录归并
git rebase -i HEAD~3 https://i-blog.csdnimg.cn/direct/b0276c12c47f48169a61b97697c5336b.png
输入命令后进入到下面的文本编辑页面
将feat 15移除的话,须要将Feat: 15 前的pick改为drop即可
修改完成后输入 :wq 即可退出编辑
完成操纵后的效果如下:
https://i-blog.csdnimg.cn/direct/5c77266c6cf44c87954fa48f2c173d56.png
else case
case: 举行reset、revert等操纵时,操纵失误导致须要的记录丢失,怎么找回?
可以通过git reflog 检察历史操纵记录,然后找到回归丢失前的哈希值,然后通过git reset 将丢失的记录找回。
git reset <需要恢复的哈希值>
强烈推荐 Learn Git Branching
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]